Devo sftp para um servidor intermediário?

11

Não consigo sftp diretamente em um host específico. Para mover um arquivo da minha máquina doméstica para o host, devo enviar um arquivo sftp para um host intermediário; ssh no host intermediário; e sftp o arquivo para o destino final. É possível evitar tanta loucura?

user74094
fonte

Respostas:

28

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 .

WhiteFang34
fonte
Obrigado, vou tentar isso; e você está certo, é o fórum errado; Desculpe.
Depois de fornecer a senha do usuário @ localhost, recebi a mensagem: Mensagem recebida muito longa 1131376238
user74094
14

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 ...

Gordon Davisson
fonte
Obrigado Gordon. Leva ambas as senhas, em seguida, pára com a mensagem: Recebido Mensagem muito longa 1131376238
user74094
Parece que algo na conexão - talvez um script de login em um dos hosts, talvez nc - esteja escrevendo algum texto extra na conexão que está confundindo o sftp (consulte esta FAQ em snailbook.com ). 1131376238 é a codificação decimal dos caracteres ascii "Conn", portanto, provavelmente é uma mensagem como "Conectando a ..." "Conectado a partir de ..." ou talvez "Falha na conexão". Experimente com ssh em vez de sftp, veja se a mensagem é impressa visivelmente e talvez você possa dizer de onde vem.
Gordon Davisson 29/03
ssh funcionou bem. Também devo mencionar que sou frequentemente confrontado com esta pergunta: A autenticidade do host 'xxxxx (<sem hostip para comando proxy>)' não pode ser estabelecida. A impressão digital da chave RSA é 37: 40: d4: c7: etc. Tem certeza de que deseja continuar a conexão (sim / não)? Sim
user74094
Gordon, muito útil! Estou adicionando isso ao meu arquivo de texto da linha de comando fu oneliners. Muito obrigado!
Travis Leleu 15/05
É execnecessário? (Ele funciona muito bem aqui sem essa parte.)
equaeghe
3

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!

jl6
fonte
0

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.


fonte
0

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 ""


fonte
Eu gosto, então eu tentei. Ele pegou a senha de A e produziu a mensagem: Falha na verificação da chave do host.
user74094