Ich muss mich oft bei einem von mehreren Servern anmelden und in eines der Verzeichnisse auf diesen Rechnern gehen. Momentan mache ich so etwas:
localhost ~] $ ssh somehost Willkommen bei somehost! somehost ~] $ cd /some/directory/somewhere/named/Foo somehost Foo] $
Ich habe Skripte, die bestimmen, in welchen Host und in welches Verzeichnis ich gehen muss, aber ich kann keinen Weg finden, dies zu tun:
localhost ~] $ go_to_dir Foo Willkommen bei jemandem! Somehost Foo] $
Gibt es eine einfache, clevere oder eine Möglichkeit dies zu tun?
Sie können Folgendes tun:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
Auf diese Weise erhalten Sie eine Shell direkt im Verzeichnis verzeichnis_wanted.
Erläuterung
-t
Pseudo-Terminal-Zuordnung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einer entfernten Maschine auszuführen, was sehr nützlich sein kann, z. bei der Implementierung von Menü-Services.Mehrere
-t
-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat.
-t
nicht verwenden, wird keine Eingabeaufforderung angezeigt. ; bash
hinzufügen, wird die Verbindung geschlossen und die Steuerung an Ihren lokalen Computer zurückgegebenSie könnten hinzufügen
cd /some/directory/somewhere/named/Foo
an Ihre .bashrc
-Datei (oder .profile
oder wie auch immer Sie es nennen) beim anderen Host. Auf diese Weise wird, egal was Sie tun oder woher Sie ssh
haben, wann immer Sie sich an diesem Server anmelden, cd
das richtige Verzeichnis für Sie, und Sie müssen ssh
wie gewohnt verwenden.
Die Lösung von rogeriopvl funktioniert natürlich auch, aber es ist ein bisschen ausführlicher, und Sie müssen daran denken, es jedes Mal zu tun (es sei denn, Sie machen einen Alias), so dass es weniger "Spaß" macht.
Ich habe ein Werkzeug für SSH und CD in einem Server nacheinander erstellt - passend mit dem Namen sshcd . Für das von Ihnen gegebene Beispiel würden Sie einfach Folgendes verwenden:
sshcd somehost:/some/directory/somewhere/named/Foo
Lassen Sie mich wissen, wenn Sie Fragen oder Probleme haben!
Aufgrund von Hinzufügungen zu @ rogeriopvls Antwort schlage ich Folgendes vor:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"
Durch das Verketten von Befehlen mit &&
wird der nächste Befehl nur ausgeführt, wenn der vorherige Befehl erfolgreich war (im Gegensatz zur Verwendung von ;
, das die Befehle sequentiell ausführt). Dies ist besonders nützlich, wenn Sie cd
in ein Verzeichnis umwandeln müssen, das den Befehl ausführt.
Stellen Sie sich vor, Sie machen Folgendes:
/home/me$ cd /usr/share/teminal; rm -R *
Das Verzeichnis teminal
ist nicht vorhanden, wodurch Sie sich im Heimatverzeichnis befinden und alle Dateien mit dem folgenden Befehl entfernen.
Wenn Sie &&
verwenden:
/home/me$ cd /usr/share/teminal && rm -R *
Der Befehl schlägt fehl, wenn das Verzeichnis nicht gefunden wurde.
In meinem speziellen Fall wollte ich nur einen Befehl in einem Remote-Host in einem bestimmten Verzeichnis eines Jenkins-Slave-Computers ausführen:
ssh [email protected]
cd /home/myuser/somedir
./commandThatMustBeRunInside_somedir
exit
Aber mein Rechner konnte die ssh nicht ausführen (er konnte vermutlich keine Pseudo-tty zuordnen) und ließ mich den folgenden Fehler anzeigen:
Pseudo-terminal will not be allocated because stdin is not a terminal
Ich könnte dieses Problem umgehen, indem "cd an dir + mein Befehl" als Parameter des Befehls "ssh" übergeben wird (um kein Pseudo-Terminal zuzuweisen), und indem ich die Option -T übergibt, um explizit dem Befehl "ssh" mitzuteilen, dass ich nichts getan habe Pseudo-Terminal-Zuordnung ist nicht erforderlich.
ssh -T [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Ich verwende die Umgebungsvariable CDPATH
Mein bevorzugter Ansatz ist die Verwendung der SSH-Konfigurationsdatei (unten beschrieben), es gibt jedoch einige mögliche Lösungen, abhängig von Ihren Verwendungen.
Ich denke, die beste Antwort für diesen Ansatz ist die Antwort von christianbundy auf die akzeptierte Antwort:
ssh -t example.com "cd /foo/bar; exec \$Shell -l"
Wenn Sie doppelte Anführungszeichen verwenden, können Sie Variablen von Ihrem lokalen Computer verwenden, sofern diese nicht mit Escapezeichen versehen sind (da $Shell
hier ist). Alternativ können Sie einfache Anführungszeichen verwenden. Alle Variablen, die Sie verwenden, werden vom Zielrechner übernommen:
ssh -t example.com 'cd /foo/bar; exec $Shell -l'
Sie können den Befehl vereinfachen, indem Sie ihn in eine Bash-Funktion einschließen. Angenommen, Sie möchten nur Folgendes eingeben:
sshcd example.com /foo/bar
Sie können dies erreichen, indem Sie dies zu Ihrem ~/.bashrc
hinzufügen:
sshcd () { ssh -t "$1" "cd \"$2\"; exec \$Shell -l"; }
Wenn Sie eine Variable verwenden, die auf dem Remote-Computer für das Verzeichnis vorhanden ist, vergewissern Sie sich, dass die Variable mit einem Escape-Zeichen versehen oder in einfache Anführungszeichen gesetzt wird. Dies wird beispielsweise in das Verzeichnis übertragen, das in der Variablen JBOSS_HOME
auf dem Remote-Computer gespeichert ist:
sshcd example.com \$JBOSS_HOME
Wenn Sie möchten, dass dieses Verhalten für bestimmte Hosts (oder für beliebige Hosts) mit dem normalen Befehl ssh ständig angezeigt wird, ohne zusätzliche Befehlszeilenargumente verwenden zu müssen, können Sie die Optionen RequestTTY
und RemoteCommand
in Ihrer Konfigurationsdatei ssh festlegen.
Zum Beispiel möchte ich nur diesen Befehl eingeben:
ssh qaapps18
sie möchten jedoch, dass es sich immer wie folgt verhält:
ssh -t qaapps18 'cd $JBOSS_HOME; exec $Shell'
Also habe ich dies zu meiner ~/.ssh/config
-Datei hinzugefügt:
Host *apps*
RequestTTY yes
RemoteCommand cd $JBOSS_HOME; exec $Shell
Diese Regel gilt jetzt für alle Hosts mit "Apps" im Hostnamen.
Weitere Informationen finden Sie unter http://man7.org/linux/man-pages/man5/ssh_config.5.html
Eine andere Möglichkeit, direkt nach dem Einloggen zu gehen, ist das Erstellen von "Alias". Wenn Sie sich in Ihr System einloggen, geben Sie einfach diesen Alias ein und Sie befinden sich in diesem Verzeichnis.
Beispiel: Alias = MeinOrdner '/ var/www/Folder'
Nachdem Sie sich bei Ihrem System angemeldet haben, geben Sie diesen Alias ein (dies funktioniert von jedem Teil des Systems aus).
Wenn dieser Befehl nicht in bashrc ist, funktioniert er für die aktuelle Sitzung. Sie können diesen Alias auch zu bashrc hinzufügen, um ihn in Zukunft zu verwenden
$ myfolder => bringt Sie zu diesem Ordner
mit der -t
-Idee noch einen Schritt weiter. Ich verwende eine Reihe von Skripten, in denen ich die unten angeführten Skripts anrufe, um bestimmte Orte in meinen häufig besuchten Hosts aufzurufen. Ich behalte sie alle in ~/bin
und behalte dieses Verzeichnis in meinem Pfad.
#!/bin/bash
# does ssh session switching to particular directory
# $1, hostname from config file
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c
ssh -t $1 "cd $2; exec \$Shell --login"