Eseguire un comando sul computer locale da un host SSH remoto collegato?


13

Supponiamo che mi sia collegato a un computer remoto tramite SSH. Da un programma su questo computer remoto, devo eseguire un comando sul mio computer locale (l'iniziatore della connessione).

Ciò solleva la domanda: è possibile accedere alla connessione esistente tra i due computer per eseguire un comando sul computer locale?

Ho considerato di eseguire il comando ssh user@host-of-connecting-party <command>sul computer remoto per stabilire una connessione inversa. Ma questo è più difficile da automatizzare e richiederà l'intervento dell'utente. Speravo di poterlo automatizzare completamente, o almeno di rilevare l'utente / nome host dell'utente connesso.


È chiaro cosa vuoi fare. Ciò che non mi è chiaro è la parte in cui dici "Speravo di poterlo automatizzare completamente, o almeno di rilevare l'utente / nome host dell'utente connesso". Cosa intendi?
hytromo,

"più difficile da automatizzare e richiederà l'intervento dell'utente" è sinonimo di "sicuro" in questo caso. Se un host remoto fosse in grado di eseguire comandi sui client che si connettono ad esso, ciò sarebbe altamente insicuro ... immagina che un server sia stato compromesso e chiunque si colleghi ad esso si infetta solo la macchina locale ... sarebbe divertente :)
Sergey,

Risposte:


5

A volte ho un bisogno simile, purché mi connetta tramite Putty al nostro server VPN e da lì tramite ssh a qualche altro host, che non è raggiungibile per me direttamente a causa della configurazione VPN.

A volte ho solo bisogno di controllare rapidamente qualcosa su una macchina server VPN, pur avendo la mia "sessione ssh" in esecuzione. Un approccio consiste nell'eseguire una sessione ssh screenche, come ho notato, aggiunge un po 'di ritardo rispetto a "ssh normale". Un altro approccio, che vorrei condividere qui, è il seguente:

Durante la sessione SSH, premi Enter, quindi ~, (assicurati che non sia visualizzato, ovvero che tu sia in modalità comando), quindi Ctrl- Z. Questo metterà in background il processo client ssh su un "host", e tu farai qualcosa del genere:

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

[1]+  Stopped                 ssh root@10.0.0.167
[root@vps291736 ~]#

Ora sei su "host", puoi fare quello che vuoi (anche se non sono sicuro per quanto tempo la sessione ssh sarà mantenuta in vita), e poi tornare alla sessione SSH eseguendo fg.

Almeno, questo funziona per me mentre sono connesso da una stazione di lavoro Win10 tramite Putty su una macchina virtuale basata su CentOS e da quella macchina virtuale si connette tramite SSH a qualche altro host.

Spero che aiuti qualcuno!


2
Se avete PermitLocalCommand yesnella vostra .ssh/configper un host, si può anche fare <Enter>~C, allora !<command>.
muru,

5

La risposta di @ 62mkv è una soluzione molto migliore. Usalo.

Per completezza e curiosità, tuttavia, se si dispone di un server SSH in esecuzione sul computer locale, è possibile creare un tunnel SSH per consentire le connessioni SSH dall'host remoto sulla porta 20202 a quello locale sulla porta 22. Esempio di comando:

ssh -R20202:localhost:22 remoteuser@remotehost.com

Questo avvierà una connessione ssh, ma anche ripristinerà un tunnel sul server ssh in esecuzione sul tuo computer. Quindi puoi farlo, quando viene inviato nell'host remoto:

ssh -p 20202 localuser@localhost

Naturalmente, questo può diventare rapidamente confuso, specialmente se la tecnica è nidificata più di una volta. Aggiunge anche un po 'di latenza, poiché tutto ciò che esegui sul tuo computer locale viene rimbalzato attraverso l'host remoto.

Ulteriori informazioni sul tunneling ssh per coloro la cui curiosità non è ancora stata soddisfatta sono reperibili in risposta a questa domanda su unex stackexchange .


Questa è una risposta eccellente Esattamente quello di cui avevo bisogno per essere in grado di fare ssh su una macchina remota che era protetta da un firewall e accessibile solo tramite teamniewer. Mi sono semplicemente connesso tramite teamviewer dalla sessione di teamviewer alla mia macchina creando il tunnel SSH e quindi ho potuto aprire tutte le sessioni SSH dal mio computer al telecomando di cui avevo bisogno.
Marian,

In effetti, questo è un caso d'uso molto migliore per un tunnel come questo @Marian. Lo faccio anch'io.
starbeamrainbowlabs

0

Se sia il tuo computer locale che remoto sono accessibili da Internet, puoi semplicemente aprire una sessione SSH dal tuo computer locale sul computer remoto, quindi in quella sessione aprire un'altra sessione ssh dal computer remoto sul computer locale:

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>

Per automatizzare le cose dai un'occhiata a Fabric (è richiesta la conoscenza di 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')

0

È possibile utilizzare sshpass per connettersi al computer remoto ed eseguire i comandi.

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

Utilizzare un semplice script shell sul computer locale e utilizzare il codice sopra ogni volta che si desidera eseguire comandi sul computer remoto. Questo è uno dei modi in cui generalmente ho usato l'automazione.


0

No, non puoi entrare nella sessione esistente.

La tua applicazione avrebbe bisogno di un modo per riconnettersi al client. SSH funzionerebbe se il client ha un server SSH in esecuzione e il server può raggiungere la porta 22 sul client. Non sarebbe difficile automatizzare se si usasse l'autenticazione basata su chiave anziché l'autenticazione con password, in questo modo l'intervento dell'utente non sarebbe necessario.

Le informazioni sull'impostazione dell'autenticazione basata su chiave sono disponibili qui: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/


0

Se hai accesso a un altro terminale, puoi inviare SIGSTOP usando "kill -19 PID" al comando ssh che ha avviato la connessione. Otterrai quindi il controllo del terminale sul terminale sul computer client. Una volta terminato, puoi ripristinare la connessione ssh semplicemente digitando fg per riattivare il client ssh.

Ma ovviamente la domanda qui è: se hai già un terminale sul computer client perché dovresti farlo :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.