Usando um canal SSH já estabelecido

50

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

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

SWeko
fonte

Respostas:

56

É muito simples com versões suficientes do OpenSSH, se você planeja 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. No seu ~/.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.

Gilles 'SO- parar de ser mau'
fonte
Parece que o segundo não será registrado em / var / log / secure ou /var/log/auth.log. No entanto, o segundo será registrado em / var / log / wtmp?
SOUser
@XichenLi /var/log/securee /var/log/auth.logconexões SSH de log; uma conexão escrava não aparece lá porque faz o retrocesso em uma conexão existente. Se a sua sessão ssh alocar um terminal (ou seja, ssh somehostsem nenhum comando fornecido, ou ssh -t), isso é (normalmente) efetuado login wtmp, independentemente de como o terminal apareceu (sshd, qualquer método usado para estabelecer a conexão, aplicativo emulador de terminal, ...).
Gilles 'SO- stop be evil'
2
Você também pode usar ControlPersist 600um atraso em segundos do soquete ocioso antes de ser excluído automaticamente. Caso contrário, ele será encerrado automaticamente quando a conexão principal terminar. Isso não é bom para a execução de uma série de comandos remotamente (por exemplo, uma série de comandos rsync para pastas diferentes.)
2
Se você não deseja editar a configuração global, também pode usar as opções -S(especificar soquete) e -M(criar conexão principal) do cliente SSH.
yankee
22

É muito fácil conseguir isso usando a ferramenta nc e os túneis ssh.

1. Abra o túnel ssh

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

ssh> 

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

ssh> -L22000:targethost:22001
Forwarding port.

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

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

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

Isso é tão simples quanto entrar na sua sessão ssh já aberta, com o seguinte comando:

remote$ nc -l localhost 22001 | sh

Isso iniciará um servidor TCP atendendo na porta 22001 - que é a porta de destino do nosso túnel ssh - e encaminhará os dados recebidos (presumivelmente, comandos do shell) para uma targethostinstância do shell.

3. Envie seu script pelo túnel

local$ cat yourscript.sh | nc localhost 22000

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


Também observarei que o túnel ssh (etapa 1.) nesse cenário não é estritamente necessário; você também pode abrir o servidor e conectar-se a ele diretamente pela Internet. No entanto, você precisará usar o túnel se o host de destino não puder ser acessado diretamente (por exemplo, estiver atrás de um NAT) ou se a criptografia ssh for desejada.

ulidtko
fonte
3
Ótima resposta. Tecnicamente, para chegar ao console de serviço, o ~personagem deve vir após uma nova linha, portanto LF ~ Cé provavelmente uma sequência melhor.
Alexs
@Alexios, correto.
11136 ulidtko
Truque incrível! Para registro, a página de manual do ssh mostra mais algumas informações sobre ele (role a seção "ESCAPE CHARACTERS")
Carles Sala
O @CarlesSala também é bom saber que less, o pager padrão comum, suporta pesquisas que podem economizar algumas rolagens se você souber suas palavras-chave: basta digitar man ssh /ESCAPEe você está lá.
18115 ulidtko em 18/02
@ulidtko certeza, mas, tanto quanto eu sei, não se pode ligar um comando CLI em um comentário SO, então eu encontrei a página de manual html uma opção melhor ;-)
Carles Sala