使用 ssh 和非絕對命令時出現“找不到命令”
我想通過 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,因此想到了三種方法:
- 如果
PermitUserEnvironment
在 sshd 配置中啟用,您應該能夠設置(這是伺服器上您的主目錄中的一個文件 - NAS)PATH
。~/.ssh/environment
- 如果您可以編輯 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
手冊頁中。