使用“ssh root@host 命令”未找到命令

使用“ssh root@host 命令”未找到命令

假设有主机 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 脚本,并且使用不同的语法。

相关内容