2009-03-09 16 views
149

Ich muss mich oft auf einem von mehreren Servern einloggen und in eines von mehreren Verzeichnissen auf diesen Rechnern gehen. Zur Zeit mache ich etwas von dieser Art:Wie kann ich SSH direkt in ein bestimmtes Verzeichnis?

 
localhost ~]$ ssh somehost 

Welcome to somehost! 

somehost ~]$ cd /some/directory/somewhere/named/Foo 
somehost Foo]$ 

ich Skripte, die die Host und Verzeichnis, das bestimmen kann, muss ich in bekommen, aber ich kann nicht einen Weg finden, um dies zu tun:

 
localhost ~]$ go_to_dir Foo 

Welcome to somehost! 

somehost Foo]$ 

Ist gibt es einen einfachen, cleveren oder irgendeinen Weg dies zu tun?

Antwort

271

Sie können folgendes tun:

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

Auf diese Weise erhalten Sie eine Schale direkt am directory_wanted bekommen.


Erklärung

-t  Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. 
      Multiple -t options force tty allocation, even if ssh has no local tty. 
  • Wenn Sie -t nicht verwenden, dann wird keine Aufforderung angezeigt.
  • Wenn Sie hinzufügen ; bash nicht, dann wird die Verbindung geschlossen erhalten und das Rücksteuerung auf den lokalen Rechner
+0

Das letzte Teil des Puzzles war das Ausführen der Shell am Ende. Vielen Dank. – Frosty

+18

in meinem Fall -t der fehlende Teil – Mathieu

+2

Ich verwendete "Csh" anstelle von "Bash" am Ende, weil meine Shell Csh war. Nur eine Notiz! – quantum

-1

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

+3

Dies ist eine Teilantwort, keine Lösung. –

2

ich die Umgebung verwenden variable CDPATH

+0

Nur nützlich, wenn ich an einem Verzeichnis pro Rechner interessiert war. Ich brauche eine Möglichkeit, um Informationen an die entfernte Maschine weiterzugeben. Rogers Lösung macht genau das. – Frosty

40

Sie

cd /some/directory/somewhere/named/Foo 

hinzufügen könnte zu Ihre .bashrc Datei (oder .profile oder wie Sie es nennen) auf dem anderen Host. Auf diese Weise, egal was Sie tun oder wo Sie ssh von, wenn Sie auf diesem Server anmelden, wird es cd in das richtige Verzeichnis für Sie, und alles, was Sie tun müssen, ist ssh wie normal.

Fluch, Rogeriopvl Lösung funktioniert auch, aber es ist ein bisschen mehr ausführlich, und Sie müssen daran denken, es jedes Mal zu tun (es sei denn, Sie machen einen Alias) so scheint es ein bisschen weniger "Spaß".

+1

+1, das sieht besser aus, wenn Sie ein konstantes Verzeichnis benötigen, anstatt den ssh-Befehl länger zu machen. Immer daran erinnern, in welches Verzeichnis Sie wechseln werden, wenn Sie eine Verbindung zu X herstellen – Tebe

1

Eine andere Möglichkeit, direkt nach dem Anmelden zu gelangen, ist "Alias". Wenn Sie sich in Ihr System einloggen, geben Sie einfach diesen Alias ​​ein und Sie befinden sich in diesem Verzeichnis.

Beispiel: Alias ​​= myfolder '/ var/www/Ordner'

Nachdem Sie an Ihrem System anmelden, das Alias ​​ein (dies funktioniert von jedem Teil des Systems)
diesen Befehl, wenn nicht in bashrc wird Arbeit für die aktuelle Sitzung. So können Sie auch diesen Alias ​​in den verwenden bashrc, dass in Zukunft

$ myfolder => führt Sie in diesem Ordner

14

ich ein Werkzeug, um SSH und CD in einen Server fortlaufend erstellt haben - treffend sshcd benannt.Für das Beispiel, das Sie angegeben haben, verwenden Sie einfach:

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

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

+0

Wäre cool, wenn Sie eine neue Konfiguration in ~/definieren könnten. ssh/config und lesen Sie es von dort;) – Alexar

+0

@Alexar https://github.com/fraction/sshcd/issues :) – christianbundy

-5

einfach zu Hause mit dem Befehl ändern: usermod -d /newhome username

+0

Nicht empfohlen. Wenn Sie Ihr Home-Verzeichnis ändern, werden wahrscheinlich andere Dinge beschädigt. – bronson

0

In meinem sehr speziellen Fall wollte ich nur einen Befehl in einem Remote-Host ausgeführt werden, in einem bestimmten Verzeichnis von einer Jenkins Slave-Maschine:

ssh [email protected] 
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir 
exit 

Aber meine Maschine die ssh nicht durchführen konnte (es könnte ein pseudo-tty ich nehme nicht vergeben) und hielt mir den folgenden Fehler geben:

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

Ich konnte dieses Problem umgehen, indem ich "cd an dir + my command" als Parameter des ssh-Befehls übergebe (um kein Pseudo-Terminal zuordnen zu müssen) und die Option -T übergeben, um dem ssh-Befehl das I explizit mitzuteilen brauchte keine Pseudo-Terminal-Zuweisung.

ssh -T [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir" 
0

auf Ergänzungen Basierend auf @ rogeriopvl Antwort, schlage ich folgendes:

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

Chaining Befehle von && wird der nächste Befehl laufen nur machen, wenn der vorherige erfolgreich war (wie ; zur Verwendung gegen , die Befehle sequentiell ausführt). Dies ist besonders nützlich, wenn Sie cd in einem Verzeichnis benötigen, das den Befehl ausführt.

Imagine Sie folgendermaßen vorgehen:

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

Das Verzeichnis teminal nicht existiert, was bewirkt, dass Sie im Home-Verzeichnis bleiben und dort mit dem folgenden Befehl, um alle Dateien zu entfernen.

Wenn Sie &&:

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

Der Befehl wird fehlschlagen, nachdem das Verzeichnis nicht finden.

0

geht einen Schritt weiter mit der -t Idee. Ich besitze eine Reihe von Skripten, die den folgenden aufrufen, um zu bestimmten Orten in meinen häufig besuchten Hosts zu gehen. 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" 
Verwandte Themen