Por que o processo de substituição () não funciona com ssh -F?

11

Eu tenho algumas máquinas virtuais vagabundas. Para entrar neles eu emito o comando vagrant ssh . Eu quero fazer o log-in usando o comando regular ssh . O vagrant ssh-config gera o arquivo de configuração adequado

$ 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 gerar essa 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 falhará:

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

O mesmo erro acontece 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 estou fazendo errado aqui?

    
por cbliard 20.11.2013 / 11:50

1 resposta

10

O comando:

ssh -F <(vagrant ssh-config) default

executa o comando vagrant em um processo separado com seu stdout conectado a um pipe. A outra extremidade do pipe está conectada como descritor de arquivo n (no seu caso, é 11) para um novo processo que executa ssh e o shell é executado:

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

Agora, isso só funciona se ssh não fechar seus descritores de arquivo na inicialização.

Infelizmente, isso acontece.

Se estiver usando zsh , uma alternativa é usar a forma =(...) da substituição do processo em que, em vez de usar um canal e /proc/self/fd , ele usa um arquivo temporário.

Ou você pode usar um descritor de arquivo que ssh não feche. Por exemplo, se você não estiver alimentando nada com ssh (se o comando remoto não estiver lendo nada de stdin), você poderá usar fd 0, por exemplo:

vagrant ssh-config | ssh -F /dev/stdin -n default
    
por 20.11.2013 / 12:45