Wie kann ich direkt in ein bestimmtes Verzeichnis ssh?

248

Ich muss mich oft bei einem von mehreren Servern anmelden und in eines von mehreren Verzeichnissen auf diesen Computern gehen. Momentan mache ich so etwas:

localhost ~] $ ssh somehost

Willkommen bei somehost!

somehost ~] $ cd / some / directory / irgendwo / namens / Foo
Somehost Foo] $ 

Ich habe Skripte, die bestimmen können, in welchen Host und in welches Verzeichnis ich gelangen muss, aber ich kann keinen Weg finden, dies zu tun:

localhost ~] $ go_to_dir Foo

Willkommen bei somehost!

Somehost Foo] $

Gibt es eine einfache, kluge oder eine Möglichkeit, dies zu tun?

Eisig
quelle

Antworten:

413

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


Erläuterung

-tPseudo-Terminal-Zuweisung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einem Remote-Computer auszuführen, was sehr nützlich sein kann, z. B. bei der Implementierung von Menüdiensten.

Mehrere -tOptionen erzwingen die Zuweisung von tty, auch wenn ssh keine lokale tty hat.

  • Wenn Sie nicht verwenden, -twird keine Eingabeaufforderung angezeigt.
  • Wenn Sie nichts hinzufügen, ; bashwird die Verbindung geschlossen und die Steuerung an Ihren lokalen Computer zurückgegeben
rogeriopvl
quelle
21
in meinem Fall - der fehlende Teil
Mathieu
2
Wenn Sie diesen Ansatz verwenden, wird das .bash_profile nicht gelesen. Weiß jemand warum?
Filipe
8
Ich musste dies tun: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
Guptron
40
Normalerweise benötigen Sie eine Login-Shell:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
Christianbundy
10
Ich wollte nur das Änderungsverzeichnis beim SSH-Login automatisch verknüpfen - Serverfehler ; und von dort fügen Sie diesen Befehl ein (der eine Version des von @christianbundy ist):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Sie könnten hinzufügen

cd /some/directory/somewhere/named/Foo

zu Ihrer .bashrcDatei (oder wie auch .profileimmer Sie es nennen) auf dem anderen Host. Auf diese Weise wird, egal was Sie tun oder woher Sie kommen ssh, wann immer Sie sich bei diesem Server anmelden, es cdin das richtige Verzeichnis für Sie verschoben, und alles, was Sie tun müssen, ist sshwie gewohnt zu verwenden.

Natürlich funktioniert die Lösung von rogeriopvl auch, aber sie ist ein bisschen ausführlicher, und Sie müssen daran denken, dies jedes Mal zu tun (es sei denn, Sie machen einen Alias), damit es ein bisschen weniger "Spaß" macht.

Chris Lutz
quelle
1
+1, dies scheint besser geeignet zu sein, wenn Sie ein konstantes Verzeichnis benötigen, anstatt den Befehl ssh länger zu machen und sich jedes Mal daran zu erinnern, in welches Verzeichnis Sie wechseln werden, wenn Sie eine Verbindung zum X-Computer herstellen
Tebe
Nicht richtig, wenn man flexibel wechselt
Lewis Chan
21

Ich habe nacheinander ein Tool für SSH und CD auf einem Server erstellt - treffend mit dem Namen sshcd . Für das Beispiel, das Sie gegeben haben, würden Sie einfach verwenden:

sshcd somehost:/some/directory/somewhere/named/Foo

Lassen Sie mich wissen, wenn Sie Fragen oder Probleme haben!

christianbundy
quelle
1
Wäre cool, wenn du eine neue Konfiguration in ~ / .ssh / config definieren und von dort lesen
könntest
21

Mein bevorzugter Ansatz ist die Verwendung der SSH-Konfigurationsdatei (unten beschrieben), aber es gibt einige mögliche Lösungen, die von Ihrer Verwendung abhängen.

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 sie nicht maskiert sind (wie $SHELLhier). Alternativ können Sie einfache Anführungszeichen verwenden, und alle Variablen, die Sie verwenden, stammen vom Zielcomputer:

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 zum Laufen bringen, indem Sie Folgendes zu Ihrem hinzufügen ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

Wenn Sie eine Variable verwenden, die auf dem Remotecomputer für das Verzeichnis vorhanden ist, müssen Sie sie maskieren oder in einfache Anführungszeichen setzen. Dies wird beispielsweise in das Verzeichnis verschoben, das in der JBOSS_HOMEVariablen auf dem Remotecomputer gespeichert ist :

sshcd example.com \$JBOSS_HOME

SSH-Konfigurationsdatei

Wenn Sie dieses Verhalten für bestimmte (oder beliebige) Hosts mit dem normalen Befehl ssh ständig sehen möchten, ohne zusätzliche Befehlszeilenargumente verwenden zu müssen, können Sie die Optionen RequestTTYund RemoteCommandin Ihrer ssh-Konfigurationsdatei festlegen .

Zum Beispiel möchte ich nur diesen Befehl eingeben:

ssh qaapps18

aber möchte, dass es sich immer wie dieser Befehl verhält:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

Also habe ich dies zu meiner ~/.ssh/configDatei hinzugefügt :

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

Diese Regel gilt nun für jeden Host mit "Apps" im Hostnamen.

Weitere Informationen finden Sie unter http://man7.org/linux/man-pages/man5/ssh_config.5.html

Drew
quelle
13

Basierend auf Ergänzungen zu @ rogeriopvls Antwort schlage ich Folgendes vor:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

Durch Verketten von Befehlen mit &&wird der nächste Befehl nur ausgeführt, wenn der vorherige erfolgreich war (im Gegensatz zur Verwendung ;, bei der Befehle nacheinander ausgeführt werden). Dies ist besonders nützlich, wenn Sie cdein Verzeichnis benötigen, in dem der Befehl ausgeführt wird.

Stellen Sie sich Folgendes vor:

/home/me$ cd /usr/share/teminal; rm -R *

Das Verzeichnis teminalexistiert nicht, was dazu führt, dass Sie im Ausgangsverzeichnis bleiben und alle darin enthaltenen Dateien mit dem folgenden Befehl entfernen.

Wenn Sie verwenden &&:

/home/me$ cd /usr/share/teminal && rm -R *

Der Befehl schlägt fehl, nachdem das Verzeichnis nicht gefunden wurde.

Bas Peeters
quelle
1
Ich habe einfache Anführungszeichen und keine doppelten Anführungszeichen mit einem Befehl ohne && einmal verwendet und es hat mich in den Hintern gebissen, schlecht ... habe meine Lektion gelernt.
Gavin Pickin
4

In meinem speziellen Fall wollte ich nur einen Befehl auf einem Remote-Host in einem bestimmten Verzeichnis von einem Jenkins-Slave-Computer ausführen:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Aber mein Computer konnte das ssh nicht ausführen (er konnte vermutlich keine Pseudo-tty zuweisen) und gab mir weiterhin den folgenden Fehler:

Pseudo-terminal will not be allocated because stdin is not a terminal

Ich könnte dieses Problem umgehen, indem ich "cd to dir + my command" als Parameter des ssh-Befehls übergebe (um kein Pseudo-Terminal zuweisen zu müssen) und die Option -T übergebe, um dem ssh-Befehl explizit mitzuteilen, dass ich es nicht getan habe Keine Pseudo-Terminal-Zuordnung erforderlich.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Mauricio Reis
quelle
3

Ich benutze die Umgebungsvariable CDPATH

Eddy
quelle
Nützlich nur, wenn ich an einem Verzeichnis pro Maschine interessiert war. Ich brauche eine Möglichkeit, Informationen an den Remote-Computer weiterzuleiten. Rogers Lösung macht genau das.
Frosty
2

mit der -tIdee noch einen Schritt weiter gehen . Ich behalte eine Reihe von Skripten, die das folgende aufrufen, um zu bestimmten Orten in meinen häufig besuchten Hosts zu gelangen. Ich behalte sie alle ~/binund behalte dieses Verzeichnis auf meinem Weg.

#!/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"
DKebler
quelle
1

Eine andere Möglichkeit, direkt nach dem Anmelden zu wechseln, besteht darin, "Alias" zu erstellen. Wenn Sie sich bei Ihrem System anmelden, geben Sie einfach diesen Alias ​​ein und Sie befinden sich in diesem Verzeichnis.

Beispiel: Alias ​​= mein Ordner '/ var / www / Folder'

Nachdem Sie sich bei Ihrem System
angemeldet haben , geben Sie diesen Alias ​​ein (dies funktioniert von jedem Teil des Systems aus). Dieser Befehl funktioniert für die aktuelle Sitzung, wenn er nicht in bashrc enthalten ist. Sie können diesen Alias ​​also auch zu bashrc hinzufügen, um ihn in Zukunft zu verwenden

$ myfolder => bringt Sie zu diesem Ordner

Schlaflosigkeit
quelle
-3

SSH selbst bietet ein Kommunikationsmittel, es weiß nichts über Verzeichnisse. Da Sie angeben können, welcher Remote-Befehl ausgeführt werden soll (dies ist standardmäßig Ihre Shell), würde ich dort beginnen.

Jan Jungnickel
quelle
4
Dies ist eine teilweise Antwort, keine Lösung.
AL
-7

Ändern Sie einfach Ihr Zuhause mit dem Befehl: usermod -d /newhome username

Borja Moll
quelle
1
Nicht empfohlen. Das Ändern Ihres Home-Verzeichnisses führt wahrscheinlich dazu, dass andere Dinge kaputt gehen.
Bronson