使用 ssh 运行远程命令获取“bash:/ dev / fd / 63:没有这样的文件或目录”

使用 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 脚本并在本地运行。我有很多机器要运行,具有不同的参数,所以我尝试从本地计算机运行它们。

答案1

您不能通过这样的方式传递文件描述符ssh<(...)构造会在您的系统上创建虚拟文件,并且在远程系统上执行时没有任何意义。

如果您确实想使用它,请将其放入引号中,如果您有 bash,它将在远程系统上进行评估

ssh root@remote_host "bash <( cat /root/test.sh )"

答案2

我的建议是在远程主机上执行一个脚本(/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...您可以对此进行变体...

答案3

我最近遇到了同样的问题,但后来我意识到只有当你运行时才会发生这种情况须藤/根用户。

如果我运行:

sudo bash <(echo "It worked")

我得到:

bash: /dev/fd/63: No such file or directory

但如果我跑:

bash <(echo "It worked")

它工作得很好。

相关内容