Tengo algunas máquinas virtuales vagabundas. Para iniciar sesión, emito el vagrant ssh
comando. Quiero iniciar sesión en ellos usando el ssh
comando regular . Las vagrant ssh-config
salidas del archivo de configuración adecuado
$ 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
Al generar esta configuración en un archivo y usar con ssh -F
, todo funciona bien:
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Cuando se utiliza el operador de sustitución de procesos <(cmd)
para evitar la creación del archivo de configuración temporal, falla:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
El mismo error ocurre cuando se usa <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Estoy usando zsh y observo el mismo comportamiento con bash. ¿Qué estoy haciendo mal aquí?
bash
ssh
zsh
file-descriptors
process-substitution
cbliard
fuente
fuente
Respuestas:
El comando:
ejecuta el
vagrant
comando en un proceso separado con su stdout conectado a una tubería. El otro extremo de la tubería está conectado como descriptor de archivon
(en su caso, es 11) a un nuevo proceso que se ejecutassh
y se ejecuta el shell:Ahora, eso solo funciona si
ssh
no cierra sus descriptores de archivo al inicio.Lamentablemente lo hace.
Si se usa
zsh
, una alternativa es usar la=(...)
forma de sustitución de proceso donde, en lugar de usar una tubería/proc/self/fd
, utiliza un archivo temporal.O podría usar un descriptor de archivo que
ssh
no se cierre. Por ejemplo, si no está alimentando nadassh
(si el comando remoto no está leyendo nada de stdin), puede usarfd
0, por ejemplo:fuente
=(...)
esto funciona de maravilla y el archivo temporal se elimina automáticamente cuandossh
finaliza la sesión. La variante con se/dev/stdin
conecta con éxito pero sale inmediatamente.ssh
.ssh
. Ahora está claro.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
para unir 2 archivos de configuración al ejecutar SSH. Y en ZSH, puedo hacer esto:ssh -F <(vagrant ssh-config) default
.basado en @cbliard
Esto funciona:
fuente
=( )
hace? No estoy familiarizado con eso.