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=yesde sshdesvincular esse soquete antigo, mas nos meus testes não foi suficiente; você também tem que editar você sshd_configpara conter StreamLocalBindUnlink=yespara essa opção ao trabalho.
Mas você pode usar socatou netcatqualquer 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 -tpara 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 sshsessã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. ( sshpossui 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 scpou sfrpenquanto 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?