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.