Transferindo arquivos via ssh mas sem scp ou sftp

4

Eu preciso transferir arquivos via ssh , mas infelizmente scp e sftp não são viáveis, já que o host que estou conectando é apenas um nó "door" que está me redirecionando para uma máquina diferente disponível apenas em uma rede de supercomputação privada à qual ela está conectada (e, portanto, está me pedindo a senha duas vezes). Por esse motivo, não posso executar nenhum comando no nó da porta.

Gostaria de saber se posso transferir arquivos usando alguma ferramenta que usa o fluxo de saída (terminal) da conexão ssh.

A única alternativa seria produzir os arquivos em algum formato útil, como base64, copiando-os para a área de transferência e decodificando-os localmente (e vice-versa).

Estou começando a ficar frustrado usando o vim remotamente. O que eu quero alcançar é um sistema rsync-like no qual eu edito o código fonte do meu programa localmente e depois testo remotamente, mas como você pode ver, não é tão fácil assim.

Eu posso não ser o único que teve esse problema, então eu acho que deve existir uma ferramenta que tenha esse objetivo? (Uma solução com o FUSE seria a melhor, mas sei que isso pode estar pedindo demais).

    
por fstab 17.03.2016 / 22:00

3 respostas

4

Eu não queria deixar isso como uma resposta, mas a seção de comentários está ficando maior e você receberá uma notificação do SE para levar a conversa para uma janela de bate-papo.

Então, pressione enter algumas vezes e digite ~? no spaces. não há nada.

você deve ver algo assim (ou exatamente assim)

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

neste momento digite ~C e você deverá ver ssh> prompt. Neste momento digite

ssh> !scp /path/to/some/file/on/your/local/machine user@remoteserver

desde que você já esteja autenticado, ele deve transferir o arquivo pela conexão existente.

    
por 17.03.2016 / 23:21
3

Dependendo de quanto você deseja automatizar as coisas, expect é uma opção para retransmitir dados através do host bastion e para sistemas internos, "digitando" coisas na sessão SSH como um humano faria, só que mais rápido:

#!/usr/bin/env expect

if {[llength $argv] == 0} {
  puts stderr "Usage: $argv0 bastion internalhost localfile"
  exit 1
}

set basthost [lindex $argv 0]
set desthost [lindex $argv 1]
set fileup   [lindex $argv 2]

spawn ssh -a -e none -o ClearAllForwardings=yes -x $basthost

# TODO login foo here for bastion host, e.g. send the password
# if see that prompt

expect {
  # TODO handle timeout, eof, etc.

  # TODO I have no idea what your ncurses interface looks
  # like, though there's doubtless something that could
  # be matched and the appropriate input sent to it...
  -ex "$ " {
    send -- "ssh $desthost\r"
    # TODO handle subsequent login to the internal host here
  }
}

Então, depois de ter um editor ou o que estiver aberto no host de destino (por meio das instruções send apropriadas), forneça dados para ele por meio de:

set upfd [open $fileup]
while {[gets $upfd line] >= 0} {
  send -- "$line\r"
}

E, em seguida, use mais send chamadas para salvar o arquivo, sair etc. Também, tratamento de erros, etc.

    
por 18.03.2016 / 00:44
1

A primeira coisa é a configuração, onde você configura seu host para passar pela "porta" ou pelo jumpbox. Você ~/.ssh/config parecerá assim:

Host door
  Hostname door.example.com
  User username_on_door
  # ...
Host target
  Hostname tagret.example.com
  User user_on_target
  # ...
  ProxyCommand ssh -W %h:%p door

Em seguida, você pode se conectar com um comando diretamente ao seu sistema de destino: ssh target

Depois, você também pode transferir arquivos com um único comando:

ssh taget "tar czpf - /some/important/data" | tar xzpf - -C /new/root/directory
tar cpf - /some/important/data | ssh target "tar xpf - -C /some/directory/" 

ou inicie sshfs nesse host:

sshfs target:/dir/ /mnt/target

Não é muito complicado, não é?

    
por 18.03.2016 / 08:10