Bash

使用 ssh 執行遠端命令得到“bash:/dev/fd/63:沒有這樣的文件或目錄”

  • April 29, 2021

我有/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…您可以對其進行變體…

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