我有以下脚本来设置远程主机的主机名。
#!/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
时,主机名不会被填充。如何将变量传递给远程执行命令?
答案 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 的代码。