在 shell 脚本中,根据另一台服务器上的文件执行不同的操作(可通过 Web 访问)

在 shell 脚本中,根据另一台服务器上的文件执行不同的操作(可通过 Web 访问)

最近,我在几台不同的服务器上遇到了防火墙问题。我想创建一个脚本,每隔一小时左右运行一次,检查外部服务器上的文件并执行相关的防火墙规则集。目前,如果防火墙出现问题,我的 ssh/etc 被阻止,我必须安排现场访问,这非常昂贵。因此,这将有效地成为一个故障安全系统。如果出现问题,我可以使用另一台服务器对“损坏”的服务器发起更改,并使其恢复到可以远程管理的状态。我知道这有点复杂,但在我目前的 Linux 管理员级别应该可以很好地完成。

我以前从未真正编写过 bash/sh 脚本,但我习惯使用 bat。所以我需要社区的帮助,将这个伪代码转换成可能有用的代码:

$PATH = "/usr/firewall-scripts/temp/";
cd $PATH;
wget https://example.com/firewall/config/failsafe;
$FAILSAFE = readfile("$PATH/failtsafe");#This <--- im sure doesn't exist. 
if($FAILSAFE == "1") {
    /usr/firewall-scripts/failsafe.fw
}
else if ($FAILSAFE == "2")  {
    /usr/firewall-scripts/failsafe2.fw
}
else if ($FAILSAFE == "0")  {
    /usr/firewall-scripts/normal.fw
}
else if ($FAILSAFE == "-1")  {
    /usr/firewall-scripts/extra-secure.fw
}

远程文件只会列出数字 1,2,0 或 -1(或类似于这些行的内容)。

它纯粹只是一个用于执行不同文件的条件树/开关。

提前致谢!

注意:混合使用 Mandrivia 2010.R2 / Ubuntu 10.04 / ClearOS,所有版本都具有完整的 sh 和 bash,以防万一。但其实不应该。

编辑:这是一种黑客方法,可能有更好的(安全的)方法来做到这一点,但这非常轻松和简单。

答案1

您可以使用以下脚本:

#!/bin/bash

failsafe=`w3m -dump_source http://example.com/firewall/config/failsafe`
if [ "$failsafe" -eq "1" ] ; then
    /usr/firewall-scripts/failsafe.fw
elif [ "$failsafe" -eq "2" ] ; then
    /usr/firewall-scripts/failsafe2.fw
elif [ "$failsafe" -eq "0" ] ; then
    /usr/firewall-scripts/normal.fw
elif [ "$failsafe" -eq "-1" ] ; then
    /usr/firewall-scripts/extra-secure.fw
fi

您需要确保页面返回预期值之一才能获得正确的结果。

以上是关于 shell 脚本问题的答案,但我认为尝试使用配置管理解决方案是个好主意,例如木偶。可以运行 Puppet 代理定期从 Puppet Master 提取配置。因此,完成 Puppet 配置后,只需放置另一个防火墙规则文件并等待一段时间由远程计算机上的 Puppet 代理执行即可。

答案2

如果你使用

FAILSAFE=$(wget -O - http://example.com/firewall/config/failsafe) 

那么远程文件的内容将被保存到变量 $FAILSAFE。

然后您可以在比较中使用 $FAILSAFE,例如

#!/bin/bash

FAILSAFE=$(wget -O - http://example.com/firewall/config/failsafe 2> /dev/null)

if [ "$FAILSAFE" -eq "1" ]
then
    echo "FAILSAFE = $FAILSAFE"
elif [ "$FAILSAFE" -eq "2" ]
then
    echo "FAILSAFE = $FAILSAFE"
elif [ "$FAILSAFE" -eq "-1" ]
then
    echo "FAILSAFE = $FAILSAFE"
fi

答案3

#!/bin/bash 
# (or whatever the path to bash is, find out from 'which bash'

STATE=$(wget -O - http://example.com/firewall/config/failsafe)

case $STATE in
-1)
  /usr/firewall-scripts/extra-secure.fw
  ;;
0)
  /usr/firewall-scripts/normal.fw
  ;;

1)
  /usr/firewall-scripts/failsafe.fw
  ;;
2)
  /usr/firewall-scripts/failsafe2.fw
  ;;
*)
  echo "unexpected failsafe state"
  exit 1
  ;;
esac

exit 0

相关内容