当我偶然发现一个我想阻止公司访问的邪恶网站时,我在绑定服务器上编辑了named.conf文件,然后更新了代理服务器黑名单文件。我想用一个bash脚本来自动化它。假设我的脚本称为“ evil-site-block.sh”,其中包含以下内容:
ssh root@192.168.0.1 'echo "#date added $(date +%m/%d/%Y)" >> /var/named/chroot/etc/named.conf; echo "zone \"$1\" { type master; file \"/etc/zone/dummy-block\"; };" >> /var/named/chroot/etc/named.conf'
然后以
$ evil-site-block.sh google.com
当我在远程计算机上查看named.conf的内容时,我看到:
#date added 09/16/2014 zone "" { type master; file "/etc/zone/dummy-block"; };
我不知道如何将“ google.com”作为$ 1传递。
您的问题:整个命令都用单引号引起来-显然是bash表达式在服务器上而不是在本地扩展。
但这也适用于您$1。
$1
简单的解决方案:通过将局部变量包装在单引号中来“报价”报价。
ssh root@192.168.0.1 'echo "#date added $(date +%m/%d/%Y)" >> /var/named/chroot/etc/named.conf; echo "zone \"'$1'\" { type master; file \"/etc/zone/dummy-block\"; };" >> /var/named/chroot/etc/named.conf'
注意:\"$1\"→ \"'$1'\"。
\"$1\"
\"'$1'\"
注意:此解决方案是上面问题中发布的单衬套的简单修复。如果这个脚本有可能被其他人执行,或者它可以处理任何形式的外部输出