Bash
使用 ssh 執行遠端命令得到“bash:/dev/fd/63:沒有這樣的文件或目錄”
我有
/root/test.sh
一個遠端伺服器,它有以下內容:#!/bin/bash date
在遠端伺服器上,我得到以下輸出:
# ./test.sh Fri Dec 18 07:41:10 EST 2015 # bash <(cat /root/test.sh) Fri Dec 18 07:41:23 EST 2015
但是,如果我嘗試從本地電腦執行相同的命令,我會得到以下結果:
$ ssh root@remote_server /root/test.sh Fri Dec 18 07:44:32 EST 2015 $ ssh root@remote_server bash <(cat /root/test.sh) cat: /root/test.sh: No such file or directory bash: /dev/fd/63: No such file or directory
那麼最後一次執行的問題是什麼?您可能會覺得執行這樣的腳本很奇怪
bash <(cat /root/test.sh)
。我這樣做的原因是因為它是我真實情況的簡化版本。我的真實程式碼是從網上下載一個Bash腳本並在本地執行。我有很多機器要執行,具有不同的參數,所以我試圖從我的本地電腦上執行它們。
您不能將這樣的文件描述符傳遞給
ssh
.<(...)
構造在您的系統上創建虛擬文件,並且在遠端系統上執行時沒有任何意義。如果您真的想使用它,請將其放在引號中,如果您在那裡有 bash,它將在遠端系統上進行評估
ssh root@remote_host "bash <( cat /root/test.sh )"
我的建議是在遠端主機上做一個腳本(
/root/test.sh
)使其可執行(chmod u+x /root/test.sh
)並按以下方式執行ssh root@remote_server /bin/bash -c /root/test.sh
關於
/bin/bash: /dev/fd/63: No such file or directory
您可以閱讀此答案[ 1 ]的原因。
注意:
請養成使用完整路徑 (
/bin/bash
) 而不是只使用命令名 (bash
) 的好習慣,以避免不必要的安全風險[ 2 ]。另一種方式應該是
ssh root@remote_server << EOF cat /root/test.sh # whatever else EOF
它將執行每一行,直到第二個 EOF…您可以對其進行變體…