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?
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
ssh server -t "cd /my/remote/directory; bash --login"
Sie könnten hinzufügen
zu Ihrer
.bashrc
Datei (oder wie auch.profile
immer Sie es nennen) auf dem anderen Host. Auf diese Weise wird, egal was Sie tun oder woher Sie kommenssh
, wann immer Sie sich bei diesem Server anmelden, escd
in das richtige Verzeichnis für Sie verschoben, und alles, was Sie tun müssen, istssh
wie 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.
quelle
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:
Lassen Sie mich wissen, wenn Sie Fragen oder Probleme haben!
quelle
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:
Wenn Sie doppelte Anführungszeichen verwenden, können Sie Variablen von Ihrem lokalen Computer verwenden, sofern sie nicht maskiert sind (wie
$SHELL
hier). Alternativ können Sie einfache Anführungszeichen verwenden, und alle Variablen, die Sie verwenden, stammen vom Zielcomputer:Bash-Funktion
Sie können den Befehl vereinfachen, indem Sie ihn in eine Bash-Funktion einschließen. Angenommen, Sie möchten nur Folgendes eingeben:
Sie können dies zum Laufen bringen, indem Sie Folgendes zu Ihrem hinzufügen
~/.bashrc
: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_HOME
Variablen auf dem Remotecomputer gespeichert ist :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
RequestTTY
undRemoteCommand
in Ihrer ssh-Konfigurationsdatei festlegen .Zum Beispiel möchte ich nur diesen Befehl eingeben:
aber möchte, dass es sich immer wie dieser Befehl verhält:
Also habe ich dies zu meiner
~/.ssh/config
Datei hinzugefügt :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
quelle
Basierend auf Ergänzungen zu @ rogeriopvls Antwort schlage ich Folgendes vor:
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 Siecd
ein Verzeichnis benötigen, in dem der Befehl ausgeführt wird.Stellen Sie sich Folgendes vor:
Das Verzeichnis
teminal
existiert nicht, was dazu führt, dass Sie im Ausgangsverzeichnis bleiben und alle darin enthaltenen Dateien mit dem folgenden Befehl entfernen.Wenn Sie verwenden
&&
:Der Befehl schlägt fehl, nachdem das Verzeichnis nicht gefunden wurde.
quelle
In meinem speziellen Fall wollte ich nur einen Befehl auf einem Remote-Host in einem bestimmten Verzeichnis von einem Jenkins-Slave-Computer ausführen:
Aber mein Computer konnte das ssh nicht ausführen (er konnte vermutlich keine Pseudo-tty zuweisen) und gab mir weiterhin den folgenden Fehler:
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.
quelle
Ich benutze die Umgebungsvariable CDPATH
quelle
mit der
-t
Idee 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~/bin
und behalte dieses Verzeichnis auf meinem Weg.quelle
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
quelle
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.
quelle
Ändern Sie einfach Ihr Zuhause mit dem Befehl:
usermod -d /newhome username
quelle