我正在尝试在 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“已检查问题文件”;