ทำไมการทดแทนกระบวนการ <() ไม่ทำงานกับ ssh -F


11

ฉันมีบางเครื่องเสมือนจรจัด เพื่อเข้าสู่พวกเขาฉันออกvagrant sshคำสั่ง ฉันต้องการเข้าสู่ระบบโดยใช้sshคำสั่งปกติ vagrant ssh-configออกผลลัพธ์เป็นไฟล์ config ที่เหมาะสม

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/cbliard/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

เมื่อส่งออกการกำหนดค่านี้ในไฟล์และใช้กับssh -Fทุกอย่างทำงานได้ดี:

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

เมื่อใช้ตัวดำเนินการทดแทนกระบวนการ<(cmd)เพื่อป้องกันการสร้างไฟล์กำหนดค่าชั่วคราวมันจะล้มเหลว:

$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory

ข้อผิดพลาดเดียวกันเกิดขึ้นเมื่อใช้ <(cat /tmp/config)

$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory

ฉันกำลังใช้ zsh และฉันสังเกตเห็นพฤติกรรมเดียวกันกับทุบตี ฉันทำอะไรผิดที่นี่


2
ดูเหมือนว่า ssh กำลังปิดตัวอธิบายไฟล์ที่ไม่คาดคิดทั้งหมด
ctrl-alt-delor

คำตอบ:


10

คำสั่ง:

ssh -F <(vagrant ssh-config) default

รันvagrantคำสั่งในกระบวนการแยกโดยที่ stdout เชื่อมต่อกับไพพ์ ปลายอีกด้านของไปป์เชื่อมต่อกันเป็น file descriptor n(ในกรณีของคุณคือ 11) กับกระบวนการใหม่ที่รันsshและเชลล์รัน:

ssh -F /proc/self/fd/n default

ตอนนี้ใช้งานได้หากsshไม่ได้ปิดตัวให้คำอธิบายไฟล์เมื่อเริ่มต้น

น่าเสียดายที่มันทำ

หากใช้zshตัวเลือกอื่นคือใช้=(...)รูปแบบของการทดแทนกระบวนการแทนการใช้ไพพ์และ/proc/self/fdมันใช้ไฟล์ temp

หรือคุณสามารถใช้ file descriptor ที่sshไม่ปิด ตัวอย่างเช่นหากคุณไม่ได้ให้อาหารอะไรssh(หากคำสั่งระยะไกลไม่ได้อ่านอะไรจาก stdin) คุณสามารถใช้fd0 เช่น:

vagrant ssh-config | ssh -F /dev/stdin -n default

1
ยอดเยี่ยม ด้วย=(...)มันทำงานเหมือนมีเสน่ห์และไฟล์ชั่วคราวจะถูกลบโดยอัตโนมัติเมื่อsshสิ้นสุดเซสชั่น ตัวแปรที่มีการ/dev/stdinเชื่อมต่อสำเร็จ แต่ออกทันที
cbliard

1
@cbliard ใช่ถ้าคำสั่งที่คุณเรียกใช้ที่ปลายอีกด้านเป็นเชลล์แบบโต้ตอบมันจะอ่านจาก stdin (ซึ่งตอนนี้ใช้ไพพ์ไปจนถึงคนจรจัด) ดู eof และ exit นั่นเป็นเหตุผลที่ผมบอกว่าถ้าคุณไม่ได้ให้อาหารอะไรที่จะ ssh
Stéphane Chazelas

ตกลงผมไม่เข้าใจสิ่งที่คุณหมายด้วยถ้าคุณไม่ได้ให้อาหารอะไรที่จะ sshตอนนี้มันชัดเจนแล้ว
cbliard

สิ่งนี้ยังคงเป็นจริงหรือไม่? ฉันใช้เรียบร้อยแล้ว: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)เพื่อเข้าร่วม 2 ไฟล์ config ด้วยกันเมื่อใช้งาน SSH และใน ZSH ssh -F <(vagrant ssh-config) defaultผมสามารถทำเช่นนี้:
CMCDragonkai

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.