【问题标题】:Understanding part of Linux Bash Script了解部分 Linux Bash 脚本
【发布时间】:2013-11-11 21:25:29
【问题描述】:

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

检查之前执行的命令是否为真(如果是则添加ufw规则)

但是sn-p的其余部分如何

ip=`host $host | cut -d ' ' -f 4`

检查客户端 ip 是否来自允许的 dyndns 帐户?

非常感谢您的帮助,

托尼

【问题讨论】:

  • 这个脚本写得不好,可能坏了。为什么要浪费时间呢?
  • 嗨 Barmar “为什么要浪费时间呢?” - 用于学习目的。
  • 程序员显然认为他正在检查host 命令的退出状态,如果主机名查找成功则为0。但它实际上是检查cut 的退出状态,因为管道的状态是最后一个命令的状态。所以它不能按预期工作。
  • @tBook 那不是我写的。
  • @tBook 然后向其他编写更好的脚本学习。这东西是虫巢。在这种情况下,cut 将始终返回 true,因此 ufw 将始终运行。哦,亲爱的。

标签: linux bash shell syntax


【解决方案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 地址。

【讨论】:

    【解决方案2】:

    脚本本质上等同于:

    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
    

    【讨论】:

    • 感谢您提供的广泛有用的答案!竖起大拇指。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多