İşlem ikamesi <() neden ssh -F ile çalışmıyor?


11

Bazı vagrant sanal makinelerim var. Onlara giriş yapmak için vagrant sshkomut veriyorum . Düzenli sshkomut kullanarak giriş yapmak istiyorum . vagrant ssh-configUygun yapılandırma dosyası üretir

$ 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

Bu yapılandırmayı bir dosyada verirken ve ile kullanırken ssh -F, her şey iyi çalışır:

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

<(cmd)Geçici yapılandırma dosyasının oluşturulmasını önlemek için işlem ikame operatörünü kullanırken başarısız olur:

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

Aynı hata kullanırken <(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 kullanıyorum ve bash ile aynı davranışı gözlemliyorum. Burada neyi yanlış yapıyorum?


2
Görünüşe göre ssh tüm beklenmeyen dosya tanımlayıcılarını kapatıyor.
ctrl-alt-delor

Yanıtlar:


10

Komuta:

ssh -F <(vagrant ssh-config) default

vagrantkomutu, bir boruya bağlı stdout'u ile ayrı bir işlemde çalıştırır . Borunun diğer ucu, dosya tanımlayıcı olarak n(sizin durumunuzda 11'dir) çalışan sshve kabuk çalışan yeni bir sürece bağlanır :

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

Şimdi, bu sadece sshbaşlangıçta dosya tanımlayıcılarını kapatmazsa çalışır .

Ne yazık ki, öyle.

Kullanılıyorsa zsh, bir alternatif, =(...)bir boru kullanmak yerine /proc/self/fdgeçici bir dosya kullanan işlem ikame biçimini kullanmaktır .

Veya sshkapanmayan bir dosya tanımlayıcı kullanabilirsiniz . Örneğin, bir şey beslemiyorsanız ssh(uzak komut stdin'den bir şey okumuyorsa) fd0 kullanabilirsiniz , örneğin:

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

1
Olağanüstü. Ile =(...)bir cazibe gibi çalışır ve sshoturum sona erdiğinde geçici dosya otomatik olarak kaldırılır . İle varyant /dev/stdinbaşarıyla bağlanır, ancak hemen çıkar.
cbliard

1
@cbliard, evet, diğer uçta çalıştırdığınız komut etkileşimli bir kabuksa, stdin'den (vagrant için şu anda kullanılan boru) okuyacak ve çıkacaktır. Yani dediğim yüzden size bir şey besleyen değilsenizssh .
Stéphane Chazelas

Tamam, eğer bir şeyssh beslemiyorsan ne demek istediğini anlamadım . Şimdi açık.
cbliard

Bu hala doğru mu? Ben başarıyla kullanıyorum: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)SSH çalıştırırken birlikte 2 yapılandırma dosyaları katılmak için. Ve ZSH, ben bunu yapabilirsiniz: ssh -F <(vagrant ssh-config) default.
CMCDragonkai

1

@cbliard tabanlı

Bu çalışıyor:

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

Teşekkürler! Ne yaptığını netleştirebilir misin =( )? Ben aşina değilim.
cbliard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.