Usando um canal SSH já estabelecido

47

Eu tenho uma conexão ssh já estabelecida entre duas máquinas.

Existe uma maneira de enviar comandos para a máquina remota a partir de um script de shell que é executado na máquina local, usando a conexão já aberta e sem iniciar outra sessão ssh?

    
por SWeko 06.03.2012 / 14:23

2 respostas

53

É muito simples, com versões recentes do OpenSSH, se você planeja com antecedência.

Abra uma conexão mestre pela primeira vez. Para conexões subsequentes, direcione as conexões escravas através da conexão mestre existente. Em seu ~/.ssh/config , configure o compartilhamento de conexão para acontecer automaticamente:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Se você iniciar uma sessão ssh para o mesmo (usuário, porta, máquina) como uma conexão existente, a segunda sessão será encapsulada sobre a primeira. Estabelecer a segunda conexão não requer nova autenticação e é muito rápido.

    
por 06.03.2012 / 16:49
22

Isso é muito fácil de usar usando a ferramenta nc e os túneis ssh.

1. Abra o túnel ssh

Na sua sessão ssh, digite ~ C em uma nova linha. Você receberá o prompt "service console" do ssh, que se parece com isto:

ssh> 

Digite o comando encaminhamento local para abrir um túnel ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Onde targethost é o nome do host ou endereço IP da máquina à qual você está conectado.

Agora, supondo que o servidor ssh na máquina de destino não tenha sido configurado para proibir túneis, você tem o encaminhamento de conexão desejado: ssh client na sua máquina escuta a porta 22000 e encaminhará qualquer tráfego enviado para ele a porta 22001 em targethost .

2. Inicie um servidor de rede na máquina remota

Isto é tão simples quanto entrar em sua sessão ssh já aberta com o seguinte comando:

remote$ nc -l localhost 22001 | sh

Isso iniciará um servidor TCP escutando na porta 22001 - que é a porta alvo do nosso túnel ssh - e roteará os dados recebidos (presumivelmente, comandos shell) para uma instância targethost shell.

3. Envie seu script pelo túnel

local$ cat yourscript.sh | nc localhost 22000

Isso enviará o corpo do script ao seu túnel ssh e será executado em um shell no targethost . Você verá a saída do script no seu terminal com a sessão ssh.

Também observarei que o túnel ssh (etapa 1) neste cenário não é estritamente necessário; Você também pode iniciar o servidor aberto e conectá-lo diretamente pela Internet. No entanto, você precisará usar o encapsulamento se o host de destino não puder ser acessado diretamente (por exemplo, por trás de um NAT) ou se a criptografia ssh for desejada.

    
por 06.03.2012 / 15:39

Tags