Einen Befehl auf einem lokalen Computer von einem verbundenen Remote-SSH-Host aus ausführen?

13

Angenommen, ich habe über SSH eine Verbindung zu einem Remotecomputer hergestellt. In einem Programm auf diesem Remotecomputer muss auf meinem lokalen Computer (dem Verbindungsinitiator) ein Befehl ausgeführt werden.

Was die Frage aufwirft: Ist es möglich, auf die bestehende Verbindung zwischen den beiden Computern zuzugreifen, um einen Befehl auf dem lokalen Computer auszuführen?

Ich habe überlegt, den Befehl ssh user@host-of-connecting-party <command>auf dem Remotecomputer auszuführen, um eine umgekehrte Verbindung herzustellen. Dies ist jedoch schwieriger zu automatisieren und erfordert Benutzereingriffe. Ich hatte gehofft, ich könnte es vollständig automatisieren oder zumindest den Benutzer / Hostnamen des verbundenen Benutzers erkennen.

Aeyoun
quelle
Es ist klar, was Sie tun möchten. Was mir nicht klar ist, ist der Teil, in dem Sie sagen: "Ich hatte gehofft, dass ich es vollständig automatisieren oder zumindest den Benutzer / Hostnamen des verbundenen Benutzers erkennen kann." Was meinen Sie?
Hytromo
"schwerer zu automatisieren und erfordert Benutzereingriff" ist in diesem Fall auch "sicher". Wenn ein Remote-Host Befehle auf Clients ausführen könnte, die eine Verbindung zu ihm herstellen, wäre dies höchst unsicher. Stellen Sie sich vor, ein Server wurde kompromittiert und jeder, der eine Verbindung zu ihm herstellt, infiziert nur seinen lokalen Computer. Das wäre lustig :)
Sergey

Antworten:

5

Ich habe manchmal einen ähnlichen Bedarf, solange ich über Putty eine Verbindung zu unserem VPN-Server und von dort über ssh zu einem anderen Host herstelle, der für mich aufgrund der VPN-Einrichtung nicht direkt erreichbar ist.

Manchmal muss ich nur schnell etwas auf einem VPN-Server überprüfen, während meine "ssh-session" noch läuft. Ein Ansatz besteht darin, eine SSH-Sitzung unter auszuführen screen, bei der, wie ich bemerkt habe, im Vergleich zu "normalem SSH" eine gewisse Verzögerung auftritt. Ein anderer Ansatz, den ich hier teilen möchte, ist der folgende:

Drücken Sie während der SSH-Sitzung, Enterdann ~, (stellen Sie sicher, dass es nicht angezeigt wird, dh Sie befinden sich in einem Befehlsmodus), dann Ctrl- Z. Dadurch wird der ssh-Client-Prozess auf einem "Host" in den Hintergrund gestellt, und Sie haben folgende Möglichkeiten:

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

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

Jetzt sind Sie auf dem "Host", können tun, was Sie wollen (obwohl ich nicht sicher bin, wie lange die SSH-Sitzung am Leben bleibt), und kehren dann zur SSH-Sitzung zurück, indem Sie sie ausführen fg.

Zumindest funktioniert dies für mich, während ich von einer Win10-Workstation über Putty auf einer CentOS-basierten VM verbunden bin und von dieser VM über SSH eine Verbindung zu einem anderen Host herstelle.

Hoffe es hilft jemandem!

62 mkv
quelle
2
Wenn Sie für einen Gastgeber PermitLocalCommand yesin Ihrer haben .ssh/config, können Sie das auch tun <Enter>~C, dann !<command>.
Muru
5

@ 62mkvs Antwort ist eine viel bessere Lösung. Verwende das.

Der Vollständigkeit halber und der Neugier halber können Sie, wenn auf Ihrem lokalen Computer ein SSH-Server ausgeführt wird, einen SSH-Tunnel erstellen, um SSH-Verbindungen vom Remote-Host auf Port 20202 zurück zum lokalen auf Port 22 zuzulassen. Beispielbefehl:

ssh -R20202:localhost:22 [email protected]

Dadurch wird eine SSH-Verbindung hergestellt, es wird jedoch auch ein Tunnel zum auf Ihrem Computer ausgeführten SSH-Server eingerichtet. Dann können Sie dies tun, wenn Sie in den Remote-Host ssh'ed:

ssh -p 20202 localuser@localhost

Dies kann natürlich schnell verwirrend werden - insbesondere, wenn die Technik mehr als einmal verschachtelt ist. Dies erhöht auch die Latenz, da alles, was Sie auf Ihrem lokalen Computer ausführen, über den Remote-Host übertragen wird.

Zusätzliche Informationen zu SSH-Tunneling für diejenigen, deren Neugier noch nicht befriedigt wurde, finden Sie in der Antwort auf diese Unix-Stapelaustausch-Frage .

starbeamrainbowlabs
quelle
Dies ist eine hervorragende Antwort. Genau das, was ich brauchte, um ssh auf einer Remote-Maschine ausführen zu können, die sich hinter einer Firewall befand und auf die nur über teamniewer zugegriffen werden konnte. Ich habe mich einfach über Teamviewer von der Teamviewer-Sitzung zurück zu meinem Rechner verbunden, um den SSH-Tunnel zu erstellen, und dann konnte ich so viele SSH-Sitzungen von meinem Computer zu Remote öffnen, wie ich brauchte.
Marian
In der Tat ist dies ein viel besserer Anwendungsfall für einen Tunnel wie diesen @Marian. Ich mache das selbst.
Starbeamrainbowlabs
0

Wenn sowohl Ihr lokaler als auch Ihr Remotecomputer über das Internet erreichbar sind, können Sie einfach eine SSH-Sitzung von Ihrem lokalen Computer auf dem Remotecomputer aus öffnen und dann in dieser Sitzung eine weitere SSH-Sitzung vom Remotecomputer auf dem lokalen Computer aus öffnen:

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>

Informationen zur Automatisierung finden Sie unter Fabric (Python-Kenntnisse erforderlich).

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
quelle
0

Sie können sshpass verwenden , um eine Verbindung zum Remotecomputer herzustellen und die Befehle auszuführen.

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

Verwenden Sie ein einfaches Shell-Skript auf dem lokalen Computer und verwenden Sie den obigen Code, wenn Sie Befehle auf einem Remotecomputer ausführen möchten. Dies ist eine der Methoden, die ich normalerweise in der Automatisierung verwende.

Priyanka
quelle
0

Nein, Sie können nicht in die bestehende Sitzung einsteigen.

Ihre Anwendung benötigt eine Möglichkeit, um wieder eine Verbindung zum Client herzustellen. SSH würde funktionieren, wenn auf dem Client ein SSH-Server ausgeführt wird und der Server Port 22 auf dem Client erreichen kann. Es wäre nicht schwer zu automatisieren, wenn Sie eine schlüsselbasierte Authentifizierung anstelle einer Kennwortauthentifizierung verwenden würden. Auf diese Weise wäre kein Benutzereingriff erforderlich.

Informationen zum Einrichten der schlüsselbasierten Authentifizierung finden Sie hier: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/

Omegamormegil
quelle
0

Wenn Sie Zugriff auf ein anderes Terminal haben, können Sie SIGSTOP mit "kill -19 PID" an den Befehl ssh senden, der die Verbindung initiiert hat. Sie erhalten dann die Kontrolle über das Terminal auf dem Client-Computer. Sobald Sie fertig sind, können Sie die SSH-Verbindung wiederherstellen, indem Sie einfach fg eingeben, um den SSH-Client zu aktivieren.

Aber natürlich ist die Frage hier: Wenn Sie bereits ein Terminal auf dem Client-Computer haben, warum würden Sie dies tun :)

Hedi
quelle