使用 ssh 和非绝对命令时“找不到命令”

Sim*_*mon 7 shell ssh sshd synology

我想通过 ssh 使用命令:

ssh myuser@myhost mycommand
Run Code Online (Sandbox Code Playgroud)

但这样做我总是得到:

sh: mycommand: command not found
Run Code Online (Sandbox Code Playgroud)

使用以下显然有效:

ssh myuser@myhost /usr/local/bin/mycommand
Run Code Online (Sandbox Code Playgroud)

我明白为什么:这是因为该命令以某种方式在非登录 shell 上执行。

在我的 ssh 命令中使用完整命令或任何其他参数在我的场景中不是一个选项。我的命令是由我无法触及的脚本执行的,并且除了这个之外,还可以在每个主机上运行。

给我带来问题的主机是 Synology NAS,该myuser的 /etc/passwd 设置是:

myuser:x:1048:100::/var/services/homes/myuser:/bin/sh
Run Code Online (Sandbox Code Playgroud)

再次:

我可以:

  • ssh 作为 myuser 进入 myhost
  • 使用mycommand提供的绝对路径以 myuser 身份执行
  • 已经在 myhost 上时执行 mycommand(非绝对)(通过 ssh)

我不能不想要:

  • 执行:ssh myuser@myhost mycommand(非绝对,无附加参数)

der*_*ert 5

可能,你的$PATH不包括/usr/local/bin. 由于这是 ssh,因此我想到了三种方法:

\n\n
    \n
  1. 如果PermitUserEnvironment在 sshd 配置中启用,您应该能够进行设置PATH~/.ssh/environment该文件位于 NAS 服务器 \xe2\x80\x94 上的主目录中)。

  2. \n
  3. 如果您可以编辑 sshd 配置,那么您应该能够使用SetEnv PATH=/bin:/usr/bin:/usr/local/bin(等)来设置路径。至少如果它使用 OpenSSH。

  4. \n
  5. 您可以使用 ssh客户端的 SetEnv选项向服务器发送 PATH,具体取决于服务器配置。您可以~/.ssh/config在客户端计算机上的文件中进行设置。

  6. \n
\n\n

请注意,OpenSSH 服务器和客户端配置文件都可以具有仅限于特定客户端/服务器的选项。例如,在客户端配置中,您可以执行以下操作:

\n\n
Host myhost\n    SetEnv PATH=/bin:/usr/bin:/usr/local/bin\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅对一台服务器执行此操作。请注意,该块一直持续到下一个块开始(例如,另一个Host\xc2\xa0\xe2\x80\xa6块)\xe2\x80\x94 缩进只是为了视觉清晰。

\n\n

OpenSSH 配置文件记录在ssh_configsshd_config手册页中。

\n


Sim*_*mon 4

好吧,经过进一步调查,我注意到在我的所有其他主机上 mycommand 确实位于/usr/bin中 而不是/usr/local/bin中。原因是,每个包管理器都将其安装在 /usr/bin 中,除了来自 Synology 的奇怪的“软件商店”(或任何名称)。

我走了“肮脏”的路,刚刚创建了一个符号链接: /usr/bin/mycommand > /usr/local/bin/mycommand:

ln -s /usr/local/bin/mycommand /usr/bin/mycommand
Run Code Online (Sandbox Code Playgroud)

现在,对于面临类似问题的每个人: /usr/local/bin 存在是有原因的,并且我的解决方案可能存在风险。但这是最简单、最快的,我已经在这个问题上花了很多时间。在我的情况下,所有 ssh 密钥无论如何都将仅限于一个命令,所以我并不关心。

无论如何:如果您想了解更多有关这两个位置之间差异的信息,我推荐这篇文章: https: //askubuntu.com/a/308048