Shell

使用 ssh 和非絕對命令時出現“找不到命令”

  • January 10, 2019

我想通過 ssh 使用命令:

ssh myuser@myhost mycommand

但這樣做我總是得到:

sh: mycommand: command not found

使用以下顯然有效:

ssh myuser@myhost /usr/local/bin/mycommand

我明白為什麼:這是因為該命令以某種方式在非登錄 shell 上執行。

在我的 ssh 命令中使用完整命令或任何其他參數不是我的方案中的選項。我的命令是由一個腳本執行的,除了這個之外,我還不能在每個主機上使用和工作。

給我問題的主機是 Synology NAS,該myuser的 /etc/passwd 設置是:

myuser:x:1048:100::/var/services/homes/myuser:/bin/sh

再次:

我可以:

  • ssh 作為 myuser 進入 myhost
  • 使用mycommand提供的絕對路徑以 myuser 身份執行
  • 已經在 myhost 上時執行 mycommand(非絕對)(通過 ssh)

我不能不想要:

  • 執行:ssh myuser@myhost mycommand(非絕對,無附加參數)

好的,進一步調查我注意到在我所有的其他主機上 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

現在對於面臨類似問題的每個人:/usr/local/bin 存在是有原因的,我的解決方案可能存在風險。但它是最簡單和最快的,我已經在這個問題上花費了很多時間。在我的情況下,所有 ssh-key 無論如何都將僅限於一個命令,所以我真的不在乎。

無論如何:如果您想了解更多關於這兩個位置之間的區別,我推薦這篇文章:https ://askubuntu.com/a/308048

可能,您的$PATH不包括/usr/local/bin. 由於這是 ssh,因此想到了三種方法:

  1. 如果PermitUserEnvironment在 sshd 配置中啟用,您應該能夠設置(這是伺服器上您的主目錄中的一個文件 - NAS)PATH~/.ssh/environment
  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手冊頁中。

引用自:https://unix.stackexchange.com/questions/493287