Pergunta

Não é realmente uma questão de programação, mas relevantes para muitos programadores ...

Vamos dizer que eu tenho abriu uma sessão SSH para outro computador.

remoto: html avalys $ ls
welcome.msg index.html readme.txt
remoto: html avalys $

Existe algum comando que eu posso escrever no meu shell remoto que vai transferir imediatamente um dos arquivos no diretório atual (por exemplo welcome.msg) para o meu computador local, ou seja.

remoto: html avalys $ stransfer welcome.msg
Buscando /home/avalys/html/welcome.msg para welcome.msg
/home/avalys/html/welcome.msg 100% 23KB 23.3KB / s 00:00
remoto: html avalys $

A única maneira que eu conheço para fazer isso é abrir uma sessão de SFTP paralelo e CD para o meu diretório atual na sessão SSH, que é uma verdadeira PITA ao administrar um servidor remotamente.

EDIT: Estou ciente da possibilidade de utilizar uma ligação sftp / scp reversa, mas que envolve mais de digitação. Seria ótimo se eu pudesse digitar apenas o nome de algum comando (por exemplo, "stransfer") eo arquivo (s) Pedir transferido, e tê-lo funcionar.

Foi útil?

Solução

Você pode configurar como uma conexão de transferência invertido w / ssh -Rport:127.0.0.1:22 user@host for scp back.

Use scp user@host:port para acessá-lo.

Outras dicas

Em pesquisando esse eu encontrei um programa que funciona como um substituto para o cliente OpenSSH, zssh.

sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz

funciona como um encanto.

Aqui está a minha solução preferida para este problema [conforme indicado em um questão duplicado Perguntei]. Configurar um túnel ssh inverso ao criar a sessão de ssh. Esta é facilitada pela função de dois bash: grabfrom () precisa ser definido na máquina local, enquanto grab () deve ser definido no host remoto. Você pode adicionar quaisquer outras variáveis ??ssh que você usa (por exemplo, -X ou -Y), como você vê o ajuste.

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };

Uso:

localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>

Positivos:

  • Ele funciona sem software especial em qualquer hospedeiro além OpenSSH
  • Ele funciona quando host local está atrás de um roteador NAT
  • Pode ser implementado como um par de dois função bash-line

Negativos:

  • Ele usa um número de porta fixo assim:
    • não vai funcionar com múltiplas conexões para host remoto
    • conflito força com um processo usando essa porta no host remoto
  • Ela exige localhost aceitar conexões ssh
  • É preciso um comando especial sobre o início da sessão
  • Não lidar implicitamente autenticação para o localhost
  • Não permite que se especifique o diretório de destino em localhost
  • Se você pegar a partir de múltiplas LocalHosts para o mesmo host remoto, o ssh irá não como as teclas em mudança

O trabalho futuro: Este ainda é bastante kludgy. Obviamente, seria possível lidar com o problema de autenticação através da criação de chaves SSH adequada e é ainda mais fácil para permitir a especificação de um diretório remoto, adicionando um parâmetro para agarrar ()

Mais difícil é lidar com os outros negativos. Seria bom para pegar uma porta dinâmica, mas tanto quanto eu posso dizer não há nenhuma maneira elegante de passar essa porta para o shell no host remoto; O melhor que eu posso dizer, OpenSSH não permite que você para definir variáveis ??de ambiente arbitrários no host remoto eo bash não pode ter variáveis ??de ambiente a partir de um argumento de linha de comando. Mesmo se você pudesse escolher uma porta dinâmica, não há nenhuma maneira de garantir que ele não é usado no host remoto sem ligar primeiro.

Você pode montar uma conexão ssh com sshfs. Dessa forma, você pode transferir arquivos dentro da mesma conexão ssh, enquanto usando qualquer ssh cliente você mais gosta. Você pode até configurá-lo para montagem automática, se quiser.

Se você estiver em remendar as coisas (que IMHO não deve ser corrigidas), dê uma olhada em ssh-xfer

Você poderia escrever um script chamado stransfer que levaria um argumento filename, então seria lançar o nome do arquivo no comando scp, assumindo que o servidor eo caminho para arquivos no servidor não mudam.

Ou se o arquivo é sempre o mesmo, você pode criar um alias em seu ~ / .bashrc.

apelido getwelcome = 'scp avalys @ remotehost:. /Home/avalys/html/welcome.msg'

Eu tive o mesmo pensamento que Paul Tomblin escreveu em um comentário para a questão. sessões de terminal antigos costumava usar x, y, e z protocolos de modem e ferramentas (sz e rz para o z-modem variantes) para alcançar algo como isto. Estou não tenho certeza se estes irão trabalhar em uma sessão ssh, mas pode valer a pena uma tentativa.

Fink fornece um pacote lrzsz com estes ferramenta no Mac OS X.

Fazendo isso wiki comunidade porque eu me sentiria mal para conseguir rep após Paul chegou lá primeiro ...

Na escola se eu estou transferindo um arquivo de um sistema linux para outro, eu costumo remoto usando ssh e use o scp para transferir o arquivo da parte de trás do sistema remoto para o meu computador. Não tenho certeza se é isso que você está procurando ou se isso é ainda aplicável no seu caso, mas que normalmente é a minha maneira de contornar ter que abrir outra janela de terminal.

Só para esclarecer se o seu não está familiarizado com scp você ainda teria que especificar a localização do que você gostaria de colocar o arquivo no seu computador, mas para mim de qualquer maneira este é geralmente uma coisa mais fácil de lembrar do que o local do arquivo no computador remoto. Aqui está um link que pode ser útil: http://www.computerhope.com/unix/scp htm

https://superuser.com/questions/259481/reverse-scp-over-ssh -connection

sftp server
get file.txt

Aparentemente, você também pode navegar em torno de n coisas no console sftp, e get toma um caminho de arquivo completo. Copia para o diretório do qual você executou sftp.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top