检查 Linux 客户端是否通过 DHCP 获取 IP



我有以下代码,我尝试在其中检查机器是否从dhcp获取IP地址或是否是静态的。该代码必须同时适用于 ubuntu 和 sles 12。现在,如果我在sles上使用代码,则会收到一个错误,指出找不到该文件,这是正常的。但我不希望用户看到此消息。有没有办法重定向 if 语句的输出?正常的重定向似乎不起作用。

我已经尝试在 if 语句之后放置if [[ ${statement} ]] &> /dev/null但这并没有改变任何事情。

if [[ ! "$(grep "dhcp4: true" /etc/netplan/50-cloud-init.yaml | awk '{print $2}')" == "true" ]] || [[ ! "$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)" == "dhcp" ]]
then
    # more code...
fi  

如果有人有更好的解决方案来检查客户端是否通过 dhcp 获取 IP,如果您让我知道,我将不胜感激。

所以我尝试了一种新方法,但我对它并不满意。该方法如下所示:

if [[ ${osname1} == "Ubuntu" ]]
then
    statement="$(grep 'dhcp4: true' /etc/netplan/50-cloud-init.yaml | awk '{print $2}')"
    matchword="true"
else
    statement="$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)"
    matchword="dhcp"
fi
if [[ ! ${statement} == ${matchword} ]]
then
  # more statements
fi

使用你的第二个代码思想,

if [[ ${osname1} == "Ubuntu" ]] ; then
    if awk 'BEGIN{fnd=1};/dhcp4: true/{fnd=0} ; END{exit fnd}' /etc/netplan/50-cloud-init.yaml  ; then
       # we're setting the shell return value for fnd, so it's fnd=1 indicates error, 0 indicates success
           matchword="true"
        fi
    else
        # statement="$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)"
        if awk 'BEGIN{fnd=1};/BOOTPROTO/{fnd=0);END{exit fnd}' /etc/sysconfig/network/ifcfg-eth0]] ;then
            matchword="dhcp"
    fi
fi
if [[ ${matchword} == "dncp" ]]
then
  # dhcp stuff statements
elif [[ ${matchword] = "true" ]] ; then
   # true stuff staments
else
   echo "Found value for matchword="XX${matchword}ZZ", can't continue"
   exit 1
fi

我会在最后一个块中使用case语句。

请注意,当我们测试被调用程序的返回值时,我们不需要[[ ... ]]配对,因此awk 'END{exit retVal}'代码。

-------编辑-------

而且因为我们只依赖于在某个文件中找到某个术语,并且不以任何方式解析输出,所以可以通过用简单的grep -q替换awk脚本来进一步简化,即

if [[ ${osname1} == "Ubuntu" ]] ; then
    if grep -q 'dhcp4: true' /etc/netplan/50-cloud-init.yaml  ; then
       # grep returns true if it finds the search target in the supplied filelist
           matchword="true"
        fi
    else
        if grep -q 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 ;then
            matchword="dhcp"
    fi
fi

-----------结束编辑---------

未经测试,因为我没有这些操作系统或可用的文件及其内容。

嗯,我还有另一个评论要说,但清理我的代码分散了注意力。当我想到它时,我会在下面添加它作为评论。

希斯

最新更新