通过stdin将带有参数的脚本作为字符串传递给bash

时间:2019-11-22 14:41:16

标签: bash stdin

当前,我遇到了将带有参数的脚本传递给bash的问题。限制是我可以将它们作为字符串传递(请参阅$ COMMAND)

ssh user@server 'bash -s' < "$COMMAND"

如果我的$ COMMAND包含“ foo.sh bar baz”,我将收到错误no such file or directory: foo.sh bar baz

此外,我还可以为bash设置其他选项。

预先感谢您!

2 个答案:

答案 0 :(得分:2)

根本问题是<需要重定向的文件名,而不是文件名和一些参数。这样将两者混合在一起是行不通的。

如果我理解正确,那么您想运行本地计算机上存在的脚本,但要在远程计算机上执行该脚本(使用提供的参数)。在这种情况下,您要运行的内容如下:

ssh user@server 'bash -s bar baz' <"foo.sh"

请注意,参数传递的位置与脚本文件名的传递位置完全不同。如果可能的话,我建议不要将两者混在一起。将它们放在单独的变量中,然后使用类似以下的内容:

ssh user@server "bash -s $scriptargs" <"$scriptfile"

答案 1 :(得分:0)

从错误的声音来看,foo.sh在服务器上不存在,因此失败。

最简单的解决方案似乎是:

ssh user@server 'foo.sh bar baz',前提是服务器上存在“ foo.sh”。

如果服务器上不存在“ foo.sh”,您是否尝试过使用here docs?例如:

ssh user@server "cat > foo.sh && chmod u+x foo.sh && ./foo.sh bar baz" << "EOF"
`heredoc> #Put your contents of foo.sh here
`heredoc> #And put them here
`heredoc> echo "Argument 1: $1"
`heredoc> echo "Argument 2: $2"
`heredoc> EOF
user@server's password:
Argument 1: bar
Argument 2: baz

编辑:

david@localhost ~ % bash -s < test.sh David Finder
Hello David
Hello Finder

编辑为我的上一个答案,问题是由于引用了输入到Bash的输入引号引起的,因为它将整个输入视为一个文件(它正在寻找一个字面名为“ foo.sh bar baz”的文件,内的空格。