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 .zshrc
Datei geschrieben habe, und ich möchte einen Weg haben, um:
- Starten Sie eine SSH - Sitzung in dem Remote - Rechner mit Direktiven aus meiner ssh - Konfigurationsdatei (zB
ControlMaster auto
) - Diese Sitzung führt eine Z-Shell aus
- Es wird
.zshrc
in 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 LocalCommand
einen 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 config
Datei mitzuteilen , welcher Befehl nach dem Herstellen einer Verbindung zum Server remote ausgeführt werden soll, aber es scheint keinen zu geben.
ssh mycommand
? Und wenn Sie vor jedem Befehl, der über ssh kommt, einen Setup-Befehl ausführen möchten, konfigurieren Sie die Serverseite..zshrc
in 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 bekommenFPATH variable not defined
, und ich denke, es liegt daran, dass eszsh
fertig ist, bevor es läuftmy_zshrc
, geschweige denn, dass es mir keine Z-Shell gegeben hat)Antworten:
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.
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:
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_keys
auf dem Server (alle in einer Zeile):quelle
exec
Befehl. Wieexec zsh
unterscheidet es sich von einemzsh
direkten Anruf ? Warum ist es in diesem speziellen Fall wichtig?ssh -t [email protected] 'HOME=~/bob; exec zsh'
bekomme ichHOME=~/bob: command not found
. Ich glaube ich bin drantcsh
. Ich bekomme das gleiche Problem, wenn ich es versucheHOME=/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.exec
ersetzt 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 Siesetenv HOME ~/bob; exec zsh
. Da zsh ohne Argument gestartet wird, erhalten Sie eine Shell-Sitzung, wie Sie sie erhalten würden, wenn Sie nurssh
zsh als Anmeldeshell ausgeführt hätten.exec zsh
Befehl weitere Befehle auszuführen ?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 tuneval $LC_STARTUP_CODE
zu$ZDOTDIR/.zshrc
und den Code übergeben , um in der Umgebungsvariablen ausführenLC_STARTUP_CODE
.Um einen Befehl nach dem Verbinden des Servers remote auszuführen, fügen Sie in Ihrer .ssh / config-Datei das folgende Snippet hinzu
quelle
LocalCommand
Anweisung darin, einen Befehl auf der lokalen Shell auszuführen , nicht auf der Remote- Shell.