我想通过 ssh 使用命令:
ssh myuser@myhost mycommand
但这样做我总是得到:
sh: mycommand: command not found
使用以下显然有效:
ssh myuser@myhost /usr/local/bin/mycommand
我明白为什么:这是因为该命令是以某种方式通过非登录 shell 执行的。
在我的场景中,不能选择在 ssh 命令中使用完整命令或任何其他参数。我的命令是由一个脚本执行的,我无法触及该脚本,并且可以在除此之外的所有主机上运行。
给我带来问题的主机是 Synology NAS 及其 /etc/passwd 设置我的用户是:
myuser:x:1048:100::/var/services/homes/myuser:/bin/sh
再次:
我可以:
- ssh 作为 myuser 进入 myhost
- 使用以下提供的绝对路径以 myuser 身份执行哪个我的命令
- 当已经在 myhost 上时执行 mycommand (非绝对)(通过 ssh)
我不能不想要:
- 执行: ssh myuser@myhost mycommand (非绝对,无附加参数)
答案1
可能,你的$PATH
不包括/usr/local/bin
.由于这是 ssh,因此我想到了三种方法:
如果
PermitUserEnvironment
在 sshd 配置中启用,您应该能够设置PATH
(~/.ssh/environment
这是服务器 - NAS 上您的主目录中的一个文件)。如果您可以编辑 sshd 配置,那么您应该能够使用
SetEnv PATH=/bin:/usr/bin:/usr/local/bin
(等)来设置路径。至少如果它使用 OpenSSH。您可以使用 ssh客户的
SetEnv
向服务器发送 PATH 的选项,具体取决于服务器配置。您可以在~/.ssh/config
客户端计算机上的文件中进行设置。
请注意,OpenSSH 服务器和客户端配置文件都可以具有仅限于特定客户端/服务器的选项。例如,在客户端配置中,您可以执行以下操作:
Host myhost
SetEnv PATH=/bin:/usr/bin:/usr/local/bin
仅对一台服务器执行此操作。请注意,该块会一直持续到下一个块开始(例如,另一个Host …
块)——缩进只是为了视觉清晰。
OpenSSH 配置文件记录在ssh_config
和sshd_config
手册页中。
答案2
好的,经过进一步调查,我注意到在我的所有其他主机上,我的命令确实位于/usr/bin 不是在/usr/local/bin。原因是,每个包管理器都将其安装在 /usr/bin 中,除了来自 Synology 的奇怪的“软件商店”(或任何名称)。
我走了“肮脏”的路,刚刚创建了一个符号链接: /usr/bin/mycommand > /usr/local/bin/mycommand:
ln -s /usr/local/bin/mycommand /usr/bin/mycommand
现在,对于面临类似问题的每个人: /usr/local/bin 存在是有原因的,并且我的解决方案可能存在风险。但这是最简单、最快的,我已经在这个问题上花了很多时间。在我的情况下,所有 ssh 密钥无论如何都将仅限于一个命令,所以我并不关心。
无论如何:如果您想了解更多有关这两个位置之间差异的信息,我推荐这篇文章:https://askubuntu.com/a/308048
答案3
我尝试卸载然后安装 openssh-client 软件包,它开始工作。请检查依赖包并尝试重新安装。
下面是使用的命令:
sudo apt-get remove openssh-client
sudo apt-get install openssh-client