Il problema con la risposta di @jakuje è: funziona solo con i socket , ma non è possibile utilizzare strumenti UNIX standard che prevedono file con loro:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: nessun dispositivo o indirizzo
Inoltre c'è il problema che il file socket locale non viene cancellato sull'host remoto; alla successiva esecuzione dello stesso comando, viene visualizzato un avviso e il socket non viene ricreato correttamente. Puoi dare la possibilità -o StreamLocalBindUnlink=yes
di ssh
scollegare quel vecchio socket, ma nei miei test non era abbastanza; devi anche modificarti sshd_config
per contenere StreamLocalBindUnlink=yes
affinché quell'opzione funzioni.
Ma puoi usare socat
o netcat
qualsiasi altro strumento simile che supporti i socket locali UNIX ( NONnetcat-traditional
è abbastanza!) Per utilizzare l'inoltro socket locale per il trasferimento di file:
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
È inoltre possibile eseguire comandi interattivi, nel qual caso è necessario utilizzare ssh -t
per allocare TTY.
Il problema con questa soluzione è che è necessario codificare i percorsi dei socket locali UNIX: a livello locale questo non è un problema tanto è possibile includerlo $$
nel percorso per renderlo univoco per processo o utente una directory temporanea, ma sul è meglio che tu non usi la directory scrivibile dal mondo /tmp/
come nel mio esempio. La directory deve anche esistere già all'avvio della ssh
sessione. E l'inode del socket rimarrà anche dopo la chiusura della sessione, quindi usare qualcosa come "$ HOME / .ssh. $$" ingombrerà la tua directory con inode morti nel tempo.
Potresti anche usare i socket TCP associati localhost
, che ti eviteranno di ingombrare i tuoi file system con inode morti, ma anche con loro devi ancora avere problemi a scegliere un numero di porta (univoco) inutilizzato. Quindi non è ancora l'ideale. ( ssh
ha un codice per allocare dinamicamente le porte, ma non ho trovato alcun modo per recuperare quelle informazioni sull'host remoto.)
Probabilmente la soluzione più semplice per copiare i file è utilizzare la funzionalità di condivisione della connessione integrata di ssh ed eseguire un comando scp
o sfrp
mentre la sessione interattiva è ancora in esecuzione in parallelo. Vedere Copia di un file sul sistema locale con ssh .
closefrom(STDERR_FILENO + 1)
chiamate sotto il codice sorgente OpenSSH. Cosa stai cercando di fare questo richiede questo?