Frage Wie kann ich das Verzeichnis bei der ssh-Anmeldung automatisch ändern?


Ich versuche zu bekommen ssh um automatisch in ein bestimmtes Verzeichnis zu wechseln, wenn ich mich anmelde. Ich habe versucht, dieses Verhalten mit den folgenden Direktiven 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 definitiv ein web Ordner in meinem Home-Verzeichnis. Selbst wenn Sie einen absoluten Pfad verwenden, erhalten Sie dieselbe Nachricht. Um klar zu sein, wenn ich tippe cd web Nach dem Einloggen komme ich in den richtigen Ordner.

Was fehlt mir hier?

BEARBEITEN:

Unterschiedliche Kombinationen von Anführungszeichen / absoluten Pfaden geben 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

Das lässt mich denken, dass die Zitate nicht da sein sollten, und dass ein weiterer Fehler passiert.


77
2017-08-05 14:40


Ursprung


LocalCommand wird auf Ihrem lokalen System und nicht auf dem Remote-System ausgeführt. - Steve Kehlet
Siehe hier superuser.com/a/124110/47962 - Nakilon


Antworten:


CD ist eine eingebaute Shell. LocalCommand wird ausgeführt als:

/bin/sh -c <localcommand>

Was Sie suchen, kann nicht wirklich über SSH erreicht werden; Sie müssen die Shell in irgendeiner Weise modifizieren, z. über bashrc / bash_profile.


18
2017-08-05 15:52



Ja, wollte nur gleich erwähnen. Sie können die cd Befehl in ~/.bashrc auf dem Remote-Server statt. - vdboor
Das nervt. Wie ich in einem anderen Kommentar erwähnt habe, hat der Server eine Anzahl von Hostnamen und ich wollte ein unterschiedliches Verhalten haben, basierend darauf, welches verwendet wurde. Ich denke, es ist nicht möglich zu bestimmen, was von .bashrc verwendet wurde? - Gareth
Es ist möglich, nur wahrscheinlich nicht ratsam. Etwas wie das Ersetzen von ssh durch ein kleines Shell-Skript oder einen Alias, der den Host-Namen als zu exportierende Variable übergibt (a la "ssh -t user @ host 'export connhostname = host; bash --login'"). Aber du fängst tatsächlich an, in sehr seltsames Territorium zu kommen. Vielleicht ist eine bessere Frage, WARUM wollen Sie dieses Verhalten? - BMDan
Um ehrlich zu sein, ist das gar nicht so wichtig. Ich bin gerade in der Situation, in der die überwiegende Mehrheit der Zeit, die ich auf diesem Server logge ich direkt zu einem von zwei Verzeichnissen (abhängig davon, welchen Host ich verwende) - Gareth


Das funktioniert:

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

Um ein Verzeichnis zu erstellen, wenn es nicht existiert:

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

Wenn Sie nicht hinzufügen bash bis zum Ende des Weges dann verlassen Sie nach dem cd comand läuft. Und wenn Sie nicht hinzufügen --login dann dein ~/.profile wird nicht bezogen.


76
2017-12-21 21:29



Das beendet mich am richtigen Ort mit einer Bash-Eingabeaufforderung. perfekt! - Peter Ehrlich
Das funktioniert auch für mich, aber wenn ich versuche es mit ssh jump-host zu verwenden, funktioniert es nicht. Ich bekomme eine Verbindung geschlossen Nachricht. - Riccardo


  1. Logge dich in deine Box ein
  2. Bearbeiten ~/.bash_profile 
  3. Am Ende der Datei hinzufügen cd /path/to/your/destination
  4. Speichere es und beende den Editor
  5. Aus der Box ausloggen
  6. Logge dich erneut ein und du solltest es landen /path/to/your/destination

39
2018-02-27 11:04



Auf einigen Computern müssen Sie möglicherweise anhängen cd /path/to/your/destination zu ~/.bashrc statt zu ~/.bash_profile. Das Ergebnis sollte das gleiche sein. - Matthias
Dies funktioniert perfekt - ist es nur auf meine Benutzer-ID beschränkt oder wird es auch andere Benutzer-Logins beeinflussen? - barry_allen
@BabyGroot wenn Sie modifizieren ~/.bash_profile oder ~/.bashrc Es betrifft nur den aktuellen Benutzer. - rubenvarela


Eine robustere Lösung für den Fall, dass Sie die standardmäßige .bashrc-Datei ssh überschreiben und überschreiben müssen. Dies ist nützlich, wenn die Remote-Serverumgebung mehrere Docroots enthält 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. Erster Befehl erstellt .bashrc_tmp Datei in /tmp Verzeichnis auf dem Remote-Server mit einem Inhalt cd /path/to/dir
  2. Der nächste Befehl wird ausgeführt bash Mit der in Schritt 1 angegebenen Konfigurationsdatei. Dies ermöglicht es, zum gewünschten Verzeichnis zu wechseln und den Standardwert zu unterdrücken .bashrc.
  3. Dieser ganze Befehl ist als alias, so auf ssh Client-Eingabeaufforderung kann es als aufgerufen werden ssh_myserver

5
2017-08-21 11:53



Kreativ ... solange du perms nach / tmp schreibst - smci


Hast du diese Direktive in deiner SSH Config aktiviert?

PermitLocalCommand yes

Der Standardwert dafür ist noIn diesem Fall LocalCommand Anweisung würde ignoriert werden.

Alternativ haben Sie versucht, den Befehl zu Ihrem hinzuzufügen .bashrc Datei?


4
2017-08-05 14:47



Diese Direktive ist ja eingestellt (und ich nehme an, dass ich die Fehlermeldung nicht sehen würde, wenn das nicht der Fall wäre). Das Problem bei der Verwendung von .bashrc ist, dass der Server verschiedene Hostnamen hat und ich möchte, dass verschiedene Hostnamen in verschiedene Startverzeichnisse übersetzt werden - Gareth
Sofern nicht jeder Host-Name eine andere IP-Adresse hat, kann der Server nicht wissen, welchen Host-Namen Sie angefordert haben. Während HTTP-Anfragen einen freundlichen Host: -Header zur Identifizierung des angeforderten Host-Namens bereitstellen, tun dies SSH-Verbindungen nicht. - Fosco


Also habe ich viele Websites durchsucht (stackoverflow, diese) aber nicht gefunden was ich wollte. Ich habe schließlich mein eigenes Shell-Skript erstellt. Ich gebe es hier an. Sie können auch ein Verzeichnis in $ PATH kopieren.

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

Also danach. Ich mache:

connect <foldername>

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


4
2017-11-25 03:10



Ich bevorzuge das mit dem vorherigen Vorschlag, weil '$ SHELL' immer gültig ist, während 'Bash' nicht immer 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


In deiner ~/.ssh/config:

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

Am Ende deines ~/.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, einschließlich mit einer exportierten Variablen, aber diese Befehle werden in verschiedenen Shells ausgeführt.

Beim Testen, was Sie versuchen zu tun, habe ich übrigens keinen Fehler erhalten, wenn ich den nicht-quoted absoluten Pfad verwendet habe. Ich fügte hinzu ; pwd Am Ende des Befehls wird das richtige Verzeichnis angezeigt, aber das Verzeichnis, in dem ich mich befinde, ist ~. Es gibt keine cd Befehle in meinen Shell-Startdateien. Ich habe versucht, ein anderes zu setzen cd somedir; pwdim ~/.ssh/rc (mit dem anderen noch an Ort und Stelle). Das config Der Befehl wird ausgeführt, bevor das Motd ausgegeben wird rc Befehl wird danach ausgegeben, aber bevor die Startup-Dateien der Shell bezogen werden. Also wieder passiert es in einer anderen Shell.

Versuchen Sie es mit der Methode "Passing-by-File" und lassen Sie mich wissen, ob es für Sie funktioniert.


3
2017-08-05 18:21