TL; DR
สิ่งต่าง ๆ มีความซับซ้อนขึ้นเล็กน้อยเมื่อคุณมีเซิร์ฟเวอร์ป้อมปราการที่ต้องใช้งาน
คุณสามารถส่งผ่านssh
คำสั่งที่ssh
ชอบ:
cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
ระวังเทอร์มินัลหลอก
โปรดทราบว่าจุดสำคัญที่สำคัญที่นี่คือssh
เช่นเดียวกับเครื่องมือส่วนใหญ่เพียงปฏิบัติstdout
และstdin
แก้ไขตามค่าเริ่มต้น
อย่างไรก็ตามเมื่อคุณเริ่มที่จะเห็นตัวเลือกที่ชอบDisable pseudo-terminal allocation.
และForce pseudo-terminal allocation.
คุณอาจต้องทำการทดลองและข้อผิดพลาดเล็กน้อย แต่ตามกฎทั่วไปคุณไม่ต้องการเปลี่ยนtty
พฤติกรรมยกเว้นว่าคุณกำลังพยายามแก้ไขขยะที่อ่านไม่ออก / ไบนารีในเครื่องจำลองเทอร์มินัล
ตัวอย่างเช่นฉันมักจะใช้-At
เพื่อให้ ssh-agent ของเวิร์กสเตชันของฉันได้รับการส่งต่อและเพื่อให้การเรียกใช้ tmux จากระยะไกลไม่ได้ barf binary (เช่นนั้นssh -At bastion.internal tmux -L bruno attach
) และสำหรับนักเทียบท่าด้วยเช่นsudo docker exec -it jenkins bash
กัน
อย่างไรก็ตาม-t
ค่าสถานะสองค่านี้ทำให้ยากต่อการติดตามความเสียหายของข้อมูลเมื่อฉันพยายามทำสิ่งนี้:
# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'
# note trailing slashes to make this oneliner more readable.