Supposons que je me suis connecté à un ordinateur distant via SSH. À partir d'un programme sur cet ordinateur distant, je dois exécuter une commande sur mon ordinateur local (l'initiateur de la connexion).
Ce qui soulève la question: est-il possible de tirer parti de 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 une intervention de l'utilisateur. J'espérais pouvoir automatiser complètement ou au moins détecter l'utilisateur/le nom d'hôte de l'utilisateur connecté.
J'ai parfois un besoin similaire, tant que je me connecte via PuTTY à notre serveur VPN et, de là, via SSH à un autre hôte, ce qui n'est pas directement accessible pour moi en raison de la configuration du VPN.
Parfois, je dois juste vérifier rapidement quelque chose sur un serveur VPN, tout en maintenant ma "session ssh" en marche. Une approche consiste à exécuter une session ssh sous screen
, ce qui, comme je l’ai remarqué, ajoute un peu de retard par rapport à "ssh normal". Une autre approche, que je voudrais partager ici, est la suivante:
Sous session SSH, appuyez sur Enter, puis ~(assurez-vous que ce n’est pas affiché, 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 obtiendrez un résultat similaire à:
[root@client170 ~]# ~^Z [suspend ssh]
[1]+ Stopped ssh [email protected]
[root@vps291736 ~]#
Maintenant, vous êtes sur l'hôte, pouvez faire ce que vous voulez (même si je ne suis pas sûr de la durée de la session ssh), puis revenez à la session SSH en exécutant fg
.
Au moins, cela fonctionne pour moi alors que je suis connecté depuis un poste de travail Win10 via PuTTY sur une machine virtuelle CentOS, puis depuis cette VM connexion via SSH à un autre hôte.
J'espère que ça aide quelqu'un!
La réponse de @ 62mkv est une bien meilleure solution. Utiliser ça.
Par souci d'exhaustivité et de curiosité, toutefois, si un serveur ssh s'exécute 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 au serveur local sur le port 22. Exemple de commande:
ssh -R20202:localhost:22 [email protected]
Cela va démarrer une connexion SSH, mais également configurer un tunnel vers le serveur SSH s'exécutant sur votre ordinateur. 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 plusieurs fois. Cela ajoute également un peu de latence, car tout ce que vous exécutez sur votre ordinateur local est renvoyé via l'hôte distant.
Des informations supplémentaires sur ssh tunneling pour ceux dont la curiosité n’a pas encore été satisfaite peuvent être trouvées en réponse à cette question unix stackexchange .
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 un ordinateur local et utilisez le code ci-dessus chaque fois que vous souhaitez exécuter des commandes sur un ordinateur distant. C’est l’une des méthodes que j’utilise généralement en automatisation.
Si votre ordinateur local et votre ordinateur distant sont tous deux accessibles à partir d'Internet, vous pouvez simplement ouvrir une session SSH à partir de votre ordinateur local sur l'ordinateur distant, puis 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 des tâches, jetez un œil à Fabric (connaissances requises 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')
Non, vous ne pouvez pas entrer dans la session existante.
Votre application aurait besoin d'un moyen de se reconnecter au client. SSH fonctionnerait si un client SSH était en cours d'exécution sur le client et que ce dernier pouvait atteindre le port 22 du 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.
Vous trouverez des informations sur la configuration de l’authentification par clé à l’adresse suivante: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/ =
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 sur 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 :)