Tại sao quá trình thay thế <() không hoạt động với ssh -F


11

Tôi có một số máy ảo mơ hồ. Để đăng nhập vào chúng, tôi đưa ra vagrant sshlệnh. Tôi muốn đăng nhập vào chúng bằng sshlệnh thông thường . Đầu vagrant ssh-configra tệp cấu hình phù hợp

$ 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

Khi xuất cấu hình này trong một tệp và sử dụng với ssh -F, mọi thứ đều hoạt động tốt:

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

Khi sử dụng toán tử thay thế quy trình <(cmd)để ngăn chặn việc tạo tệp cấu hình tạm thời, nó không thành công:

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

Lỗi tương tự xảy ra khi sử dụng <(cat /tmp/config)

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

Tôi đang sử dụng zsh và tôi quan sát hành vi tương tự với bash. Tôi làm gì sai ở đây?


2
Có vẻ như ssh đang đóng tất cả các mô tả tập tin bất ngờ.
ctrl-alt-delor

Câu trả lời:


10

Lệnh:

ssh -F <(vagrant ssh-config) default

chạy vagrantlệnh trong một quy trình riêng biệt với thiết bị xuất chuẩn được kết nối với đường ống. Đầu kia của ống được kết nối dưới dạng mô tả tệp n(trong trường hợp của bạn là 11) với một quy trình mới chạy sshvà trình bao chạy:

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

Bây giờ, nó chỉ hoạt động nếu sshkhông đóng mô tả tệp khi khởi động.

Thật không may, nó không.

Nếu sử dụng zsh, một giải pháp thay thế là sử dụng =(...)hình thức thay thế quy trình trong đó thay vì sử dụng đường ống và /proc/self/fd, nó sử dụng tệp tạm thời.

Hoặc bạn có thể sử dụng một mô tả tập tin sshkhông đóng. Ví dụ: nếu bạn không cho ăn bất cứ thứ gì ssh(nếu lệnh từ xa không đọc bất cứ thứ gì từ stdin), bạn có thể sử dụng fd0, ví dụ:

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

Tuyệt vời. Với =(...)nó hoạt động như một bùa mê và tập tin tạm thời sẽ tự động bị xóa khi sshphiên kết thúc. Các biến thể với /dev/stdinkết nối thành công nhưng thoát ra ngay lập tức.
cbliard

1
@cbliard, vâng, nếu lệnh bạn chạy ở đầu bên kia là một vỏ tương tác, nó sẽ đọc từ stdin của nó (hiện là đường ống đã được sử dụng để mơ hồ) xem eof và thoát. Đó là lý do tại sao tôi nói nếu bạn không cho ăn bất cứ thứ gìssh .
Stéphane Chazelas

Ok, tôi không hiểu ý bạn là gì nếu bạn không cho ăn gìssh . Bây giờ thì rõ ràng.
cbliard

Điều này có còn đúng không? Tôi đang sử dụng thành công: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)để nối 2 tệp cấu hình lại với nhau khi chạy SSH. Và trên ZSH, tôi có thể làm điều này : ssh -F <(vagrant ssh-config) default.
CMCDragonkai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.