我试图在CentOS 7映像中自动填充/ etc / issue(这将是一个模板,并且一眼就能很容易地识别出结果的虚拟机)。
我在/ sbin / ifup-local中有以下内容:
#!/斌/庆典 cd / etc; 取消链接./issue; 睡觉1; issue_original =“$(cat ./issue-original)”; show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”; 合伙人/组织 echo -e“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”> 。/问题 ; ci -m -u ./issue;
/ etc / issue-original看起来像:
login到: 节点:\\ n 运行:\\ S
当我手工运行脚本( sudo / sbin / ifup-local; cat / etc / issue )时,它会正确地填充/ etc / issue。 当这是自动运行的(例如,当它是sudo服务networking重新启动的结果;猫/ etc /问题 ),文件模板和静态文本在那里,但IP号码是空的(甚至不是空行)。
我误解了执行的顺序(是否在本地执行IP号码分配之前)? 它看起来像是在/ etc / sysconfig / network-scripts / ifup-post的末尾,所以我会假设它是在DHCP客户端设置接口之后。
在设置接口IP号码和“ip”命令知道它们之间有没有延迟? “睡眠”声明在那里,因为我认为可能是这样的。
任何正确的方向指针非常赞赏。
快乐星期天!
==========================
编辑:
这是我在重新启动networking服务后在/ etc / issue中看到的。
[david @ localhost〜] $ sudo服务networking重启 重新启动networking(通过systemctl):[OK] [david @ localhost〜] $ cat / etc / issue login到: 节点:\ n 运行:\ S 当前的IP号码: =================== [david @ localhost〜] $
另外,我还用大量的debugging信息来检测脚本,find事情发生的地方,并且不能正常工作。 这是最后一次运行时logging的内容(我在运行前截断了日志,删除了无关的信息)。
[david @ localhost conf.d] $ clear [david @ localhost conf.d] $> /tmp/ifup-local.log [david @ localhost conf.d] $ tail -f /tmp/ifup-local.log -------------------------------------------------- 2014-10-01 18:50:0808 DEBUG:PATH:/ usr / sbin /:/ usr / bin /:/ sbin:/ usr / sbin:/ bin:/ usr / bin 2014-10-01 18:50:0808 DEBUG:PWD:/ etc 2014-10-01 18:50:0808 DEBUG:存在问题文件 2014-10-01 18:50:0808 DEBUG:删除旧的问题文件 2014-10-01 18:50:0808 DEBUG:issue_original: login到:节点:\ n运行:\ S 2014-10-01 18:50:0808 DEBUG:即将检查IP号码 2014-10-01 18:50:0808 DEBUG:0 2014-10-01 18:50:0909 DEBUG:show_ip: 2014-10-01 18:50:0909 DEBUG:检出问题文件来locking它 2014-10-01 18:50:0909 DEBUG:new_issue: login到:节点:\ n运行:\ S 当前的IP号码: =================== 2014-10-01 18:50:0909 DEBUG:存在问题文件 2014-10-01 18:50:0909 DEBUG:在问题文件中检查 -------------------------------------------------- 2014-10-01 18:50:0909debugging:path:/ usr / sbin /:/ usr / bin /:/ sbin:/ usr / sbin:/ bin:/ usr / bin 2014-10-01 18:50:0909 DEBUG:PWD:/ etc 2014-10-01 18:50:0909 DEBUG:存在问题文件 2014-10-01 18:50:0909 DEBUG:删除旧的问题文件 2014-10-01 18:50:0909 DEBUG:issue_original: login到:节点:\ n运行:\ S 2014-10-01 18:50:0909 DEBUG:即将检查IP号码 2014-10-01 18:50:0909 DEBUG:0 2014-10-01 18:50:0909 DEBUG:show_ip: 2014-10-01 18:50:0909 DEBUG:检出问题文件来locking它 2014-10-01 18:50:0909 DEBUG:new_issue: login到:节点:\ n运行:\ S 当前的IP号码: =================== 2014-10-01 18:50:0909 DEBUG:存在问题文件 2014-10-01 18:50:0909 DEBUG:在问题文件中检查
这里是修改后的脚本,包含所有的debugging信息:
#!/斌/庆典 函数write-debug(){ msg =“$(date +'%Y-%m-%d%H:%M:%S%S')\ tDEBUG:\ t $ 1 \ n”; echo -e $ {msg} >> $ {LOGFILE}; } ################################################ ################################################ 设置-x; export LOGFILE ='/ tmp / ifup-local.log'; export PATH =“/ usr / sbin /:/ usr / bin /:$ {PATH}”; echo -e“\ n -------------------------------------------- ------ \ n“>> $ {LOGFILE}; 写入debugging“path:$ {path}”; cd / etc; write-debug“PWD:$(pwd)”; [[-a ./issue]] && write-debug“问题文件存在”|| 写入debugging“不存在的问题文件”; 写入debugging“删除旧的问题文件”; [[-a ./issue]] && unlink ./issue || 写入debugging“没有问题的文件删除”; issue_original =“$(cat ./issue-original)”; write-debug“issue_original:\ n $ {issue_original}”; 写 - debugging“即将检查的IP号码”; show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”; #show_ip =“$(ip addr show | fgrep'inet')”; 写debugging$? ; write-debug“show_ip:\ n $ {show_ip}”; 写入debugging“检出问题文件来locking它”; [[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”; 合伙人/组织 export new_issue =“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”; write-debug“new_issue:\ n $ {new_issue}”; echo -e“$ {new_issue}”> ./问题; [[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”; ci -m -u ./issue; 写入debugging“在问题文件中检查”;
如果您想在/etc/issue
显示IP地址,那么您可以在问题文件中使用\4
。 从man agetty
来看,
4 or 4{interface}
插入指定networking接口的IPv4地址(例如:\ 4 {eth0})。 如果未指定interface参数,则select第一个完全configuration的(UP,非LOCALBACK,RUNNING)>接口。 如果未find任何已configuration的接口,请回退到机器主机名的IP地址。
6 or 6{interface}
与\ 4相同,但对于IPv6。
这是从Ubuntu的agetty from util-linux 2.28.2
。
我认为这个问题是在路上。 ip命令在/ sbin目录下。
通常 – 这个目录不在root用户之外,所以在脚本中使用它可能会导致问题。
尝试使用/ sbin / ip而不是ip命令。
我find了答案:直到networking更改(从“sudo服务networking重新启动”或重新启动)完成之前,信息不可用于“ip”命令。 因为networking的改变导致“/ etc / sysconfig / network-scripts / ifup-post”在完成之前运行,在完成之前依次调用“/ sbin / ifup-local”来运行“ip “自动调用”/ sbin / ifup-local“内部调用永远不会有这些信息。 为了解决这个问题,我把脚本从“/ sbin / ifup-local”重命名为“/ sbin / update-issue”,并创build了一个新的“/ sbin / ifup-local”asynchronous调用“/ sbin / update-issue” 。 现在起作用了。
=====
“ / sbin / ifup-local ”:
#!/ bin / sh的 nohup(sleep 1; / sbin / update-issue)&
=====
“ / sbin / update-issue ”:
#!/斌/庆典 函数write-debug(){ msg =“$(date +'%Y-%m-%d%H:%M:%S%S')\ tDEBUG:\ t $ 1 \ n”; echo -e $ {msg} >> $ {LOGFILE}; } ################################################ ################################################ 设置-x; export LOGFILE ='/ tmp / ifup-local.log'; export PATH =“/ usr / sbin /:/ usr / bin /:$ {PATH}”; echo -e“\ n -------------------------------------------- ------ \ n“>> $ {LOGFILE}; 写入debugging“path:$ {path}”; cd / etc; write-debug“PWD:$(pwd)”; [[-a ./issue]] && write-debug“问题文件存在”|| 写入debugging“不存在的问题文件”; 写入debugging“删除旧的问题文件”; [[-a ./issue]] && unlink ./issue || 写入debugging“没有问题的文件删除”; issue_original =“$(cat ./issue-original)”; write-debug“issue_original:\ n $ {issue_original}”; 写 - debugging“即将检查的IP号码”; show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”; #show_ip =“$(ip addr show | fgrep'inet')”; 写debugging$? ; write-debug“show_ip:\ n $ {show_ip}”; 写入debugging“检出问题文件来locking它”; [[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”; 合伙人/组织 export new_issue =“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”; write-debug“new_issue:\ n $ {new_issue}”; echo -e“$ {new_issue}”> ./问题; [[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”; ci -m -u ./issue; 写入debugging“在问题文件中检查”;