Legen Sie PATH fest, wenn Sie sich per SSH bei MacOS anmelden

Legen Sie PATH fest, wenn Sie sich per SSH bei MacOS anmelden

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 ~/.bashrcbearbeite ~/.bash_profiledie 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/pathsund 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 PATHVariable. Sie müssen zwei Dinge konfigurieren:

  1. Erstellen Sie die Datei ~/.ssh/environmentauf dem Server mit dem folgenden Inhalt:

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  2. Ändern Sie die Konfigurationsdatei des SSH-Servers, /private/etc/ssh/sshd_configsodass 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 .bashrcdies 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 .bashrcSie 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/fswatchDies ist die stabilste und sicherste Lösung für dieses Problem und wird immer funktionieren!

Wenn Sie eine Verbindung herstellen, localhostkönnen Sie den whichfolgenden 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 PATHUmgebungsvariable 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

verwandte Informationen