Respostas:
Na sua máquina local, você pode criar um túnel SSH através do host intermediário para o host final:
ssh user@intermediate -L 2000:final:22 -N
Isso abrirá a porta 2000 no seu host local que se conectará diretamente ao servidor final na porta 22, fazendo o tunelamento através do host intermediário. Agora, em outro prompt, conecte-se ao sftp na porta 2000 para ser encapsulado no servidor final, observando que o usuário especificado aqui é para o host final:
sftp -P 2000 user@localhost
Parece que isso pertence a superuser.com ou serverfault.com .
Você pode usar a opção ProxyCommand do SFTP para encapsular uma conexão SFTP de forma transparente em uma conexão SSH (um pouco semelhante à resposta do WhiteFang34, mas sobre o stdin & stdout da conexão SSH, em vez de uma porta TCP local encaminhada):
sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
(Supondo que o host intermediário tenha o netcat instalado como / usr / bin / nc - caso contrário, talvez seja necessário encontrar / instalar alguma maneira equivalente de gateway stdin & stdout em uma sessão TCP).
O que é realmente interessante nessa opção é que você pode adicioná-la ao seu arquivo ~ / .ssh / config, o que a torna transparente:
Host finalhost
ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
Com essa entrada, você pode usar sftp, scp e ssh para o finalhost, e ele invocará automaticamente o túnel. A única parte não transparente é que ele solicitará duas senhas (host intermediário seguido por host final), mas se você quiser, também pode eliminá-lo com pares de chaves SSH ...
exec
necessário? (Ele funciona muito bem aqui sem essa parte.)
Você pode canalizar dados para o processo ssh em execução na sua máquina e, em seguida, executar um comando na máquina intermediária que lê stdin e os envia ao sftp conforme apropriado.
Isso pode ser feito em um oneliner na sua máquina local, embora a citação de argumentos para ssh exija cuidado. Agora estou no meu telefone e, infelizmente, não é possível digitar os detalhes. Talvez alguém possa completar esta resposta como um exercício!
Estou assumindo que o host final está protegido por firewall e só posso adivinhar os métodos que você pode usar para contorná-lo.
Por exemplo - exponha o ssh da sua máquina local, depois o ssh para o primeiro host, depois o ssh para o segundo e o sftp do host final para a sua máquina.
digamos que A e B são o primeiro e o segundo hosts. E o arquivo a ser copiado é foo
Em vez de sftp, você pode usar o seguinte
gato foo | ssh Um "gato -> foo"
Agora, você pode encadear 2 delas juntas
gato foo | ssh Um "gato - | ssh B \" gato -> foo ""