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)
再次:
我可以:
我不能不想要:
可能,你的$PATH
不包括/usr/local/bin
. 由于这是 ssh,因此我想到了三种方法:
如果PermitUserEnvironment
在 sshd 配置中启用,您应该能够进行设置PATH
(~/.ssh/environment
该文件位于 NAS 服务器 \xe2\x80\x94 上的主目录中)。
如果您可以编辑 sshd 配置,那么您应该能够使用SetEnv PATH=/bin:/usr/bin:/usr/local/bin
(等)来设置路径。至少如果它使用 OpenSSH。
您可以使用 ssh客户端的 SetEnv
选项向服务器发送 PATH,具体取决于服务器配置。您可以~/.ssh/config
在客户端计算机上的文件中进行设置。
请注意,OpenSSH 服务器和客户端配置文件都可以具有仅限于特定客户端/服务器的选项。例如,在客户端配置中,您可以执行以下操作:
\n\nHost 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 缩进只是为了视觉清晰。
OpenSSH 配置文件记录在ssh_config
和sshd_config
手册页中。
好吧,经过进一步调查,我注意到在我的所有其他主机上 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