Digamos que eu tenha um terminal aberto em um Mac (ou qualquer caixa unix-ish)
fattie$
Claro que posso fazer isso:
fattie$ scp -i key.pem [email protected]:file.js .
e copiará file.js do meu servidor AWS para o Mac. Tudo bem até agora.
Outro dia, eu faço isso
fattie$ ssh -i key.pem [email protected]
Agora estou em um shell no Mac, mas estou conectado a um shell na máquina aws
ubuntu@ip-111-22-3-444:~$
Tudo certo.
Se eu quiser transferir o arquivo file.js de volta para o Mac, é claro que você pode fazer isso seguindo as linhas de:
ubuntu@ip-111-22-3-444:~$ scp file.js [email protected]
Sem problemas.
Mas.
Já estou "dentro" do Mac, se você entende o que quero dizer.
O shell pai (existe tal conceito?) do shell do ubuntu é de fato o Mac em questão. Estou até no diretório correto que desejo no Mac.
Na verdade, existe alguma maneira de dizer scp - ou algum outro comando? - para copiar de
o shell em que você está (ou seja, o shell aws no exemplo) para
"onde você está localmente", o shell "pai", o Mac no exemplo?
Talvez algo como...
ubuntu@ip-111-22-3-444:~$ cat file.js > "the parent machine"/done.js
ou mesmo apenas
ubuntu@ip-111-22-3-444:~$ cp file.js "the parent machine"
... se você vê o que quero dizer?
Existe uma maneira de chegar ao shell "pai"?
(Eu acho que você poderia exagerar usando nc
, mas teria que configurar o final local primeiro!)
Muitas vezes seria muito conveniente fazer isso.
Sim e não. Os shells (conexões locais e SSH) empilham , mas o shell remoto iniciado via SSH não tem acesso ao cliente em execução localmente. Não há back-túnel para transferência de arquivos (há um para ssh-agent, mas isso é tudo).
Você pode conseguir scp/sftp do servidor remoto de volta para o computador local, mas funcionaria como uma conexão totalmente independente (mais uma nova camada na pilha) – não saberia nada sobre a "pasta atual" em que você estava .
Portanto, como o único método é uma nova conexão SSH, obviamente é necessário que seu computador local tenha um servidor SSH (sshd) em execução para começar. (Felizmente, ao contrário do nc, o sshd só precisa ser configurado uma vez e deixado em execução para sempre.)
Se o seu computador tiver um endereço IP público, o próximo passo é apenas fazer o SSH de volta do sistema Ubuntu para o seu próprio endereço IP (como pode ser encontrado em $SSH_CONNECTION). Se tanto o cliente quanto o servidor tiverem IPv6, isso poderá ser usado.
A maioria dos PCs não tem um endereço IP público, então a alternativa é usar o
-R
recurso de "encaminhamento TCP remoto" do SSH para estabelecer um canal de retorno - observe que, neste caso, ainda é um novo login SSH em seu computador, ainda não não sei nada sobre o shell "pai":Neste exemplo, 12345 é um número de porta aleatório que começará a aceitar conexões no servidor, que serão transportadas para sshd na porta 22 do seu computador local.
Nota: Neste exemplo, a opção -R é especificada antes da conexão, mas se você precisar dela retroativamente, basta abrir uma segunda conexão (desta vez com -R) e o túnel estará disponível globalmente. Não está limitado a esse shell/conexão em particular.
(Como alternativa, as teclas
Enter
~
C
devem exibir um prompt interativo que aceita "-R 123..." como entrada e estabelece o encaminhamento.)Pessoalmente, eu recomendaria apenas SFTP'ing diretamente para a máquina remota. Em seguida, você pode navegar até o arquivo usando 'cd' e 'ls' um tanto regulares e, em seguida, recuperar arquivos usando 'get'.
sftp
O cliente OpenSSH padrão não é ótimo, mas funciona bem; lftp é uma das melhores alternativas.Sim, alguns terminais suportam isso – na verdade, é um recurso que vem do sistema dial-up e dos dias de BBS e é chamado de ZMODEM ou XMODEM .
Para receber um arquivo via ZMODEM, primeiro certifique-se de que o terminal local tenha o recurso de transferência de arquivo ativado (acho que está presente pelo menos no multiplexador GNU Screen, embora muito raramente em terminais modernos), depois execute
sz <file>
no servidor remoto e você deve veja o arquivo pop-up localmente.Parece que alguém também escreveu scripts de integração para Zmodem no iTerm2.
@grawity está correto (e votado) para o problema conforme declarado.
No entanto, se você deseja criar uma instância de servidor SSH em sua máquina local e o servidor SSH de sua máquina local é acessível a partir do host
blah
, você pode usar este comando, que funciona mesmo sem saber qual é o nome de host ou IP de sua máquina local. Você precisa saber o nome de usuário e, possivelmente, o número da porta, se estiver executando o SSH em uma porta não padrão:onde
fattie
está seu nome de usuário no Mac local. Essa linha de comando também assume que você está executandobash
seu shell emblah
.Mas, novamente, como o grawity aponta, você precisaria estar executando o SSH no Mac e, se o seu Mac estiver em uma LAN privada atrás de um firewall, o firewall teria que ser configurado para passar a porta TCP 22 de entrada para o seu Mac. Este comando é apenas um atalho para executar a cópia sem que você precise saber qual é o seu IP público ou ter algum tipo de DNS dinâmico instalado.