Exécuter une commande sur l'ordinateur local à partir d'un hôte SSH distant connecté?


13

Disons que je me suis connecté à un ordinateur distant via SSH. À partir d'un programme sur cet ordinateur distant, j'ai besoin d'exécuter une commande sur mon ordinateur local (l'initiateur de connexion).

Ce qui soulève la question: est-il possible de sangsue sur la connexion existante entre les deux ordinateurs pour exécuter une commande sur l'ordinateur local?

J'ai envisagé d'exécuter la commande ssh user@host-of-connecting-party <command> sur l'ordinateur distant pour établir une connexion inversée. Mais cela est plus difficile à automatiser et nécessitera l'intervention de l'utilisateur. J'espérais pouvoir l'automatiser complètement, ou au moins détecter l'utilisateur / nom d'hôte de l'utilisateur connecté.


Il est clair ce que vous voulez faire. Ce qui n'est pas clair pour moi, c'est la partie où vous dites "j'espérais pouvoir l'automatiser complètement, ou au moins détecter l'utilisateur / le nom d'hôte de l'utilisateur connecté." Que voulez-vous dire?
hytromo

«plus difficile à automatiser et nécessitera l'intervention de l'utilisateur» est également synonyme de «sécuriser» dans ce cas. Si un hôte distant était capable d'exécuter des commandes sur des clients qui s'y connectaient, ce serait très peu sûr ... imaginez qu'un serveur soit compromis et que quiconque s'y connecte infecte simplement sa machine locale ... ce serait amusant :)
Sergey

Réponses:


5

J'ai parfois un besoin similaire, tant que je me connecte via Putty à notre serveur VPN et à partir de là via ssh vers un autre hôte, ce qui n'est pas accessible pour moi directement en raison de la configuration VPN.

Parfois, j'ai juste besoin de vérifier rapidement quelque chose sur une machine serveur VPN, tout en ayant ma "ssh-session" en cours d'exécution. Une approche consiste à exécuter une session ssh sous screen, qui, comme je l'ai remarqué, ajoute un peu de retard par rapport à "ssh ordinaire". Une autre approche, que j'aimerais partager ici, est la suivante:

En session SSH, appuyez sur Enter, puis ~, (assurez-vous qu'il ne s'affiche pas, c'est-à-dire que vous êtes en mode commande), puis Ctrl- Z. Cela mettra le processus client ssh sur un "hôte" en arrière-plan, et vous aurez quelque chose comme:

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

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

Maintenant que vous êtes sur "l'hôte", vous pouvez faire ce que vous voulez (bien que je ne sais pas combien de temps la session ssh sera maintenue en vie), puis revenir à la session SSH en exécutant fg .

Au moins, cela fonctionne pour moi lorsque je suis connecté à partir d'un poste de travail Win10 via Putty sur une machine virtuelle CentOS, et à partir de cette machine virtuelle, connectez-vous via SSH à un autre hôte.

J'espère que cela aide quelqu'un!


2
Si vous avez PermitLocalCommand yesdans votre .ssh/configun hôte, vous pouvez aussi le faire <Enter>~C, alors !<command>.
muru

5

La réponse de @ 62mkv est une bien meilleure solution. Utiliser ça.

Par souci d'exhaustivité et de curiosité cependant, si vous avez un serveur ssh en cours d'exécution sur votre machine locale, vous pouvez créer un tunnel ssh pour autoriser les connexions ssh de l'hôte distant sur le port 20202 vers le local sur le port 22. Exemple de commande:

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

Cela va démarrer une connexion ssh, mais également configurer un tunnel vers le serveur ssh exécuté sur votre machine. Ensuite, vous pouvez le faire, lorsque ssh'ed dans l'hôte distant:

ssh -p 20202 localuser@localhost

Bien sûr, cela peut rapidement devenir déroutant - surtout si la technique est imbriquée plus d'une fois. Cela ajoute également un peu de latence - car tout ce que vous exécutez sur votre machine locale est renvoyé via l'hôte distant.

Des informations supplémentaires sur le tunneling ssh pour ceux dont la curiosité n'est pas encore satisfaite peuvent être trouvées en réponse à cette question d'échange de pile unix .


Ceci est une excellente réponse. Exactement ce dont j'avais besoin pour pouvoir faire ssh sur une machine distante qui était derrière un pare-feu et qui était accessible via teamniewer uniquement. Je me suis simplement connecté via teamviewer puis de la session teamviewer à ma machine créant le tunnel ssh et ensuite j'ai pu ouvrir autant de session ssh de mon ordinateur à distance que je le souhaitais.
Marian

En effet, c'est un bien meilleur cas d'utilisation pour un tunnel comme celui-ci @Marian. Je le fais moi-même.
starbeamrainbowlabs

0

Si votre ordinateur local et distant sont accessibles à partir d'Internet, vous pouvez simplement ouvrir une session SSH à partir de votre ordinateur local sur l'ordinateur distant, puis dans cette session, ouvrir une autre session ssh à partir de l'ordinateur distant sur l'ordinateur 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>

Pour automatiser les choses, jetez un œil à Fabric (connaissances Python requises)

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

Vous pouvez utiliser sshpass pour vous connecter à l'ordinateur distant et exécuter les commandes.

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

Utilisez un script shell simple sur l'ordinateur local et utilisez le code ci-dessus chaque fois que vous souhaitez exécuter des commandes sur un ordinateur distant. C'est l'un des moyens que j'utilise généralement dans l'automatisation.


0

Non, vous ne pouvez pas pénétrer dans la session existante.

Votre application aurait besoin d'un moyen de se reconnecter au client. SSH fonctionnerait si le client avait un serveur SSH en cours d'exécution et que le serveur pouvait atteindre le port 22 sur le client. Il ne serait pas difficile d'automatiser si vous utilisiez l'authentification par clé au lieu de l'authentification par mot de passe - de cette façon, l'intervention de l'utilisateur ne serait pas nécessaire.

Des informations sur la configuration de l'authentification basée sur les clés sont disponibles ici: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/


0

Si vous avez accès à un autre terminal, vous pouvez envoyer SIGSTOP en utilisant "kill -19 PID" à la commande ssh qui a initié la connexion. Vous obtiendrez alors le contrôle du terminal sur le terminal de la machine cliente. Une fois que vous avez terminé, vous pouvez restaurer la connexion ssh en tapant simplement fg pour réveiller le client ssh.

Mais bien sûr, la question est la suivante: si vous avez déjà un terminal sur la machine client, pourquoi le feriez-vous :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.