ssh, starte eine bestimmte Shell und führe einen Befehl auf dem Remote-Computer aus?

11

Ich bin in einer Situation, in der mehrere Benutzer dasselbe Benutzerkonto auf einem Remotecomputer verwenden. Ich habe ein "persönliches" Verzeichnis, in das ich meine eigene .zshrcDatei geschrieben habe, und ich möchte einen Weg haben, um:

  1. Starten Sie eine SSH - Sitzung in dem Remote - Rechner mit Direktiven aus meiner ssh - Konfigurationsdatei (zB ControlMaster auto)
  2. Diese Sitzung führt eine Z-Shell aus
  3. Es wird .zshrcin meinem "persönlichen" Verzeichnis ausgeführt (nicht im Home-Verzeichnis des freigegebenen Benutzers).

Es wäre schön, einen Alias ​​oder eine einfache Möglichkeit zu haben, solche SSH-Sitzungen zu starten (deshalb habe ich darüber nachgedacht, die Konfigurationsdatei von OpenSSH zu verwenden), aber ich bin offen für andere Ideen!

Verwenden Sie die Konfigurationsdatei von OpenSSH?

Ich habe auf der Manpage ssh_config von OpenSSH gelesen , dass ich mithilfe der Direktive LocalCommandeinen Befehl angeben kann, der nach erfolgreicher Verbindung mit dem Server lokal ausgeführt werden soll. Dies ließ mich denken, dass es eine Möglichkeit gibt, der configDatei mitzuteilen , welcher Befehl nach dem Herstellen einer Verbindung zum Server remote ausgeführt werden soll, aber es scheint keinen zu geben.

Amelio Vazquez-Reina
quelle
Ich glaube nicht, dass du kannst. Aber ich bin verwirrt, warum du das willst. Es gibt bereits einen Befehl in der ssh-Befehlszeile. Warum kannst du nicht rennen ssh mycommand? Und wenn Sie vor jedem Befehl, der über ssh kommt, einen Setup-Befehl ausführen möchten, konfigurieren Sie die Serverseite.
Gilles 'SO - hör auf böse zu sein'
Danke @Guilles. Ich bin in einer Situation, in der mehrere Benutzer dasselbe Remote-Konto gemeinsam nutzen. Daher möchte ich schnell einige Dinge einrichten, wenn ich mich remote anmelde. Insbesondere möchte ich eine Z-Shell starten und sie bitten, eine .zshrcin einem bestimmten Verzeichnis (dh einem "persönlichen" Home-Verzeichnis) auszuführen . Ich habe es versucht, ssh -t host_name 'zsh & source /path/to/my_zshrc'aber es hat nicht funktioniert (ich habe es bekommen FPATH variable not defined, und ich denke, es liegt daran, dass es zshfertig ist, bevor es läuft my_zshrc, geschweige denn, dass es mir keine Z-Shell gegeben hat)
Amelio Vazquez-Reina
Ich denke, dies verdient eine Aktualisierung des OP, also habe ich es gerade aktualisiert.
Amelio Vazquez-Reina
Nachdem ich nach einer ähnlichen Antwort von mir gesucht habe, fällt mir ein, dass diese Frage ziemlich nahe an dem liegt, was Sie versuchen zu tun.
Gilles 'SO - hör auf böse zu sein'

Antworten:

15

Die naheliegendste Möglichkeit, einen Befehl remote auszuführen, besteht darin, ihn in der ssh-Befehlszeile anzugeben. Der Befehl ssh wird immer von der Shell des Remotebenutzers interpretiert.

ssh [email protected] '. ~/.profile; command_that_needs_environment_variables'
ssh -t [email protected] '. ~/.profile; exec zsh'

Freigegebene Konten sind im Allgemeinen eine schlechte Idee. Wenn möglich, erhalten Sie separate Konten für jeden Benutzer. Wenn Sie mit einem freigegebenen Konto nicht weiterkommen, können Sie einen Alias ​​erstellen:

ssh -t [email protected] 'HOME=~/bob; . ~/.profile; exec zsh'

Wenn Sie die Authentifizierung mit öffentlichem Schlüssel verwenden (erneut empfohlen), können Sie Befehle pro Schlüssel in definieren ~/.ssh/authorized_keys. Weitere Erklärungen finden Sie in dieser Antwort . Bearbeiten Sie die Zeile für Ihre Eingabe ~/.ssh/authorized_keysauf dem Server (alle in einer Zeile):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== [email protected]
Gilles 'SO - hör auf böse zu sein'
quelle
Fantastische @ Guilles. Ihre Beiträge zu dieser Website machen sie zu einer äußerst nützlichen Ressource für uns alle. Vielen Dank, wirklich. Ich wusste übrigens nichts über den execBefehl. Wie exec zshunterscheidet es sich von einem zshdirekten Anruf ? Warum ist es in diesem speziellen Fall wichtig?
Amelio Vazquez-Reina
Hmm, wenn ich renne ssh -t [email protected] 'HOME=~/bob; exec zsh'bekomme ich HOME=~/bob: command not found. Ich glaube ich bin dran tcsh. Ich bekomme das gleiche Problem, wenn ich es versuche HOME=/home/bob. Ich habe es mit Bash und Zsh versucht. Irgendwelche Hinweise, was dies verursachen könnte? Würde mich die obige Syntax mit der ssh-Sitzung offen lassen? (was ich möchte). Danke noch einmal.
Amelio Vazquez-Reina
1
@intrpc execersetzt die ursprüngliche Shell durch zsh; ohnezsh würde die ursprüngliche Shell im Speicher bleiben, bis zsh beendet und dann beendet wird. Der Hauptunterschied besteht darin, ein wenig Speicherplatz zu sparen, es ist nicht sehr wichtig. Wenn Ihre Login-Shell (t) csh ist, verwenden Sie setenv HOME ~/bob; exec zsh. Da zsh ohne Argument gestartet wird, erhalten Sie eine Shell-Sitzung, wie Sie sie erhalten würden, wenn Sie nur sshzsh als Anmeldeshell ausgeführt hätten.
Gilles 'SO - hör auf böse zu sein'
Danke nochmal für deine Hilfe. Eine Folgefrage hier. Gibt es eine Möglichkeit, nach dem exec zshBefehl weitere Befehle auszuführen ?
Amelio Vazquez-Reina
1
@ AmelioVazquez-Reina Nicht bequem, es sei denn, Sie haben die Kontrolle über eine der Punktdateien. Sie können die Umgebungsvariable so einstellen ZDOTDIR, dass zsh nach Punktdateien in einem anderen Verzeichnis sucht. Wenn Sie eine gewisse Kontrolle über die Punkt - Dateien zu tun haben , dann können Sie so etwas wie add tun eval $LC_STARTUP_CODEzu$ZDOTDIR/.zshrc und den Code übergeben , um in der Umgebungsvariablen ausführen LC_STARTUP_CODE.
Gilles 'SO - hör auf böse zu sein'
-3

Um einen Befehl nach dem Verbinden des Servers remote auszuführen, fügen Sie in Ihrer .ssh / config-Datei das folgende Snippet hinzu

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
parth115
quelle
2
Danke @ user626129, aber wie ich in der ursprünglichen Frage erwähnt habe, besteht die LocalCommandAnweisung darin, einen Befehl auf der lokalen Shell auszuführen , nicht auf der Remote- Shell.
Amelio Vazquez-Reina