Executar um comando no computador local a partir de um host SSH remoto conectado?

13

Digamos que eu conectei a um computador remoto via SSH. Em um programa neste computador remoto, preciso executar um comando no meu computador local (o iniciador da conexão).

O que levanta a questão: é possível usar a conexão existente entre os dois computadores para executar um comando no computador local?

Eu considerei executar o comando ssh user@host-of-connecting-party <command>no computador remoto para estabelecer uma conexão reversa. Mas isso é mais difícil de automatizar e exigirá intervenção do usuário. Eu esperava poder automatizá-lo totalmente, ou pelo menos detectar o usuário / nome do host do usuário conectado.

Aeyoun
fonte
Está claro o que você quer fazer. O que não está claro para mim é a parte em que você diz "Eu esperava poder automatizá-lo completamente ou, pelo menos, detectar o usuário / nome do host do usuário conectado". O que você quer dizer?
Hytromo
"mais difícil de automatizar e exigirá intervenção do usuário" é sinônimo de "seguro" neste caso. Se um host remoto fosse capaz de executar comandos nos clientes que se conectam a ele, isso seria altamente inseguro ... imagine que um servidor foi comprometido e qualquer pessoa que se conectar a ele apenas infectou sua máquina local ... isso seria divertido :)
Sergey

Respostas:

5

Às vezes, estou com uma necessidade semelhante, desde que eu conecte através do Putty ao nosso servidor VPN e, a partir daí, através do ssh para algum outro host, o que não é acessível diretamente para mim devido à configuração da VPN.

Às vezes, só preciso verificar rapidamente algo em uma máquina servidor VPN, enquanto ainda estou executando minha "sessão ssh". Uma abordagem é executar uma sessão ssh em screenque, como observei, adiciona algum atraso em comparação com o "ssh regular". Outra abordagem, que eu gostaria de compartilhar aqui, é a seguinte:

Enquanto estiver na sessão SSH, pressione e Enter, em seguida ~, (verifique se não é exibido, ou seja, você está no modo de comando) e, em seguida Ctrl- Z. Isso colocará o processo do cliente ssh em um "host" em segundo plano, e você terá algo como:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh [email protected]
[root@vps291736 ~]#

Agora você está no "host", pode fazer o que quiser (embora não tenha certeza de quanto tempo a sessão ssh será mantida ativa) e, em seguida, retorne à sessão SSH executando fg.

Pelo menos, isso funciona para mim enquanto estou conectado a partir de uma estação de trabalho Win10 via Putty em uma VM baseada no CentOS e a partir dessa VM conectar-se através do SSH a algum outro host.

Espero que ajude alguém!

62mkv
fonte
2
Se você tem PermitLocalCommand yesno seu .ssh/configpara um host, você também pode fazê <Enter>~C-lo !<command>.
Muru
5

A resposta do @ 62mkv é uma solução muito melhor. Use isso.

Para completar e curiosidade, se você tiver um servidor ssh em execução na máquina local, poderá criar um túnel ssh para permitir conexões ssh do host remoto na porta 20202 de volta ao local na porta 22. Comando de exemplo:

ssh -R20202:localhost:22 [email protected]

Isso iniciará uma conexão ssh, mas também configurará um túnel para o servidor ssh em execução na sua máquina. Então você pode fazer isso quando transferido para o host remoto:

ssh -p 20202 localuser@localhost

Obviamente, isso pode ficar rapidamente confuso - especialmente se a técnica for aninhada mais de uma vez. Também adiciona um pouco de latência - já que tudo que você executa na sua máquina local é devolvido através do host remoto.

Informações adicionais sobre o tunelamento ssh para aqueles cuja curiosidade ainda não foi satisfeita podem ser encontradas em resposta a esta pergunta unex stackexchange .

starbeamrainbowlabs
fonte
Esta é uma excelente resposta. Exatamente o que eu precisava para poder fazer o ssh em uma máquina remota que estava atrás de um firewall e acessível apenas pelo teamniewer. Eu simplesmente me conectei pelo teamviewer e depois da sessão do teamviewer de volta à minha máquina, criando o túnel ssh e, em seguida, pude abrir quantas sessões ssh do meu computador para o remoto, conforme necessário.
Marian
Na verdade, esse é um caso de uso muito melhor para um túnel como este @Marian. Eu mesmo faço isso.
starbeamrainbowlabs
0

Se o computador local e o computador remoto estiverem acessíveis na Internet, basta abrir uma sessão SSH do computador local no computador remoto e, nessa sessão, abrir outra sessão ssh do computador remoto no computador local:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Para automatizar coisas, dê uma olhada no Fabric (é necessário conhecimento de Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')
Sergey
fonte
0

Você pode usar o sshpass para conectar-se ao computador remoto e executar os comandos.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Use um script de shell simples no computador local e use o código acima sempre que desejar executar comandos no computador remoto. Essa é uma das maneiras geralmente usadas em automação.

Priyanka
fonte
0

Não, você não pode entrar na sessão existente.

Seu aplicativo precisaria de uma maneira de conectar-se novamente ao cliente. O SSH funcionaria se o cliente tivesse um servidor SSH em execução e o servidor pudesse alcançar a porta 22 no cliente. Não seria difícil automatizar se você usasse autenticação baseada em chave em vez de autenticação por senha - dessa forma, a intervenção do usuário não seria necessária.

Informações sobre como configurar a autenticação baseada em chave podem ser encontradas aqui: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/

Omegamormegil
fonte
0

Se você tiver acesso a outro terminal, poderá enviar o SIGSTOP usando "kill -19 PID" ao comando ssh que iniciou a conexão. Você obterá o controle do terminal no terminal na máquina cliente. Depois de terminar, você pode restaurar a conexão ssh simplesmente digitando fg para ativar o cliente ssh.

Mas é claro que a pergunta aqui é: se você já possui um terminal na máquina cliente, por que faria isso :)

Hedi
fonte