了解Linux Bash脚本的一部分

时间:2013-11-11 21:25:29

标签: linux bash shell syntax

我正在尝试了解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

2 个答案:

答案 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