我/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")
它工作得很好。