将嵌套的引用变量传递给远程ssh命令

时间:2018-03-26 03:48:58

标签: bash ssh

我有以下脚本来设置远程主机的主机名。

#!/bin/bash

ssh -T user@$1 << \EOF1
        sudo sh -c "echo "hostname=\"$1\"" >> /etc/rc.conf"
        sudo /etc/rc.d/hostname start
EOF1

当我运行./filename.sh host时,主机名不会被填充。如何将变量传递给远程执行命令?

2 个答案:

答案 0 :(得分:1)

如果分隔符完全不加引号,则在here-docs中执行参数扩展。

所以在here-doc for

ssh -T user@$1 << \EOF1

引用分隔符中的E时,$1未展开:它会以$1传递给ssh,然后传递给sh。在远程执行时,$1被替换为空字符串,因为没有位置参数。

如果您不引用E$1将在here-doc中展开:

ssh -T user@$1 << EOF1

答案 1 :(得分:1)

我可以把它写成

printf 'hostname="%s"\n' "$1" | ssh -T user@"$1" <<\EOF1
  sudo tee -a /etc/rc.conf > /dev/null
  sudo /etc/rc.d/hostname start
EOF1

简化报价。 ssh将其标准输入传递给远程shell,tee从中继承标准输入。现在您可以安全地引用此文档,因为它与$1的值无关。

它也更安全,因为现在$1不再是代码注入的开头。它只是脚本的数据输入,而不是脚本 part 的代码。