假设有主机 A 和主机 B,并且 A 可以无需密码 ssh 访问 B。
当我ssh root@B ls
从 A 的 shell 运行时,ls
就会执行并显示输出。
然而,当我ssh root@B yarn
从 A 的 shell 运行类似的东西时,bash: yarn: command not found
会显示。
我确信可以通过在 B 的 shell 中yarn
手动输入来实现。yarn
我猜这是关于权限问题。ls
并且yarn
可能有不同的执行级别。
那么其确切原因是什么以及我如何才能ssh root@B yarn
从 A 的 shell 中获取它。
答案1
您的yarn
命令位于某些非标准位置,该位置已通过 shell 的初始化脚本(例如 ~/.bashrc 或 ~/.*profile 或 /etc/profile.d)添加到 $PATH。
问题是,在非交互模式下运行时,Bash 通常会完全忽略这些脚本。如果您比较printenv PATH
以交互方式输入的脚本和ssh root@B printenv PATH
非交互方式启动的脚本,您可能会看到不同的值。
解决此问题取决于远程服务器的操作系统:
ssh root@B ". /etc/profile && yarn ..."
应该始终有效(假设 /etc/profile 是 PATH 设置的地方;否则您需要用正确的文件名替换它)。将命令链接
yarn
到标准 $PATH 位置之一(例如 /usr/bin 或通常为 /usr/local/bin)应该总是有效的 - 假设它不需要其他存在的环境变量。创建一个 shell 脚本,在
/usr/[local/]bin/yarn
其中设置所有必需的环境变量并运行真实程序,这应该总是可行的。通过 ~/.bashrc 或 /etc/bash.bashrc 设置 $PATH 可以在 Debian/Ubuntu 上运行,但在大多数其他发行版上不起作用(不幸的是,Bash 将其作为编译时选项提供)。
通过 ~/.pam_environment 或 /etc/environment 设置 $PATH 在某些发行版上有效。请注意,这些不是 shell 脚本,并且使用不同的语法。