Wie setze ich $ PATH so, dass der Befehl "ssh user @ host" funktioniert?

129

Ich kann anscheinend keinen neuen $ PATH so setzen, dass er beim Ausführen von Befehlen über verwendet wird ssh user@host command. Ich habe versucht export PATH=$PATH:$HOME/new_path, ~ / .bashrc und ~ / .profile auf dem Remotecomputer hinzuzufügen , aber das Ausführen ssh user@host "echo \$PATH"zeigt, dass die Änderung nicht übernommen wurde (es zeigt / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). Auf dem Remote-Computer wird Ubuntu 8.04 ausgeführt.

Ich bin sicher, ich könnte es in / etc / profile hacken, aber das ist keine saubere Lösung und es funktioniert nur, wenn man Root-Zugriff hat.

Denver Gingerich
quelle
1
Ich habe versucht export PATH=$PATH:$HOME/new_path, sowohl ~ / .bash_login als auch ~ / .bash_profile hinzuzufügen (zusätzlich zu den zuvor erprobten ~ / .bashrc und ~ / .profile). Beides funktioniert nicht. In beiden Fällen musste ich die Datei erstellen.
Denver Gingerich
In meinem speziellen Anwendungsfall ist es nicht einfach, den an ssh gesendeten Befehl zu ändern. Ich verwende stfufs ( guru-group.fi/too/sw/stfufs ), das den Befehl ssh selbst erstellt. Mir ist klar, dass seine Methode keine großartige Lösung ist, aber es wäre schön, sie zu reparieren, ohne stfufs zu modifizieren.
Denver Gingerich
Sie könnten einen SSH-Wrapper in den Weg von stfufs stellen und den echten SSH mit modifizierten Argumenten aufrufen, wenn das einfacher ist
Hasturkun

Antworten:

179

Wie Grawity sagte, ist ~ / .bashrc das, was Sie wollen, da es von nicht interaktiven Nicht-Login-Shells bezogen wird.

Ich gehe davon aus, dass das Problem mit der Standarddatei Ubuntu ~ / .bashrc zu tun hat. Es beginnt normalerweise mit so etwas:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Sie möchten alles für nicht interaktive Shells vor diese Zeile stellen.

Singpolym
quelle
1
Ja, ich habe das export PATH=$PATH:$HOME/new_pathüber diese Linie verschoben und es hat funktioniert. Vielen Dank!
Denver Gingerich
3
.bashrc ist unzuverlässig. man bash: "Bash versucht festzustellen, wann es mit seinem Standardeingang ausgeführt wird, der mit einer Netzwerkverbindung verbunden ist". Dies funktioniert unter RHEL, jedoch nicht unter Archlinux. Ich musste die Dateien / etc / environment den Standardpfad ändern
Becken
Sie sollten .zshenvfür zsh Benutzer erwähnen , es hat eine ganze Weile gedauert, bis ich es in den Kommentaren zu anderen Antworten gefunden habe
Mike
30

Hast du ein ~/.bash_loginoder ~/.bash_profile?

Bash im interaktiven Modus sucht nach diesen Dateien und verwendet die erste vorhandene in dieser Reihenfolge:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Wenn Sie also eine haben ~/.bash_profile, ~/.profilebleiben alle Änderungen, die Sie vornehmen, unsichtbar.

Bash im nicht interaktiven Modus liest manchmal die Datei ~/.bashrc(die auch häufig aus den interaktiven Skripten stammt). Mit "manchmal" meine ich, dass sie verteilungsabhängig ist: Seltsamerweise gibt es eine Option zur Kompilierungszeit, um dies zu aktivieren . Debian ermöglicht das ~/.bashrcLesen, zB Arch nicht.

ssh scheint den nicht interaktiven Modus zu verwenden, also ~/.bashrcsollte genug sein. Bei solchen Problemen füge ich normalerweise ein paar Echos hinzu, um zu sehen, welche Dateien ausgeführt werden.

user1686
quelle
Das Hinzufügen der Echos hat geholfen ... aber ich bin immer noch auf der Suche nach einer Möglichkeit, die 'ssh -X-Remotemaschine "xterm"' auszuführen und den vollständigen System- / Benutzerpfad von / etc / profile und ~ / home / username / .bash_profile zu haben. Wenn ich beide Dateien im Befehl als Quelle habe, funktioniert es .. aber es ist hässlich :).
Jess
Woher wissen Sie, dass "Bash im nicht interaktiven Modus die Datei liest ~/.bashrc"? Ich sehe diese Aussage nicht in der Manpage. Danke
Ritter
4
Wenn Sie möchten, dass eine nicht interaktive Shell ohne Anmeldung als Quelle verwendet wird ~/.bashrc, müssen Sie anscheinend zusätzlich die Umgebungsvariable festlegen BASH_ENV. siehe superuser.com/a/585699/100843 . Bei nicht interaktiven Login-Shells müssten Sie wahrscheinlich eines der drei von Ihnen erwähnten Startskripte ändern.
Ritter
3
Für ZSH ist die nicht interaktive Datei:.zshenv
Mathe
2
@math .zshenvwird immer bezogen; Es spielt keine Rolle, ob es interaktiv ist oder nicht.
JoL
19

ssh Dokumentation sagt:

Wenn der Befehl angegeben wird, wird er auf dem Remote-Host anstelle einer Anmeldeshell ausgeführt.

Aus diesem Grund funktioniert das Hinzufügen zu den bashrc-Dateien nicht. Sie haben jedoch folgende Möglichkeiten:

  1. Wenn die PermitUserEnvironmentOption in der sshd-Konfiguration festgelegt ist, können Sie Ihre PATH-Einstellung hinzufügen~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'

Hasturkun
quelle
1. Es ist nicht in meiner sshd-Konfiguration festgelegt und man sshd_configbesagt, dass es standardmäßig deaktiviert ist. Daher ist es unwahrscheinlich, dass diese Lösung für die meisten Benutzer funktioniert. 2. Dies würde funktionieren, aber ich kann den an ssh gesendeten Befehl nicht einfach ändern (siehe den zweiten Kommentar zu meiner Frage).
Denver Gingerich
1
1. Funktioniert nicht wie erwartet, da Sie in ~ / .ssh / environment keine Pfade zu PATH hinzufügen können, da $ PATH nicht aufgelöst wird.
not2savvy
8

Man kann immer sagen:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
Chas. Owens
quelle
Diese Lösung muss auf dem Remote-Computer nicht geändert werden, was eine gute Sache ist.
Ronny Andersson
2

Zusätzlich zur Antwort @signpolyma müssen Sie Ihren Export vor diesen Zeilen hinzufügen

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Viel Spaß beim Codieren
quelle
Ich habe diese Zeilen eigentlich nur komplett auskommentiert - gefunden in ~ / .bashrc in Ubuntu 16.04 LTS Desktop. Nein, alles funktioniert. Setzen Sie PermitUserEnvironment auch auf yes.
Ernie S
2

Hatte gerade das gleiche Problem selbst, löste es mit:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Indie
quelle