Ich habe einige vagabundierende virtuelle Maschinen. Um mich anzumelden, gebe ich den vagrant ssh
Befehl aus. Ich möchte mich mit einem regulären ssh
Befehl bei ihnen anmelden . Das vagrant ssh-config
gibt die passende Konfigurationsdatei aus
$ 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
Wenn Sie diese Konfiguration in einer Datei ausgeben und mit verwenden ssh -F
, funktioniert alles einwandfrei :
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Wenn Sie den Prozessersetzungsoperator verwenden <(cmd)
, um die Erstellung der temporären Konfigurationsdatei zu verhindern, schlägt Folgendes fehl:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Der gleiche Fehler tritt bei der Verwendung auf <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Ich benutze zsh und beobachte das gleiche Verhalten mit bash. Was mache ich hier falsch?
bash
ssh
zsh
file-descriptors
process-substitution
cbliard
quelle
quelle
Antworten:
Der Befehl:
führt den
vagrant
Befehl in einem separaten Prozess aus, wobei sein Standardout mit einer Pipe verbunden ist. Das andere Ende der Pipe ist als Dateideskriptorn
(in Ihrem Fall 11) mit einem neuen Prozess verbunden, der ausgeführt wirdssh
und die Shell wird ausgeführt:Das funktioniert nur, wenn
ssh
die Dateideskriptoren beim Start nicht geschlossen werden.Leider schon.
Bei Verwendung
zsh
besteht eine Alternative darin, die=(...)
Form der Prozessersetzung zu verwenden, bei der anstelle eines Rohrs und/proc/self/fd
eine temporäre Datei verwendet wird.Oder Sie können einen Dateideskriptor verwenden,
ssh
der nicht geschlossen wird. Wenn Sie beispielsweise nichts fütternssh
(wenn der Remote-Befehl nichts von stdin liest), können Siefd
0 verwenden, z.quelle
=(...)
funktioniert es wie ein Zauber und die temporäre Datei wird automatisch entfernt, wenn diessh
Sitzung endet. Die Variante mit/dev/stdin
verbindet sich erfolgreich, wird aber sofort beendet.ssh
.ssh
. Es ist jetzt klar.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
um 2 Konfigurationsdateien zusammenzuführen, wenn SSH ausgeführt wird. Und auf ZSH kann ich das tun :ssh -F <(vagrant ssh-config) default
.