CentOS 7:获取接口 IP 号

CentOS 7:获取接口 IP 号

我正在尝试在 CentOS 7 映像中自动填充 /etc/issue(这将是一个模板,并且需要能够一目了然地识别生成的虚拟机)。

我的 /sbin/ifup-local 中有以下内容:

/bin/bash #!/bin/bash

CD/等;
取消链接./问题;

睡眠 1;

问题原始="$(cat./问题原始)" ;
show_ip="$(ip 地址显示 |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;

共同-l./问题;
echo -e "${issue_original}\n\n\t当前 IP 号码:\n\t====================\n${show_ip}\n" >./issue ;
ci-m-u./问题;

/etc/issue-original 如下所示:

登录到:

        节点:\\n
        正在运行:\\S


当我手动运行脚本时(sudo /sbin/ifup-local ; 猫/etc/issue),它会正确填充 /etc/issue。当它自动运行时(例如当它是sudo 服务网络重启;cat /etc/issue)、文件模板和静态文本都有,但是IP号码是空的(甚至没有空行)。

我是否误解了执行顺序(ifup-local 是否在分配 IP 号码之前执行)?它看起来位于 /etc/sysconfig/network-scripts/ifup-post 的最末尾,因此我认为它是在 DHCP 客户端设置接口之后。

在设置接口 IP 号码和“ip”命令获知这些号码之间是否存在延迟?之所以有“sleep”语句,是因为我认为可能存在这种情况。

非常感谢任何正确方向的指示。

快乐星期天!

==========================

编辑:

这是我重新启动网络服务后在 /etc/issue 中看到的内容。

[david@localhost ~]$ sudo 服务网络重启
重启网络(通过 systemctl):[ 确定 ]
[david@localhost ~]$ cat /etc/issue

登录到:

        节点:\n
        正在运行:\S

        当前 IP 号码:
        ===================


[大卫@本地主机〜] $

此外,我还用大量调试消息对脚本进行了检测,以找出哪些地方运行正常,哪些地方运行不正常。以下是上次运行时记录的内容(我在运行前截断了日志,以删除无关信息)。

[david@localhost conf.d]$ 清除
[david@localhost conf.d]$ >/tmp/ifup-local.log
[david@localhost conf.d]$ tail -f /tmp/ifup-local.log

--------------------------------------------------

2014-10-01 18:50:0808 调试:路径:/usr/sbin/:/usr/bin/:/sbin:/usr/sbin:/bin:/usr/bin

2014-10-01 18:50:0808 调试:密码:/etc

2014-10-01 18:50:0808 DEBUG:问题文件存在

2014-10-01 18:50:0808 调试:删除旧问题文件

2014-10-01 18:50:0808 调试:问题原始:
 登录到:节点:\n 运行:\S

2014-10-01 18:50:0808 DEBUG:即将检查 IP 号码

2014-10-01 18:50:0808 调试:0

2014-10-01 18:50:0909 调试:show_ip:


2014-10-01 18:50:0909 调试:签出问题文件以锁定它

2014-10-01 18:50:0909 调试:new_issue:
 登录到:节点:\n 运行:\S

        当前 IP 号码:
        ===================



2014-10-01 18:50:0909 DEBUG:问题文件存在

2014-10-01 18:50:0909 调试:已在问题文件中检查


--------------------------------------------------

2014-10-01 18:50:0909 调试:路径:/usr/sbin/:/usr/bin/:/sbin:/usr/sbin:/bin:/usr/bin

2014-10-01 18:50:0909 调试:密码:/etc

2014-10-01 18:50:0909 DEBUG:问题文件存在

2014-10-01 18:50:0909 调试:删除旧问题文件

2014-10-01 18:50:0909 调试:问题原始:
 登录到:节点:\n 运行:\S

2014-10-01 18:50:0909 调试:即将检查 IP 号码

2014-10-01 18:50:0909 调试:0

2014-10-01 18:50:0909 调试:show_ip:


2014-10-01 18:50:0909 调试:签出问题文件以锁定它

2014-10-01 18:50:0909 调试:new_issue:
 登录到:节点:\n 运行:\S

        当前 IP 号码:
        ===================



2014-10-01 18:50:0909 DEBUG:问题文件存在

2014-10-01 18:50:0909 调试:已在问题文件中检查



以下是修改后的脚本,包含所有调试消息:

/bin/bash #!/bin/bash

函数写入调试(){
        msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ;
        echo -e ${msg} >>${LOGFILE} ;
}


################################################
################################################

设置-x;

导出LOGFILE ='/tmp/ifup-local.log';
导出 PATH="/usr/sbin/:/usr/bin/:${PATH}" ;

echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ;
写入调试“路径:${PATH}”;

CD/等;

写入调试“PWD:$(pwd)”;
[[ -a ./issue ]] && write-debug "问题文件存在" || write-debug "不存在现有问题文件" ;
write-debug "删除旧的问题文件";

[[ -a ./issue ]] && unlink ./issue || write-debug "没有要删除的问题文件" ;

问题原始="$(cat./问题原始)" ;
写入调试“问题原始:\n${问题原始}”;

write-debug“即将检查IP号码”;
show_ip="$(ip 地址显示 |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;
#show_ip="$(ip 地址显示 |fgrep 'inet ')" ;
写入调试 $? ;
写入调试“show_ip:\n ${show_ip}”;

write-debug "检出问题文件以锁定它";

[[ -a ./issue ]] && write-debug "问题文件存在" || "没有现有的问题文件" ;
共同-l./问题;
export new_issue="${issue_original}\n\n\t当前 IP 号码:\n\t====================\n${show_ip}\n" ;
写入调试“新问题:\n${新问题}”;
echo -e "${new_issue}" >./问题;

[[ -a ./issue ]] && write-debug "问题文件存在" || "没有现有的问题文件" ;

ci-m-u./问题;

write-debug“已检查问题文件”;

答案1

如果您想在 中显示 IP 地址/etc/issue,那么您可能能够\4在问题文件中使用。从man agetty,在 下ISSUE ESCAPES

4 or 4{interface}

插入指定网络接口的 IPv4 地址(例如:\4{eth0})。如果未指定接口参数,则选择第一个完全配置的(UP、非 LOCALBACK、RUNNING)>接口。如果未找到任何配置的接口,则返回到计算机主机名的 IP 地址。

6 or 6{interface}

与 \4 相同,但适用于 IPv6。

这是agetty from util-linux 2.28.2来自 ubuntu。

答案2

我认为问题出在路径上。ip 命令在 /sbin 目录中。

通常 - 除了 root 用户之外,此目录不在路径中,因此 - 在脚本中使用它可能会导致问题。

尝试使用 /sbin/ip 而不是 ip 命令。

答案3

我找到了答案:在网络更改(从“sudo service network restart”或重新启动)完成之前,“ip”命令无法获取该信息。由于网络更改会导致“/etc/sysconfig/network-scripts/ifup-post”在完成之前运行,进而调用“/sbin/ifup-local”在完成之前运行,因此在自动调用的“/sbin/ifup-local”中调用的“ip”永远无法获得该信息。为了解决这个问题,我将脚本从“/sbin/ifup-local”重命名为“/sbin/update-issue”,并创建了一个异步调用“/sbin/update-issue”的新“/sbin/ifup-local”。现在它可以正常工作了。

=====

/sbin/ifup-本地“:

/bin/sh #!/bin/sh 复制代码

nohup (睡眠 1; /sbin/update-issue) &

=====

/sbin/更新问题“:

/bin/bash #!/bin/bash

函数写入调试(){
        msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ;
        echo -e ${msg} >>${LOGFILE} ;
}


################################################
################################################

设置-x;

导出LOGFILE ='/tmp/ifup-local.log';
导出 PATH="/usr/sbin/:/usr/bin/:${PATH}" ;

echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ;
写入调试“路径:${PATH}”;

CD/等;

写入调试“PWD:$(pwd)”;
[[ -a ./issue ]] && write-debug "问题文件存在" || write-debug "不存在现有问题文件" ;
write-debug "删除旧的问题文件";

[[ -a ./issue ]] && unlink ./issue || write-debug "没有要删除的问题文件" ;

问题原始="$(cat./问题原始)" ;
写入调试“问题原始:\n${问题原始}”;

write-debug“即将检查IP号码”;
show_ip="$(ip 地址显示 |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;
#show_ip="$(ip 地址显示 |fgrep 'inet ')" ;
写入调试 $? ;
写入调试“show_ip:\n ${show_ip}”;

write-debug "检出问题文件以锁定它";

[[ -a ./issue ]] && write-debug "问题文件存在" || "没有现有的问题文件" ;
共同-l./问题;
export new_issue="${issue_original}\n\n\t当前 IP 号码:\n\t====================\n${show_ip}\n" ;
写入调试“新问题:\n${新问题}”;
echo -e "${new_issue}" >./问题;

[[ -a ./issue ]] && write-debug "问题文件存在" || "没有现有的问题文件" ;

ci-m-u./问题;

write-debug“已检查问题文件”;

相关内容