Saya punya beberapa mesin virtual gelandangan. Untuk masuk ke mereka saya mengeluarkan vagrant ssh
perintah. Saya ingin masuk ke mereka menggunakan ssh
perintah biasa . The vagrant ssh-config
output yang sesuai file konfigurasi
$ 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
Saat mengeluarkan konfigurasi ini dalam file dan digunakan dengan ssh -F
, semuanya berfungsi dengan baik:
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Saat menggunakan operator substitusi proses <(cmd)
untuk mencegah pembuatan file konfigurasi sementara, gagal:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Kesalahan yang sama terjadi saat menggunakan <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Saya menggunakan zsh dan saya mengamati perilaku yang sama dengan bash. Apa yang saya lakukan salah di sini?
bash
ssh
zsh
file-descriptors
process-substitution
cbliard
sumber
sumber
Jawaban:
Perintah:
menjalankan
vagrant
perintah dalam proses terpisah dengan stdout-nya terhubung ke sebuah pipa. Ujung pipa yang terhubung sebagai file descriptorn
(dalam kasus Anda itu 11) ke proses baru yang berjalanssh
dan shell berjalan:Sekarang, itu hanya berfungsi jika
ssh
tidak menutup deskriptor file pada saat startup.Sayangnya, itu terjadi.
Jika menggunakan
zsh
, alternatifnya adalah menggunakan=(...)
bentuk substitusi proses di mana alih-alih menggunakan pipa dan/proc/self/fd
, itu menggunakan file temp.Atau Anda dapat menggunakan deskriptor file yang
ssh
tidak ditutup. Misalnya, jika Anda tidakssh
memasukkan sesuatu ke (jika perintah jarak jauh tidak membaca apa pun dari stdin) Anda dapat menggunakanfd
0, misalnya:sumber
=(...)
itu berfungsi seperti pesona dan file sementara secara otomatis dihapus ketikassh
sesi berakhir. Varian dengan/dev/stdin
koneksi berhasil tetapi segera keluar.ssh
.ssh
. Sekarang sudah jelas.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
untuk menggabungkan 2 file konfigurasi bersama ketika menjalankan SSH. Dan pada zsh, aku bisa melakukan ini:ssh -F <(vagrant ssh-config) default
.berdasarkan @cbliard
Ini bekerja:
sumber
=( )
? Saya tidak terbiasa dengan itu.