Kann ich beim Starten der SSH-Sitzung einige Befehle ausführen, bevor ich in den interaktiven Modus wechsle?

13

Wenn ich eine ssh-Sitzung mit dem Befehl ssh starte, habe ich anscheinend zwei Möglichkeiten - die standardmäßige interaktive Sitzung mit der Standardeinstellung env und das Starten vom Basisverzeichnis aus - oder willkürliche Befehle auszuführen, die jedoch nicht interaktiv sind (selbst Tricks wie ssh "command; command; bash -i -l"scheinen nicht viel zu nützen). Sehr oft möchte ich eine interaktive Sitzung, aber vorher passiert etwas - normalerweise ein Verzeichniswechsel oder manchmal eine Anpassung der Systemumgebung. Diese Dinge würden von Sitzung zu Sitzung variieren, daher kann ich sie nicht einfach in die Sitzung stecken .bashrc.

Gibt es eine Möglichkeit, dies zu erreichen?

taw
quelle

Antworten:

13

Ich antworte selbst, als ich endlich das Geheimnis entdeckt habe. Weder die -tOption für sshnoch die -lOption für bashführt dazu, dass sich die Shell selbst anmeldet - aber in Kombination funktionieren sie.

ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'wechselt das Verzeichnis, setzt Umgebungsvariablen und startet dann die richtige Login-Shell (der einzige Unterschied, den ich bisher festgestellt habe, ist, dass dies /etc/motdnicht so angezeigt wird - normalerweise liegt es in der Verantwortung sshoder loginder Verantwortung, nicht in der Verantwortung bash- ansonsten scheint alles perfekt funktionieren, und alle Umgebungsvariablen sind identisch).

Diese Änderungen an der Umgebung / im Verzeichnis erfolgen nach ssh. Sie werden also nicht durch die PermitUserEnvironmententsprechenden Einstellungen (genau wie geplant) beschränkt, sondern vor .bashrc/ .profileget ausgeführt. Dies hat Vor- und Nachteile - es ist schwieriger, nur etwas zu überschreiben, das von Bash-Init-Skripten wie gesetzt wird PS1, aber es ist einfacher, genau die richtigen Werte in sshBefehlszeilen zu packen und .profileall das schwere Heben zu erledigen.

Und wenn es wirklich nötig ist, ist es eigentlich ziemlich einfach, bash dazu zu bringen, etwas auszuführen, das danach .profilemit einer Befehlszeile wie folgt aussieht ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- sehr hässlich, wenn man das so formuliert, aber diese alternativen .profileDateien können vorher vorbereitet werden. (Soweit ich das beurteilen kann, bashgibt es ein paar Kandidaten für ein .profileSkript und es wird das erste ausgeführt, das gefunden wurde. Es . filegibt keine solchen automatischen Fallbacks. Sie müssen also überprüfen, wo Sie normal sind, profilewenn Sie das tun möchten.)

taw
quelle
Super, danke dafür! Ich suchte nach einem Weg, um direkt nach dem Einspielen in ein Benutzerkonto zu su und die "-t" -Option brachte es zum Laufen. Ohne diese Option hat Ihre Shell keine Eingabeaufforderung, hat keinen Befehlsverlauf, stirbt an einem SIGINT usw.
Ashoat
Diese Antwort ist sehr hilfreich, aber in ;der ersten ssh-Anmeldezeichenfolge fehlen ein paar s. Ich kann Ihre Antwort nicht bearbeiten, da ich nicht genug ändere. Ich habe das zum Laufen gebracht ssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Ich denke, das haben Sie beabsichtigt.
Rob Kwasowski
2

Bearbeiten Sie .bashrc und fügen Sie Ihre SSH-spezifischen Umgebungseinstellungen ein in:

if [ $SSH_TTY ]; then
    ...
fi

Auf diese Weise können Sie Einstellungen speziell für SSH-Sitzungen hinzufügen. "Natürlich, wenn Sie von Anfang an nur beliebige Umgebungsvariablen festlegen möchten, die je nach Sitzung variieren, weiß ich nicht, wie Sie die Maschine veranlassen können, sie für Sie zu erraten, abgesehen von der Eingabe ... egal, was Sie tun." Ich brauche eine testbare Bedingung, um die Wahl der Einstellungen zu stützen.

Michael Louis Thaler
quelle
2

Von der sshManpage:

Außerdem liest ssh ~ / .ssh / environment und fügt der Umgebung Zeilen im Format "VARNAME = value" hinzu, wenn die Datei vorhanden ist und Benutzer ihre Umgebung ändern dürfen. Weitere Informationen finden Sie unter der Option PermitUserEnvironment in sshd_config (5).

was sagt:

PermitUserEnvironment
Gibt an, ob ~ / .ssh / environment und environment = Optionen in ~ / .ssh / authorized_keys von sshd (8) verarbeitet werden. Die Standardeinstellung ist "nein". Durch das Aktivieren der Umgebungsverarbeitung können Benutzer möglicherweise Zugriffsbeschränkungen in einigen Konfigurationen mithilfe von Mechanismen wie LD_PRELOAD umgehen.

Diese Funktion kann verwendet werden, um Anweisungen in Ihrer Fernbedienung unter ~/.bashrcVerwendung der von Mickey vorgeschlagenen ifStruktur bedingt auszuführen .

Bis auf weiteres angehalten.
quelle
1

Einfach so laufen: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : so dass die Eingabeaufforderung angezeigt würde
  • ; bash: damit es die Kontrolle zurückgibt, obwohl es den Befehl ausführt (hier cd) und die SSH-Sitzung verlässt
Sumit Ramteke
quelle
Willkommen bei ServerFault! Stellen Sie Befehle oder Skripte zur Verfügung und erklären Sie sie und / oder dokumentieren Sie sie, um zu erklären, wofür sie bestimmt sind.
Cory Knutson
1
Danke @CoryKnutson, ich habe die Änderungen wie gewünscht vorgenommen
Sumit Ramteke