Linux

CentOS 7:獲取介面 IP 編號

  • June 19, 2017

我正在嘗試在 CentOS 7 映像中自動填充 /etc/issue(這將是一個模板,並且需要一眼就能輕鬆辨識生成的虛擬機)。

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

#!/bin/bash

光碟/等;
取消連結 ./issue ;

睡覺 1;

issue_original="$(cat ./issue-original)" ;
show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;

co -l ./問題;
echo -e "${issue_original}\n\n\t目前 IP 號碼:\n\t===================\n${show_ip}\n" > 。/問題 ;
ci -m -u ./問題;

/etc/issue-original 看起來像:


登錄:

節點:\\n
執行:\\S

當我手動執行腳本(sudo /sbin/ifup-local ; cat /etc/issue)時,它會正確填充 /etc/issue。當它自動執行時(例如它是sudo service network restart ; cat /etc/issue的結果),文件模板和靜態文本在那裡,但 IP 號是空的(甚至不是空行)。

我是否誤解了執行順序(ifup-local 在分配 IP 編號之前執行)?看起來這是在 /etc/sysconfig/network-scripts/ifup-post 的最後,所以我假設它是在 DHCP 客戶端設置介面之後。

設置介面 IP 號和“ip”命令知道它們之間是否有延遲?“睡眠”聲明在那裡,因為我認為可能是這種情況。

非常感謝任何正確方向的指針。

快樂星期天!

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

編輯:

這是我在重新啟動網路服務後在 /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 調試:密碼:/等

2014-10-01 18:50:0808 調試:問題文件存在

2014-10-01 18:50:0808 調試:刪除舊問題文件

2014-10-01 18:50:0808 調試:issue_original:
登錄:節點:\n 執行:\S

2014-10-01 18:50:0808 調試:即將檢查 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 調試:新問題:
登錄:節點:\n 執行:\S

目前 IP 號碼:
===================



2014-10-01 18:50:0909 調試:問題文件存在

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 調試:密碼:/等

2014-10-01 18:50:0909 調試:問題文件存在

2014-10-01 18:50:0909 調試:刪除舊問題文件

2014-10-01 18:50:0909 調試:issue_original:
登錄:節點:\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 調試:新問題:
登錄:節點:\n 執行:\S

目前 IP 號碼:
===================



2014-10-01 18:50:0909 調試:問題文件存在

2014-10-01 18:50:0909 調試:簽回問題文件

這是修改後的腳本,包含所有調試消息:

#!/bin/bash

功能寫調試(){
msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ;
迴聲 -e ${msg} >>${LOGFILE} ;
}


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

設置 -x ;

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

echo -e "\n-------------------------------------------- ------\n" >>${LOGFILE} ;
寫調試“PATH:${PATH}”;

光碟/等;

寫調試“密碼:$(密碼)”;
[[ -a ./issue ]] && write-debug "問題文件存在" || write-debug "沒有現有的問題文件" ;
write-debug "刪除舊問題文件" ;

[[ -a ./issue ]] && 取消連結 ./issue || write-debug "沒有要刪除的問題文件" ;

issue_original="$(cat ./issue-original)" ;
寫調試 "issue_original:\n${issue_original}" ;

write-debug "即將檢查 IP 號碼" ;
show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ;
#show_ip="$(ip addr show |fgrep 'inet')" ;
寫調試 $? ;
寫調試 "show_ip:\n ${show_ip}" ;

write-debug "簽出問題文件以鎖定它" ;

[[ -a ./issue ]] && write-debug "問題文件存在" || “沒有現有的問題文件”;
co -l ./問題;
export new_issue="${issue_original}\n\n\t目前IP號碼:\n\t===================\n${show_ip}\n" ;
寫調試 "new_issue:\n${new_issue}" ;
echo -e "${new_issue}" >./issue ;

[[ -a ./issue ]] && write-debug "問題文件存在" || “沒有現有的問題文件”;

ci -m -u ./問題;

write-debug "簽回問題文件" ;

如果要在 中顯示 IP 地址/etc/issue,則可以\4在問題文件中使用。從man agetty, 在ISSUE ESCAPES:

4 or 4{interface}

插入指定網路介面的 IPv4 地址(例如:\4{eth0})。如果未指定 interface 參數,則選擇第一個完全配置的 (UP, non-LOCALBACK, RUNNING) >interface。如果未找到任何已配置的介面,則回退到機器主機名的 IP 地址。

6 or 6{interface}

與 \4 相同,但適用於 IPv6。

這是agetty from util-linux 2.28.2來自ubuntu。

我認為這個問題正在解決。ip 命令位於 /sbin 目錄中。

通常 - 此目錄不在除 root 使用者之外的路徑中,因此 - 在腳本中使用它可能會導致問題。

嘗試使用 /sbin/ip 而不是 ip 命令。

引用自:https://serverfault.com/questions/631899