Se eu estiver conectado a um sistema via SSH, existe uma maneira de copiar um arquivo de volta para o meu sistema local sem iniciar outra sessão de terminal ou tela e fazer scp ou algo semelhante ou sem fazer SSH do sistema remoto de volta ao sistema local?
É mais fácil se você planejar com antecedência.
Abra uma conexão principal pela primeira vez. Para conexões subseqüentes, roteie as conexões escravas através da conexão principal existente. Na tua ~/.ssh/config
, configure o compartilhamento de conexão para que ocorra automaticamente:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Se você iniciar uma sessão ssh da mesma maneira (usuário, porta, máquina) que uma conexão existente, a segunda sessão será encapsulada na primeira. O estabelecimento da segunda conexão não requer nova autenticação e é muito rápido.
Portanto, enquanto você tem sua conexão ativa, pode rapidamente:
scp
ou rsync
;Em uma conexão existente, você pode estabelecer um túnel ssh reverso. Na linha de comando ssh, crie um encaminhamento remoto passando -R 22042:localhost:22
onde 22042 é um número escolhido aleatoriamente que é diferente de qualquer outro número de porta na máquina remota. Então ssh -p 22042 localhost
na máquina remota conecta você de volta à máquina de origem; você pode usar scp -P 22042 foo localhost:
para copiar arquivos.
Você pode automatizar isso ainda mais com RemoteForward 22042 localhost:22
. O problema é que, se você se conectar ao mesmo computador com várias instâncias do ssh, ou se alguém estiver usando a porta, não receberá o encaminhamento.
Se você não tiver ativado o encaminhamento remoto desde o início, poderá fazê-lo em uma sessão ssh existente. Tipo Enter ~C
Enter -R 22042:localhost:22
Enter. Consulte "Caracteres de escape" no manual para obter mais informações.
Há também algumas informações interessantes em este thread de falha do servidor .
Se o arquivo for pequeno, você pode digitá-lo e copiar e colar da saída do terminal. Se o arquivo contiver caracteres não imprimíveis, use uma codificação como base64 .
remote.example.net $ base64 <meuarquivo (copia a saída)
local.example.net $ base64 -d> myfile (cole o conteúdo da área de transferência) Ctrl+D
Mais convenientemente, se você tiver o encaminhamento X ativo, copie o arquivo na máquina remota e cole-o localmente. Você pode canalizar e entrar dados de xclip
ou xsel
. Se você deseja preservar o nome do arquivo e os metadados, copie e cole um arquivo morto.
remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -
Outra maneira fácil (IMO) seria:
# to remote Host
cat localfile.conf | ssh [email protected] 'cat -> /tmp/remotefile.conf'
# from remote Host
ssh [email protected] 'cat /tmp/remotefile.conf' > /tmp/localfile.conf
Ou, se você preferir algo semelhante a uma GUI, tente Midnight Commander . Eles chamam o recurso Shell-Link. A maioria das distros os possui em seus sistemas de pacotes como mc
.
O SSH suporta alguns comandos, por meio do caractere de escape (~
por padrão):
$ ~?
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.)
$ ~C
ssh> help
Commands:
-L[bind_address:]port:Host:hostport Request local forward
-R[bind_address:]port:Host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KR[bind_address:]port Cancel remote forward
!args Execute local command
O !args
parece estar mais próximo do que você deseja. Observe que você precisará ter PermitLocalCommand
ativado em seu /etc/ssh_config
_ em ordem para o ~C
comandos para funcionar (consulte man ssh_config
).
Você pode reutilizar a mesma sessão ssh se configurar um ControlMaster
em ssh_config
. Se você fizer isto:
$ ~C
ssh> !scp file [email protected]:
você tecnicamente nunca saiu da sessão ssh e não precisa se autenticar novamente. Provavelmente mais complicado do que você gostaria, mas não consigo pensar em outra maneira fácil.
Todos esses são métodos muito complicados.
Você pode montar o sistema de arquivos remoto em sua máquina local com sshfs
:
mkdir -p /mnt/sshfs
[email protected]:~# sshfs 192.168.1.2:/ /mnt/sshfs
[email protected]:~# umount /mnt/sshfs
Em seguida, você pode copiar e colar o arquivo com nautilus, gnome, konqueror, dolphin, bash ou qualquer outra coisa.
-R
, para remoto para local) ou encaminhar (-L
, para portas local-remota) executarem transferências de arquivos, supondo que você tenha algum daemon de transferência de arquivos ouvindo do outro lado.Mas nada disso é realmente necessário, IMO. O protocolo SSH suporta múltiplos canais em uma única conexão, e o cliente OpenSSH suporta multiplexação. Supondo que você tenha ControlMaster
e ControlPath
configurado (ControlPersist
também é útil),
# primeira conexão $ ssh remote # multiplexará na mesma conexão que o ssh original abriu $ sftp remote
Uma abordagem ainda mais simples: abra o Filezilla (ou seu navegador FTP favorito), abra uma conexão ssh no mesmo site, encontre o arquivo e arraste-o para a estrutura de arquivos local. Se você é novo no Filezilla, use o recurso "gerenciador de sites" para se reconectar rapidamente da próxima vez.
Sim, eu sei que isso é óbvio para a maioria de vocês (e não exatamente), mas alguns (como eu) que encontraram esse thread em busca de uma solução apenas para terminal podem ter esquecido o óbvio.
O que eu achei ser a melhor e mais eficiente solução é usar xclip-copyfile
e xclip-pastefile
.
No servidor, você usa xclip-copyfile
para copiar um ou mais arquivos. Esses arquivos estão disponíveis no servidor local. Lá, você pode usar xclip-pastefile
.
Isso ignora a necessidade de usar scp
ou ter um servidor ssh local. Eu uso isso com o cygwin, por exemplo. O único problema é que isso requer a instalação de xclip
se você ainda não o possui. Ah, e isso funciona com arquivos binários também.
Uma das muitas razões pelas quais usamos SecureCRT - apesar de preferirmos o software de código aberto onde for prático - é a facilidade de fazer transferências de arquivos. Simplesmente não há substituição direta no mundo do F/OSS.
O SecureCRT começou como um programa puro do Windows em meados da década de 1990, mas foi portado para o Mac OS X e Linux há alguns anos .
O SecureCRT possui três recursos principais para a transferência de arquivos de e para um sistema no qual o SSH está inserido:
ZModem , YModem , XModem , Kermit e ASCII - SecureCRT é um tipo de emulador de terminal antigo, suportando vários protocolos de transferência de arquivos em banda.
O mais fácil de usar é o ZModem. Quando você digita algo como sz file-to-download
na linha de comando remota, o programa remoto sz
grava um sequência de escape que informa ao SecureCRT para iniciar o download imediatamente file-to-download
para o diretório de download padrão.
Um toque agradável é que o diretório de download é personalizável por sessão. Usamos isso para ter diretórios por site em nosso servidor de arquivos do escritório principal, para que não tenhamos que ordenar manualmente os arquivos baixados.
(sz
é o programa "send ZModem", parte do pacote lrzsz
. Ele já está empacotado para a maioria dos sistemas Unixy. Se por algum motivo seu sistema remoto não já o tem instalado e você não pode instalar facilmente um pacote binário, o pacote de origem é pequeno e altamente portátil. Mais de uma vez, tive que enviar um lrzsz
"sharchive " ou uuencode
'tarball para um sistema remoto despojado, para que eu pudesse arquivar arquivos do ZModem.)
[~ # ~] sftp [~ # ~] - O SecureCRT tem uma implementação SFTP básica firmemente integrada.
Por "totalmente integrado", quero dizer que, quando você fornece o comando de menu SFTP ou o atalho de teclado, ele abre uma nova guia conectada ao site remoto pela mesma conexão SSH. Portanto, você não precisa fazer login novamente, e a conexão é estabelecida um pouco mais rápido do que se você tivesse aberto uma conexão SFTP separada para o mesmo servidor.
Eu caracterizo o recurso SFTP como "básico", porque o VanDyke Software possui um produto de transferência de arquivo separado, SecureFX . É mais funcional que o cliente SFTP embutido e também se integra ao SecureCRT.
O recurso SFTP do SecureCRT permite configurar diretórios remotos e locais padrão que são separados da configuração do ZModem.
Esse recurso SFTP possui um tipo básico de interface de linha de comando, imitando o programa sftp
do OpenSSH, exceto que possui recursos como Tab conclusão do comando. Assim, recuperando um arquivo remoto chamado somefile.tar.gz
pode ser tão fácil quanto get so
TabEnter.
Arrastar e soltar - Se você arrastar e soltar um arquivo na janela do terminal, ele automaticamente digitará rz
para você e começa a enviar o arquivo.
Como alternativa, você pode abrir uma guia SFTP e soltar um arquivo nessa guia para enviá-lo via SFTP. Portanto, enviar um arquivo para um sistema remoto pode ser tão simples quanto Alt-P, arraste, solte.
Nós descobrimos que as transferências acontecem muito mais rapidamente via SFTP, provavelmente porque é um protocolo baseado em TCP, por isso se beneficia das grandes janelas deslizantes dos modernos pilhas TCP/IP . O ZModem foi desenvolvido nos dias em que um tamanho de bloco de 64 kiB era considerado "grande". Assim, grande parte da velocidade potencial de um link é absorvida no ZModem enquanto cada extremidade aguarda as confirmações de transferência de bloco.
Uma coisa interessante sobre o modo de operação de arrastar e soltar é que ele elimina uma das tensões do uso do ZModem. Quando você digita rz
no sistema remoto, o SecureCRT exibe um seletor de arquivos automaticamente. Você tem cerca de um minuto para encontrar e selecionar o arquivo antes que o tempo do controle remoto se esgote. Isso cria uma vibração de corrida contra o relógio que não é agradável. Arrastar e soltar permite que você encontre o arquivo à vontade e inicie a transferência com um único movimento rápido do mouse.
Ainda usamos o método manual, iniciando a transferência com um comando explícito rz
. Isso ocorre porque o SecureCRT permite configurar um diretório de upload por sessão, que apontamos para a pasta no servidor de arquivos que sempre contém a versão mais recente do software que esse site remoto específico está executando. Para essas transferências, não há corrida contra o relógio, pois o seletor de arquivos é aberto no local correto para começar.
Usar "!" para converter o arquivo em uma representação ASCII do seu arquivo (por exemplo, ! uuencode myfile.bin >uuencode.dat
). Então use ! cat uuencode.dat >target.dat
. Depois disso, use o uudecode no lado do destino: ! uudecode target.dat >myfile.bin