Wie kann ich das Verzeichnis beim SSH-Login automatisch wechseln?


87

Ich versuche, sshautomatisch zu einem bestimmten Verzeichnis zu wechseln, wenn ich mich anmelde. Ich habe versucht, dieses Verhalten mithilfe der folgenden Anweisungen in zu erreichen ~/.ssh/config:

Host example.net
LocalCommand "cd web"

Aber wenn ich mich anmelde, sehe ich Folgendes:

/bin/bash: cd web: No such file or directory

obwohl es auf jeden fall einen webordner in meinem heimatverzeichnis gibt. Selbst wenn Sie einen absoluten Pfad verwenden, erhalten Sie die gleiche Meldung. Um klar zu sein, wenn ich cd webnach dem Einloggen tippe, komme ich in den richtigen Ordner.

Was vermisse ich hier?

BEARBEITEN:

Unterschiedliche Kombinationen von Anführungszeichen / absoluten Pfaden ergeben unterschiedliche Fehlermeldungen:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Dies lässt mich denken, dass die Anführungszeichen nicht vorhanden sein sollten und dass ein weiterer Fehler auftritt.


9
LocalCommand wird auf Ihrem lokalen System ausgeführt, nicht auf dem Remote-System.
Steve Kehlet

Antworten:


25

cd ist eine shell builtin. LocalCommand wird ausgeführt als:

/bin/sh -c <localcommand>

Was Sie tun möchten, kann nicht über SSH erreicht werden. Sie müssen die Shell auf irgendeine Weise ändern, z. B. über bashrc / bash_profile.

<Bearbeitung fast ein Jahrzehnt später ...>

LocalCommandist sowieso nicht das, was du willst. Das läuft auf deiner Maschine. Sie möchten RemoteCommand. So etwas hat bei mir funktioniert:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
Ja, wollte nur gleich erwähnen. Sie können den cdBefehl ~/.bashrcstattdessen auf dem Remote-Server eingeben.
vdboor

Das nervt. Wie ich in einem anderen Kommentar erwähnt habe, hat der Server eine Reihe von Hostnamen und ich wollte ein anderes Verhalten basierend auf dem, was verwendet wurde. Ich denke, es ist nicht möglich zu bestimmen, welche von .bashrc verwendet wurde?
Gareth

Es ist möglich, aber wahrscheinlich nicht ratsam. So etwas wie das Ersetzen von ssh durch ein kleines Shellskript oder einen Alias, der den Hostnamen als zu exportierende Variable übergibt (a la "ssh -t Benutzer @ Host 'export Verbindungsname = Host; Bash - Anmelden'"). Aber du fängst tatsächlich an, in ein sehr seltsames Gebiet zu gelangen. Vielleicht ist eine bessere Frage, WARUM möchten Sie dieses Verhalten?
BMDan

Um ehrlich zu sein, ist es keine große Sache. Ich bin gerade in der Situation, in der die überwiegende Mehrheit der Zeit, in der ich mich auf diesem Server anmelde, direkt zu einem von zwei Verzeichnissen (je nachdem, welchen Host ich verwende)
Gareth

77

Das funktioniert:

ssh server -t "cd /my/remote/directory; bash --login"

So erstellen Sie ein Verzeichnis, wenn es nicht existiert:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

Wenn Sie bashdas cdPfadende nicht ergänzen , beenden Sie das Programm, nachdem der Befehl ausgeführt wurde. Und wenn Sie nicht hinzufügen, --logindann ist Ihr ~/.profilenicht bezogen.


Dies führt dazu, dass ich mit einer Bash-Aufforderung am richtigen Ort bin. perfekt!
Peter Ehrlich

Das funktioniert auch bei mir, aber wenn ich versuche, es mit ssh jump-host zu benutzen, funktioniert es nicht. Ich erhalte eine Nachricht, dass die Verbindung geschlossen wurde.
Riccardo

43
  1. Loggen Sie sich in Ihre Box ein
  2. Bearbeiten ~/.bash_profile
  3. Am Ende der Datei hinzufügen cd /path/to/your/destination
  4. Speichern und beenden
  5. Aus Box ausloggen
  6. Melden Sie sich erneut an und Sie sollten auf landen /path/to/your/destination

3
Auf einigen Computern müssen Sie möglicherweise cd /path/to/your/destinationan ~/.bashrcanstatt an anhängen ~/.bash_profile. Das Ergebnis sollte dasselbe sein.
Matthias

Dies funktioniert perfekt, danke - ist es nur auf meine Benutzer-ID beschränkt oder betrifft es auch andere Benutzeranmeldungen?
hard_working_ant

@BabyGroot, wenn Sie Änderungen vornehmen ~/.bash_profileoder ~/.bashrcdies nur den aktuellen Benutzer betrifft .
Rubenvarela

5

Stabilere Lösung für den Fall, dass Sie die standardmäßige .bashrc-Datei ssh und überschreiben müssen. Dies ist in Fällen nützlich, in denen die Remote-Server-Umgebung über mehrere Dokumentstammverzeichnisse verfügt und von mehreren Benutzern verwendet wird.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Genauer:

  1. Der erste Befehl erstellt eine .bashrc_tmpDatei im /tmpVerzeichnis auf dem Remote-Server mit einem Inhaltcd /path/to/dir
  2. Der nächste Befehl wird bashmit der in Schritt 1 angegebenen Konfigurationsdatei ausgeführt. Dadurch kann zum gewünschten Verzeichnis gewechselt und die Standardeinstellung unterdrückt werden .bashrc.
  3. Dieser gesamte Befehl wird als ein aliasBefehl umschlossen, sodass er an der Eingabeaufforderung des ssh-Clients als aufgerufen werden kannssh_myserver

Kreativ ... solange du Perms an / tmp
smci geschrieben hast

4

Hast du diese Direktive in deiner ssh Konfiguration aktiviert?

PermitLocalCommand yes

Der Standardwert hierfür ist no, in welchem ​​Fall Ihre LocalCommandDirektive ignoriert wird.

Haben Sie alternativ versucht, den Befehl zu Ihrer .bashrcDatei hinzuzufügen ?


Diese Direktive ist gesetzt, ja (und ich nehme an, ich würde die Fehlermeldung nicht sehen, wenn es nicht so wäre). Das Problem bei der Verwendung von .bashrc ist, dass der Server unterschiedliche Hostnamen hat und ich möchte, dass unterschiedliche Hostnamen in unterschiedliche Startverzeichnisse übersetzt werden
Gareth

Wenn nicht jeder Hostname eine andere IP-Adresse hat, kann der Server nicht wissen, welchen Hostnamen Sie angefordert haben. Während HTTP-Anforderungen einen benutzerfreundlichen Host: -Header bereitstellen, um den angeforderten Hostnamen zu identifizieren, werden SSH-Verbindungen nicht verwendet.
Fosco

4

Ich habe viele Websites durchsucht (Stackoverflow, diese), aber nicht gefunden, was ich wollte. Am Ende habe ich mein eigenes Shell-Skript erstellt. Ich füge es hier ein. Sie können es auch in ein Verzeichnis in $ PATH kopieren.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Also danach. Ich mache:

connect <foldername>

Hinweis: Möglicherweise müssen Sie sich abmelden und erneut anmelden, nachdem Sie die Pfadvariable geändert haben


Ich bevorzuge dies dem vorherigen Vorschlag, da "$ SHELL" immer gültig ist, während "bash" möglicherweise nicht gültig ist. Auch die Verwendung von "exec" ist eine nette Geste.
Dave

Eine weitere Verfeinerung wäre, sicherzustellen, dass "cd" erfolgreich ist - "cd ~ / $ 1 && exec ..."
Dave

3

In Ihrem ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

Am Ende Ihres ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

Ich habe versucht, dies mit der Variablenübergabe zu tun, auch mit einer exportierten Variablen, aber diese Befehle werden in verschiedenen Shells ausgeführt.

Beim Testen, was Sie versucht haben, ist mir übrigens kein Fehler unterlaufen, als ich den absoluten Pfad ohne Anführungszeichen verwendet habe. Ich habe ; pwdam Ende des Befehls hinzugefügt und das richtige Verzeichnis wird angezeigt, jedoch das Verzeichnis, in dem ich lande ~. cdMeine Shell-Startdateien enthalten keine Befehle. Ich habe versucht , eine andere setzen cd somedir; pwdin ~/.ssh/rc(mit der anderen noch an seinem Platz). Der configBefehl wird ausgeführt, bevor die motd ausgegeben wird, und der rcBefehl wird anschließend ausgegeben, jedoch bevor die Shell-Startdateien bezogen werden. Also nochmal, es passiert in einer anderen Shell.

Probieren Sie die Passing-by-File-Technik aus und lassen Sie mich wissen, ob sie bei Ihnen funktioniert.


2

Haben Sie es ohne Anführungszeichen versucht? Die einzigen Beispiele, die ich gesehen habe, haben sie nicht. Daher könnte es sein, dass Sie versuchen, cd \ web als Befehl auszuführen.


Ok, das Entfernen von Anführungszeichen scheint zu helfen, aber ich habe immer noch Fehler (siehe bearbeiteten Beitrag)
Gareth

1

Sie können dies auch mit der Option versuchen -t:

ssh server -t "cd /my/remote/directory; bash"

1

Versuchen Sie es RemoteCommandstattdessen mit, z

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: Gibt einen Befehl an, der nach erfolgreicher Verbindung mit dem Server auf dem Remotecomputer ausgeführt werden soll. ( man ssh_config)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.