it-swarm.com.de

Wie kann ich direkt in ein bestimmtes Verzeichnis wechseln?

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?

185
Frosty

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.

  • Wenn Sie -t nicht verwenden, wird keine Eingabeaufforderung angezeigt. 
  • Wenn Sie nicht ; bash hinzufügen, wird die Verbindung geschlossen und die Steuerung an Ihren lokalen Computer zurückgegeben
338
rogeriopvl

Sie 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.

45
Chris Lutz

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!

18
christianbundy

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.

6
Bas Peeters

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"
2
Mauricio Reis

Ich verwende die Umgebungsvariable CDPATH

2
Eddy

Mein bevorzugter Ansatz ist die Verwendung der SSH-Konfigurationsdatei (unten beschrieben), es gibt jedoch einige mögliche Lösungen, abhängig von Ihren Verwendungen.

Kommandozeilenargumente

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'

Bash-Funktion

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

SSH-Konfigurationsdatei

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

1
Drew

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

1
insomiac

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"
0
DKebler