使用变量编辑远程文件

时间:2018-01-23 10:21:13

标签: linux bash rhel7 rhel6

我写了这个脚本,但它不起作用:

E_OPT=" some_host(ro,insecure) some_host2(ro,insecure)"

echo -n "Insert path to export [ ex: /path/test ]"
read PATH

FINAL=$PATH$E_OPT

ssh SERVER echo "$FINAL" >> file
or
ssh SERVER echo '$FINAL >> file'
or
ssh SERVER 'echo "$FINAL" >> file'

如何在变量中传递文本以附加到远程文件中?

2 个答案:

答案 0 :(得分:0)

您必须导出FINAL变量,此外,您还需要在开头使用点执行脚本,例如:

。 server-script.sh

这将评估本地bash上的变量,而不是子shell。

答案 1 :(得分:0)

这里有几个问题。第一个是read PATH。变量PATH是许多对系统具有特殊含义的变量之一:它定义了查找可执行文件的位置(例如,用于命令)。一旦将其重新定义为其他内容,系统将无法找到ssh之类的可执行文件,因此命令将开始失败。解决方案:使用小写或大小写混合变量名称以避免与任何特殊含义变量(全部为大写)冲突。

其次,你引用的所有尝试都是错误的。该命令将经历两个级别的shell解析:首先在本地计算机上(您希望变量$FINAL - 或更好$final - 要扩展),然后在远程服务器(您希望括号在引号中,因此它们不会导致shell语法错误)。这意味着你需要两个级别的引用:一个被解析的外部杠杆&由本地shell删除,第二级被解析&由远程shell删除。变量扩展仅在双引号中完成,而不是单引号,因此外部级别必须是双引号。内层可以是,但单引号最容易:

ssh SERVER "echo '$final' >> file"

现在,看起来$final变量可能是单引号,因此它不会被扩展;但引用不要嵌套!就本地shell而言,这是一个双引号字符串,恰好包含一些单引号或撇号或其他并不重要的内容。当远程shell收到命令时,该变量已被替换,外部引号被删除,所以它看起来像这样:

echo '/some/path some_host(ro,insecure) some_host2(ro,insecure)' >> file

......这就是你想要的。