Mein Problem ist
$ ssh localhost fswatch
bash: fswatch: command not found
ohne SSH-Befehl (z. B. fswatch) funktioniert es einwandfrei.
Ich habe festgestellt, dass PATH in der SSH-Sitzung der Standard-Mac ist
$ ssh localhost echo \$PATH
/usr/bin:/bin:/usr/sbin:/sbin
da ohne SSH
$ echo $PATH
/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Ich weiß wirklich nicht mehr, wie ich den Pfad eingerichtet habe, aber ich ~/.bashrc
bearbeite ~/.bash_profile
die Pfadvariable nicht. Es gibt eine Konfigurationsdatei /etc/paths
:
$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Homebrew, npm, pip installieren Programme normalerweise nach /usr/local/bin
, daher sind alle installierten Programme dort und ich kann auf meinem MacOS nicht über darauf zugreifen ssh localhost command
. Unter Linux gibt es kein Problem.
Meine Frage ist alsowie man OpenSSH konfiguriert, um PATHs von /etc/paths
und zu verwenden/etc/paths.d?
Ich habe auch versucht zu hacken:
$ ssh localhost sh -lc 'echo empty;echo $PATH'
/usr/bin:/bin:/usr/sbin:/sbin
$ ssh localhost bash -lc 'echo empty;echo $PATH'
/usr/bin:/bin:/usr/sbin:/sbin
Die erste Zeile ist immer leer. Wissen Sie nicht, warum?
Und meine letzte Problemumgehung
$ ssh localhost bash -lc ':;
export PATH="$( cat /etc/paths /etc/paths.d/* | tr \\\\n : )";
echo $PATH;
fswatch --version'
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Applications/VMware Fusion.app/Contents/Public
fswatch 1.14.0
Copyright (C) 2013-2018 Enrico M. Crisostomo <[email protected]>.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Enrico M. Crisostomo.
Hier :;
ist „first“ wichtig, da der erste Befehl irgendwie aus der Ausführung gelöscht wird.
System: MacOS Mojave 10.14.5
ssh -V
:OpenSSH_7.9p1, LibreSSL 2.7.3
bash --version
GNU bash, version 5.0.7(1)-release (x86_64-apple-darwin18.5.0)
Antwort1
Sie können den SSH-Server so konfigurieren, dass er den Clients eine angepasste Umgebung bietet, einschließlich einer benutzerdefinierten PATH
Variable. Sie müssen zwei Dinge konfigurieren:
Erstellen Sie die Datei
~/.ssh/environment
auf dem Server mit dem folgenden Inhalt:PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Ändern Sie die Konfigurationsdatei des SSH-Servers,
/private/etc/ssh/sshd_config
sodass sie die folgende Zeile enthält:PermitUserEnvironment PATH,LANG
Starten Sie abschließend den SSH-Daemon auf dem Server neu bzw. laden Sie ihn neu. SSH-Anmeldeclients sollten nun Zugriff auf Ihre angepasste Umgebung haben!
Antwort2
Auf meinem System kann ich .bashrc
dies einfach bearbeiten und einfügenganz oben:
PATH=/my/path:$PATH
Es ist wichtig, es davor zu setzen:
# If not running interactively, skip the rest
[ -z "$PS1" ] && return
Antwort3
Für meine Antwort gehe ich davon aus, dass Sie die Bourne Again Shell verwenden, aber das Folgende gilt auch für die meisten anderen Shells:
Der Grund für das beobachtete Verhalten ist, dass Ihr Befehl nicht in einer interaktiven, sondern in einer nicht-interaktiven Shell ausgeführt wird:
Wenn die Identität des Benutzers vom Server akzeptiert wurde, führt der Server entweder den angegebenen Befehl in einer nicht-interaktiven Sitzung aus oder meldet sich, wenn kein Befehl angegeben wurde, beim Computer an und gibt dem Benutzer eine normale Shell als interaktive Sitzung. Die gesamte Kommunikation mit dem Remote-Befehl oder der Remote-Shell wird automatisch verschlüsselt.
-$ man ssh
Ich vermute, dass .bashrc
Sie irgendwo in Ihrem Ihre Variable erweitern PATH
. Aber BASH wird Ihre Datei nicht interpretieren .bashrc
, wenn Sie keine interaktive Shell ausführen:
WannWenn eine interaktive Shell gestartet wird, bei der es sich nicht um eine Anmelde-Shell handelt, liest und führt bash Befehle aus /etc/bash.bashrc und ~/.bashrc aus, sofern diese Dateien vorhanden sind.
-$ man bash
Die einfachste Lösung für dieses Problem besteht darin, einfach den vollständigen Pfad zur ausführbaren Datei anzugeben, etwa: $ ssh localhost /full/path/to/fswatch
Dies ist die stabilste und sicherste Lösung für dieses Problem und wird immer funktionieren!
Wenn Sie eine Verbindung herstellen, localhost
können Sie den which
folgenden Befehl verwenden: $ ssh localhost $(which fswatch)
. Dies funktioniert jedoch höchstwahrscheinlich nicht, wenn Sie eine Verbindung zu einem anderen Host herstellen.
Eine andere Möglichkeit wäre, die PATH
Umgebungsvariable des Remote-Hosts für nicht interaktive Shells zu manipulieren (siehe @hedgies Antwort). Dies hat jedoch Sicherheitsimplikationen und sollte daher nicht in der Produktion verwendet werden:
Durch die Aktivierung der Umgebungsverarbeitung können Benutzer möglicherweise Zugriffsbeschränkungen in einigen Konfigurationen mithilfe von Mechanismen wie LD_PRELOAD umgehen.
-man sshd_config