Eu tenho algumas máquinas virtuais vagantes. Para entrar neles, emito o vagrant ssh
comando. Eu quero entrar neles usando o ssh
comando regular . O vagrant ssh-config
gera o arquivo de configuração adequada
$ 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
Ao enviar esta configuração em um arquivo e usar com ssh -F
, tudo funciona bem:
$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully
Ao usar o operador de substituição de processo <(cmd)
para impedir a criação do arquivo de configuração temporário, ele falha:
$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory
O mesmo erro ocorre ao usar <(cat /tmp/config)
$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory
Estou usando o zsh e observo o mesmo comportamento com o bash. O que eu estou fazendo errado aqui?
bash
ssh
zsh
file-descriptors
process-substitution
cbliard
fonte
fonte
Respostas:
O comando:
executa o
vagrant
comando em um processo separado com seu stdout conectado a um pipe. A outra extremidade do canal é conectada como descritor de arquivon
(no seu caso, é 11) a um novo processo que é executadossh
e o shell é executado:Agora, isso só funciona se
ssh
não fechar seus descritores de arquivo na inicialização.Infelizmente sim.
Se estiver usando
zsh
, uma alternativa é usar a=(...)
forma de substituição de processo em que, em vez de usar um pipe/proc/self/fd
, ele usa um arquivo temporário.Ou você pode usar um descritor de arquivo que
ssh
não fecha. Por exemplo, se você não estiver alimentando nadassh
(se o comando remoto não estiver lendo nada do stdin), poderá usarfd
0, por exemplo:fonte
=(...)
isso funciona como um encanto e o arquivo temporário é removido automaticamente quando assh
sessão termina. A variante com se/dev/stdin
conecta com êxito, mas sai imediatamente.ssh
.ssh
. Agora está claro.ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)
para unir 2 arquivos de configuração ao executar o SSH. E no ZSH, eu posso fazer isso:ssh -F <(vagrant ssh-config) default
.