Linux 通过ssh传递外部shell脚本变量

Linux 通过ssh传递外部shell脚本变量,linux,bash,ssh,Linux,Bash,Ssh,当我偶然发现一个我想阻止公司访问的邪恶网站时,我会在绑定服务器上编辑我的named.conf文件,然后更新我的代理服务器黑名单文件。我想用bash脚本来实现自动化。假设我的脚本名为“邪恶站点块.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 \

当我偶然发现一个我想阻止公司访问的邪恶网站时,我会在绑定服务器上编辑我的named.conf文件,然后更新我的代理服务器黑名单文件。我想用bash脚本来实现自动化。假设我的脚本名为“邪恶站点块.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美元进行传递。

首先,你不希望这是两个单独重定向的
echo
语句——这样做既没有效率,也意味着如果同时附加了其他内容,行可能会彼此不相邻

第二,也是更重要的一点,您不希望运行的远程命令可能会转义其引号,并在服务器上运行任意命令(想想看,
$1
是否是
'$(rm-rf/)'.spammer.com

相反,请考虑:

#!/bin/bash
# ^ above is mandatory, since we use features not found in #!/bin/sh

printf -v new_contents \
  '# date added %s\nzone "%s" { type master; file "/etc/zone/dummy-block"; };\n' \
  "$(date +%m/%d/%Y)" \
  "$1"
printf -v remote_command \
  'echo %q >>/var/named/chroot/etc/named.conf' \
  "$new_contents"
ssh root@192.168.0.1 bash <<<"$remote_command"
#/bin/bash
#^以上是必需的,因为我们使用了在#中找不到的功能/垃圾箱/垃圾箱
printf-v新内容\
“#日期添加了%s\nzone”%s“{type master;file”/etc/zone/dummy block”;}\不\
“$(日期+%m/%d/%Y)”\
"$1"
printf-v远程_命令\
'echo%q>>/var/named/chroot/etc/named.conf'\
“$新内容”

sshroot@192.168.0.1bash您的问题:您的整个命令都放在单引号中–显然,bash表达式是在服务器上展开的,而不是在本地展开的

但这也适用于您的
$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'\”


注意:这个解决方案是一个简单的解决方案,如上面问题中所述。如果此脚本很可能是由其他人执行的,或者它可能会处理任何类型的外部输出,请查看。

这对于故意恶意参数是不安全的。鉴于这是响应安全事件并以root用户身份运行的代码,这样的安全性可能是一个合理的问题。我同意,但我们讨论的是一些黑客助手脚本。无论如何,黑名单管理的适当解决方案看起来会有所不同对于一个更明确的例子:考虑代码< > $ 1 < /C> >是“代码>”“$(RM- Rf/)”< /代码>(其中外部引文是文字文本而不是语法)。我宁愿让攻击者将垃圾放在named.conf中,也不允许他们在我的名称服务器上运行任意命令。我几乎用尽一切办法逃过了那只小狗,除了。。。我不担心named.conf会被另一个进程编辑,这是一种阻止访问垃圾邮件中引用的站点的快速方法。Thnaks@mrodmac,如果你正在从垃圾邮件中提取文本(根据定义,是恶意内容),并将该文本输入到一个脚本中,对于该文本的某些值,该脚本将以root用户的身份执行任意命令,我认为你真的可能会对如何处理安全性产生一些额外的偏执。:)