O problema com a resposta do @jakuje é: ele funciona apenas com soquetes , mas você não pode usar ferramentas UNIX padrão que esperam arquivos com eles:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: Esse dispositivo ou endereço não existe
Também há o problema de o arquivo de soquete local não ser excluído no host remoto; na próxima execução do mesmo comando, você recebe um aviso e o soquete não é recriado corretamente. Você pode dar a opção -o StreamLocalBindUnlink=yes
de ssh
desvincular esse soquete antigo, mas nos meus testes não foi suficiente; você também tem que editar você sshd_config
para conter StreamLocalBindUnlink=yes
para essa opção ao trabalho.
Mas você pode usar socat
ou netcat
qualquer outra ferramenta similar que suporte soquetes locais UNIX ( NÃOnetcat-traditional
é suficiente!) Para usar o encaminhamento de soquete local para transferência de arquivos:
# 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'
Você também pode executar comandos interativos; nesse caso, você deve usar ssh -t
para alocar TTYs.
O problema com esta solução é que você deve codificar os caminhos dos soquetes locais do UNIX: localmente, esse não é um problema que você pode incluir $$
no caminho para torná-lo único por processo ou usuário em um diretório temporário, mas no diretório remoto, é melhor você não usar o diretório gravável em todo o mundo, /tmp/
como eu faço no meu exemplo. O diretório também deve existir quando a ssh
sessão é iniciada. E o inode do soquete permanecerá mesmo após o encerramento da sessão, portanto, usar algo como "$ HOME / .ssh. $$" sobrecarregará seu diretório com inodes inoperantes ao longo do tempo.
Você também pode usar soquetes TCP vinculados localhost
, o que evitará que você sobrecarregue seus sistemas de arquivos com inodes inativos, mas mesmo com eles você ainda terá problemas para escolher um número de porta (exclusivo) não utilizado. Então ainda não é o ideal. ( ssh
possui código para alocar portas dinamicamente, mas não encontrei maneira de recuperar essas informações no host remoto.)
Provavelmente, a solução mais fácil para copiar arquivos é usar a funcionalidade de compartilhamento de conexão interna do ssh e executar um comando scp
ou sfrp
enquanto sua sessão interativa ainda estiver em execução em paralelo. Consulte Copiar um arquivo de volta para o sistema local com ssh .
closefrom(STDERR_FILENO + 1)
chamadas no código-fonte OpenSSH. O que você está tentando fazer e exige isso?