CentOS 7:获取接口IP号码

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