我正在尝试了解Linux Bash脚本。该脚本的目的是仅限某些dyndns用户访问服务器服务(通过使用ufw规则)。脚本的一部分:
ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org"
for host in $ALLOWEDUSERS ; do
ip=`host $host | cut -d ' ' -f 4`
if [ $? -eq 0 ]; then
ufw allow proto tcp from $ip to any
fi
done
好的
for host in $ALLOWEDUSERS ; do
很明显,它遍历ALLOWEDUSERS,
据我了解
if [ $? -eq 0 ]; then
检查之前执行的命令是否为true(如果是,则添加ufw规则)
但该片段的其余部分如何
ip=`host $host | cut -d ' ' -f 4`
检查客户端ip是否来自允许的dyndns帐户?
非常感谢你的帮助,
tony
答案 0 :(得分:1)
它没有真正检查任何东西。
host $host
的输出就像是
$host has address xxx.xxx.xxx.xxx
。
例如:
$ host localhost
localhost has address 127.0.0.1
之后cut -d ' ' -f 4
隔离第四部分,即IP地址。这用作ufw
命令的IP地址。
答案 1 :(得分:0)
该脚本基本上等同于:
ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org"
for host in $ALLOWEDUSERS ; do
ip=`host $host | cut -d ' ' -f 4`
ufw allow proto tcp from $ip to any
done
原始脚本中的if
正在检查cut
的结果,而不是host
,并且它始终是成功的,所以它没有任何用处。
当DynDNS主机名有效时,将向防火墙添加一条规则以允许它。
如果未找到主机名,则host
命令将打印:
Host clientN.dyndns.org not found: 3(NXDOMAIN)
所以$ip
将是found:
。这将尝试:
ufw allow proto tcp from found: to any
由于这不是有效的防火墙规则,我希望它会被忽略并发出错误消息。
如果你想做脚本显然要做的事情,那应该是:
ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org"
for host in $ALLOWEDUSERS ; do
hostresult=`host $host`
if [ $? -eq 0 ]; then
ip=`echo "$hostresult" | cut -d ' ' -f 4`
ufw allow proto tcp from $ip to any
fi
done