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?
É 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.
/var/log/secure
e/var/log/auth.log
conexõ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 somehost
sem nenhum comando fornecido, oussh -t
), isso é (normalmente) efetuado loginwtmp
, independentemente de como o terminal apareceu (sshd, qualquer método usado para estabelecer a conexão, aplicativo emulador de terminal, ...).ControlPersist 600
um 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.)-S
(especificar soquete) e-M
(criar conexão principal) do cliente SSH.É 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:
Digite o comando forward local para abrir um túnel ssh:
Onde
targethost
está 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
ssh
cliente em sua máquina escuta a porta 22000 e encaminhará qualquer tráfego enviado a ela para a porta 22001targethost
.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:
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
targethost
instância do shell.3. Envie seu script pelo túnel
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.
fonte
~
personagem deve vir após uma nova linha, portantoLF ~ C
é provavelmente uma sequência melhor.less
, o pager padrão comum, suporta pesquisas que podem economizar algumas rolagens se você souber suas palavras-chave: basta digitarman ssh
/ESCAPE
e você está lá.