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

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

我想通过 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,因此我想到了三种方法:

  1. 如果PermitUserEnvironment在 sshd 配置中启用,您应该能够设置PATH~/.ssh/environment这是服务器 - NAS 上您的主目录中的一个文件)。

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

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

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

Host myhost
    SetEnv PATH=/bin:/usr/bin:/usr/local/bin

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

OpenSSH 配置文件记录在ssh_configsshd_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

相关内容