无法使用SSH将字符串参数(多行)传递给远程脚本

时间:2015-04-24 18:27:17

标签: bash

我正在尝试在远程计算机上运行脚本,但我遇到的问题是我传递给该脚本的参数。我传递的变量是一个包含多行作为输入的字符串。

主脚本名为 parent.sh ,它在远程计算机上调用 child.sh 。此 child.sh 实际上已复制到远程计算机,然后在该计算机上执行。

$ cat parent.sh
#!/bin/bash
/usr/bin/scp /home/tom/child.sh harry@remote_server:
printf "Key in parent script: $key\n\n"
/usr/bin/ssh -t harry@remote_server "sudo sh -c '/home/harry/child.sh '$key''"


$ cat child.sh
#!/bin/bash
printf "Key in child: $1"

输入:

key has the following content:
fruit=apple
vegetable=potato

输出:

Key in parent script: fruit=apple
vegetable=potato

Key in child: fruit=apple

问题是在子脚本的输出中,我只获得第一行而不是第二行(vegetable=potato)。我尝试了单引号和双引号的几种组合,但似乎没有任何效果。我真的很想知道我在这里犯了什么大错,我怎么能纠正它。

1 个答案:

答案 0 :(得分:2)

此命令应该有效:

/usr/bin/ssh -t harry@remote_server "sudo sh -c '/home/harry/child.sh \"$key\"'"

这里的关键是你需要内部命令来保持$key在执行时引用的值。

原始命令:

"sudo sh -c '/home/harry/child.sh '$key''"

你可能认为它被读作:

"{sudo} {sh} {-c} {/home/harry/child.sh {$key}}"

实际上读为:

"{sudo} {sh} {-c} {/home/harry/child.sh }$key{}"

使$key的扩展不加引号,然后它被分词并且换行变成另一个正常空间。您可能在脚本中将第二个“行”用作$2