CentOS 7:獲取介面 IP 編號
我正在嘗試在 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 命令。