通过 SSH 进入 MacOS 时设置 PATH

kyb*_*kyb 8 ssh openssh macos

我的问题是

$ ssh localhost fswatch          
bash: fswatch: command not found
Run Code Online (Sandbox Code Playgroud)

当没有 SSH 命令(即 fswatch)时工作正常。

我发现 SSH 会话中的 PATH 是默认的 Mac 的

$ ssh localhost echo \$PATH        
/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

因为没有 SSH

$ echo $PATH
/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

我真的不记得我是如何设置 PATH 的,但可以肯定的是~/.bashrc~/.bash_profile不要编辑 PATH 变量。有一个配置文件/etc/paths

$ cat /etc/paths         
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Run Code Online (Sandbox Code Playgroud)

Homebrew、npm、pip 通常将程序安装到/usr/local/bin,因此所有已安装的程序都在那里,我无法通过ssh localhost command我的 MacOS 访问它们。Linux下没有问题。

所以我的问题是如何配置 OpenSSH 以使用来自/etc/paths和 的PATH/etc/paths.d?

我也尝试破解:

$ 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
Run Code Online (Sandbox Code Playgroud)

第一行总是空的,你不知道为什么吗?

以及我的最终解决方法

$ 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 <enrico.m.crisostomo@gmail.com>.
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.
Run Code Online (Sandbox Code Playgroud)

这里第一个:;很重要,因为第一个命令以某种方式从执行中删除

系统:MacOS Mojave 10.14.5
ssh -VOpenSSH_7.9p1, LibreSSL 2.7.3
bash --version GNU bash, version 5.0.7(1)-release (x86_64-apple-darwin18.5.0)

Jaa*_*ens 10

您可以配置 SSH 服务器以为客户端提供自定义环境,包括自定义PATH变量。您需要配置两件事:

  1. ~/.ssh/environment在服务器上创建包含以下内容的文件:

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更改 SSH 服务器配置文件/private/etc/ssh/sshd_config以包含以下行:

    PermitUserEnvironment PATH,LANG
    
    Run Code Online (Sandbox Code Playgroud)

最后,重新启动/重新加载服务器上的 SSH 守护进程。SSH 登录客户端应该可以访问您的自定义环境!