Perché la sostituzione del processo <() non funziona con ssh -F


11

Ho alcune macchine virtuali vagabonde. Per accedervi, lancio il vagrant sshcomando. Voglio accedere ad essi usando il sshcomando regolare . Il vagrant ssh-configemette il file di configurazione adatta

$ 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

Quando si genera questa configurazione in un file e si utilizza con ssh -F, tutto funziona correttamente :

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

Quando si utilizza l'operatore di sostituzione del processo <(cmd)per impedire la creazione del file di configurazione temporaneo, non riesce:

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

Lo stesso errore si verifica durante l'utilizzo <(cat /tmp/config)

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

Sto usando zsh e osservo lo stesso comportamento con bash. Cosa sto facendo di sbagliato qui?


2
Sembra che ssh stia chiudendo tutti i descrittori di file imprevisti.
ctrl-alt-delor

Risposte:


10

Il comando:

ssh -F <(vagrant ssh-config) default

esegue il vagrantcomando in un processo separato con il suo stdout collegato a una pipe. L'altra estremità della pipe è connessa come descrittore di file n(nel tuo caso è 11) a un nuovo processo che viene eseguito sshe la shell viene eseguita:

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

Ora, funziona solo se sshnon chiude i descrittori di file all'avvio.

Sfortunatamente, lo fa.

Se si utilizza zsh, un'alternativa è utilizzare la =(...)forma di sostituzione del processo dove invece di utilizzare una pipe e /proc/self/fd, utilizza un file temporaneo.

Oppure potresti usare un descrittore di file che sshnon si chiude. Ad esempio, se non stai fornendo nulla a ssh(se il comando remoto non sta leggendo nulla da stdin) potresti usare fd0, ad esempio:

vagrant ssh-config | ssh -F /dev/stdin -n default

1
Meraviglioso. Con =(...)esso funziona come un fascino e il file temporaneo viene rimosso automaticamente quando il sshtermine della sessione. La variante con si /dev/stdincollega correttamente ma esce immediatamente.
cbliard,

1
@cbliard, sì, se il comando che esegui sull'altra estremità è una shell interattiva, leggerà dal suo stdin (che ora è il pipe usato per vagabondare), vedi eof ed esce. Ecco perché stavo dicendo se non stai dando da mangiare a nullassh .
Stéphane Chazelas,

Ok, non ho capito cosa volevi dire se non stai dando da mangiare a nullassh . Adesso è chiaro
cbliard,

È ancora vero? Sto usando con successo: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)per unire 2 file di configurazione insieme quando eseguo SSH. E su ZSH, posso fare questo: ssh -F <(vagrant ssh-config) default.
CMCDragonkai,

1

basato su @cbliard

Questo funziona:

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

Grazie! Puoi chiarire cosa =( )fa? Non ne ho familiarità.
cbliard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.