J'ai quelques machines virtuelles vagabondes. Pour me connecter, j'émets la vagrant ssh
commande. Je veux me connecter en utilisant la ssh
commande régulière . Les vagrant ssh-config
sorties le fichier de configuration approprié
$ 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
Lors de la sortie de cette configuration dans un fichier et de l'utilisation avec ssh -F
, tout fonctionne correctement:
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Lorsque vous utilisez l'opérateur de substitution de processus <(cmd)
pour empêcher la création du fichier de configuration temporaire, il échoue:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
La même erreur se produit lors de l'utilisation <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
J'utilise zsh et j'observe le même comportement avec bash. Qu'est-ce que je fais mal ici?
Réponses:
La commande:
exécute la
vagrant
commande dans un processus distinct avec sa sortie standard connectée à un tuyau. L'autre extrémité du canal est connectée en tant que descripteur de fichiern
(dans votre cas, c'est 11) à un nouveau processus qui s'exécutessh
et le shell s'exécute:Maintenant, cela ne fonctionne que si
ssh
ne ferme pas ses descripteurs de fichiers au démarrage.Malheureusement, c'est le cas.
Si vous utilisez
zsh
, une alternative consiste à utiliser la=(...)
forme de substitution de processus où au lieu d'utiliser un canal et/proc/self/fd
, il utilise un fichier temporaire.Ou vous pouvez utiliser un descripteur de fichier qui
ssh
ne se ferme pas. Par exemple, si vous n'alimentez rienssh
(si la commande à distance ne lit rien depuis stdin), vous pouvez utiliserfd
0, par exemple:la source
=(...)
cela fonctionne comme un charme et le fichier temporaire est automatiquement supprimé à lassh
fin de la session. La variante avec se/dev/stdin
connecte avec succès mais se ferme immédiatement.ssh
.ssh
. C'est maintenant clair.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
pour joindre 2 fichiers de configuration ensemble lors de l'exécution de SSH. Et ZSH, je peux le faire:ssh -F <(vagrant ssh-config) default
.basé sur @cbliard
Cela marche:
la source
=( )
fait? Je ne le connais pas.