In Bash (und anderen Shells) ist es möglich, das Ergebnis eines Befehls mithilfe von beispielsweise $() und `` (Backticks) in eine Befehlszeile einzufügen.
Nun wäre es schön, wenn Sie so etwas hätten, allerdings für SSH-Sitzungen. Sie befinden sich also in einer SSH-Sitzung und benötigen einige Informationen von Ihrem eigenen Computer und möchten diese in die interne Befehlszeile auf dem Computer eingeben, mit dem Sie verbunden sind.
Angenommen, Sie möchten direkt auf eine MySQL-Konsole zugreifen. Sie könnten beispielsweise einen Befehl wie diesen verwenden:
ssh [email protected] "mysql -u blub -pmypass"
Das funktioniert, aber das Problem ist, dass Sie das Kennwort in der Befehlszeile des SSH-Shell-Prozesses sehen können.
Um dieses Sicherheitsproblem zu lösen, hätte ich gerne so etwas:
ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"
das auf dem SSH-Client und nicht auf dem Server ausgeführt wird cat passfile
. Ist so etwas bekannt? Kennen Sie noch andere Tricks, wie man das macht?
UPDATE: Ich freue mich über Antworten, die sich auf mein Beispiel beziehen, aber ich werde sie nur akzeptieren, wenn sie die eigentliche Frage beantworten. Das heißt, ob es möglich ist, innerhalb einer SSH-Sitzung mit dem SSH-Client-Computer zu kommunizieren. (Ich weiß, dass dies ein mögliches Sicherheitsproblem darstellen kann.)
Mögliche Lösungen:
- Auf dem Client muss ein SSH-Server vorhanden sein, zu dem die Verbindung wieder hergestellt werden kann. (sweimann) Das Problem besteht darin, wie man die Anmeldeinformationen für die Verbindung wieder mit dem Server erhält.
- Erstellen Sie einen Tunnel mit SSH und verwenden Sie einige Netcat-Skripte/Telnet, um Befehle auf dem Server auszuführen und das Ergebnis zurückzusenden.
- Verwenden Sie expect, um die Shell zu skripten. (Zac Thompson)
- Verwenden Sie einen benutzerdefinierten Wrapper um SSH auf dem Client, der die Konsole beobachtet und entsprechend reagiert. (Sapporo)
- Patchen Sie SSH, um dies zu unterstützen. Es gibt einen ähnlichen Patch auf der Mailinglisteverfügbar.
- Es gibt eine Option 'SendEnv', umsshDadurch werden Umgebungsvariablen auf dem Remotecomputer festgelegt. Dies muss jedoch auf dem Remote-SSHD aktiviert werden.
Antwort1
Sie möchtenerwartendafür. Es ist wahrscheinlich bereits auf Ihrem Rechner. Es ist das Standardtool für jede Art interaktiver Befehlszeilenautomatisierung. Es ist eine Tcl-Bibliothek, sodass Sie sich nebenbei kostenlos einige Tcl-Kenntnisse aneignen. Vorsicht, es macht süchtig.
#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact
Antwort2
Versuchen Sie es mit einem <.
ssh[email geschützt]"mysql -u blub -p" < Datei
Wenn die erste Zeile in der „Datei“ Ihr Kennwort ist, „sollte“ dieses für die Kennwortabfrage verwendet werden, der Rest wird dann für den SQL-Teil verwendet.
Wenn Sie einfach eine SQL-Datei auf dem Remote-Server ausführen, versuchen Sie:
ssh[email geschützt]"mysql -u blub -p < file.sql" < Passwort
Antwort3
Ich habe das zugrunde liegende Problem vor einigen Jahren untersucht. Ich wollte einen SCP-Download innerhalb einer SSH-Sitzung auslösen. Wie bei Ihrem Problem ist hierfür eine Kommunikation innerhalb der SSH-Sitzung zurück zu einem Prozess auf dem Client erforderlich.
Hier ist also eine dritte mögliche Lösung: Stellen Sie die Verbindung mithilfe eines Wrappers um SSH her, der die Ausgabe von SSH scannt und bestimmte Befehle lokal auslöst, wenn er ein Muster erkennt. Das ist eindeutig ein Hack, aber es könnte funktionieren.
Ich landete bei einer modifizierten Version von /usr/bin/script, die sich an meine SSH-Verbindung erinnerte (z. B. me@somehost
), und wann immer meine SSH-Sitzung gedruckt wurde ###/some/absulte/path/to/file/on/host.txt###
, wurde sie lokal ausgeführtscp me@somehost:/some/absulte/path/to/file/on/host.txt .
Um das Muster und den absoluten Pfad bequem auf dem Server zu erzeugen, wurde ein einfaches Shell-Skript verwendet.
(Mein Code konnte tatsächlich noch etwas mehr: Er öffnete einen lokalen Texteditor für die heruntergeladene Datei und lud sie nach Änderungen mit SCP erneut hoch. Wenn Sie den Code möchten, sagen Sie mir Bescheid.)
Ich habe seitdem nach einer schöneren Implementierung hierfür gesucht, aber bisher keine gefunden.
Vielleicht könnte diese Technik als SSH-Proxy-Befehl (denken Sie an connect.c) statt als Wrapper um SSH implementiert werden.
Antwort4
Sie müssen eine Terminalsitzung emulieren:
ssh -t [email protected] "mysql -u blub -p"
In diesem Fall werden Sie nach einem Kennwort gefragt, das das Netzwerk über einen verschlüsselten SSH-Kanal überträgt und nicht in der Konsole angezeigt wird.