Я пытаюсь автоматически заполнить / etc / issue в образе CentOS 7 (это будет шаблон, и должно быть легко идентифицировать полученные виртуальные машины с первого взгляда).
В моем / sbin / ifup-local есть следующее:
#!/bin/bash cd /etc ; unlink ./issue ; sleep 1 ; issue_original="$(cat ./issue-original)" ; show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ; co -l ./issue ; echo -e "${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" >./issue ; ci -m -u ./issue ;
Файл / etc / issue-original выглядит так:
Logging into: Node: \\n Running: \\S
Когда я запускаю скрипт вручную (sudo / sbin / ifup-local; кот / etc / issue), он правильно заполняет / etc / issue. Когда это запускается автоматически (например, когда это результат перезапуск сети службы sudo; кот / etc / issue), файл-шаблон и статический текст есть, но номера IP пусты (даже не пустые строки).
Я неправильно понимаю порядок выполнения (выполняется ли ifup-local до присвоения IP-адресов)? Похоже, это находится в самом конце / etc / sysconfig / network-scripts / ifup-post, поэтому я предполагаю, что это происходит после того, как клиент DHCP установил интерфейсы.
Есть ли задержка между установкой IP-номеров интерфейса и тем, что команда "ip" знает о них? Утверждение "сна" здесь, потому что я думал, что это может быть так.
Приветствуются любые указатели в правильном направлении.
Счастливое воскресенье!
==========================
Редактировать:
Вот что я увидел в / etc / issue после перезапуска сетевой службы.
[david@localhost ~]$ sudo service network restart Restarting network (via systemctl): [ OK ] [david@localhost ~]$ cat /etc/issue Logging into: Node: \n Running: \S Current IP Numbers: =================== [david@localhost ~]$
Кроме того, я снабдил скрипт подробными отладочными сообщениями, чтобы узнать, где что-то работает, а где не работает. Вот что было зарегистрировано при последнем запуске (я обрезал журнал перед запуском, чтобы удалить постороннюю информацию).
[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: issue file exists 2014-10-01 18:50:0808 DEBUG: Removing old issue file 2014-10-01 18:50:0808 DEBUG: issue_original: Logging into: Node: \n Running: \S 2014-10-01 18:50:0808 DEBUG: about to check the IP numbers 2014-10-01 18:50:0808 DEBUG: 0 2014-10-01 18:50:0909 DEBUG: show_ip: 2014-10-01 18:50:0909 DEBUG: checking out issue file to lock it 2014-10-01 18:50:0909 DEBUG: new_issue: Logging into: Node: \n Running: \S Current IP Numbers: =================== 2014-10-01 18:50:0909 DEBUG: issue file exists 2014-10-01 18:50:0909 DEBUG: checked back in issue file -------------------------------------------------- 2014-10-01 18:50:0909 DEBUG: 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: issue file exists 2014-10-01 18:50:0909 DEBUG: Removing old issue file 2014-10-01 18:50:0909 DEBUG: issue_original: Logging into: Node: \n Running: \S 2014-10-01 18:50:0909 DEBUG: about to check the IP numbers 2014-10-01 18:50:0909 DEBUG: 0 2014-10-01 18:50:0909 DEBUG: show_ip: 2014-10-01 18:50:0909 DEBUG: checking out issue file to lock it 2014-10-01 18:50:0909 DEBUG: new_issue: Logging into: Node: \n Running: \S Current IP Numbers: =================== 2014-10-01 18:50:0909 DEBUG: issue file exists 2014-10-01 18:50:0909 DEBUG: checked back in issue file
Вот исправленный сценарий со всеми отладочными сообщениями:
#!/bin/bash function write-debug() { msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ; echo -e ${msg} >>${LOGFILE} ; } ################################################ ################################################ set -x ; export LOGFILE='/tmp/ifup-local.log' ; export PATH="/usr/sbin/:/usr/bin/:${PATH}" ; echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ; write-debug "PATH: ${PATH}" ; cd /etc ; write-debug "PWD: $(pwd)" ; [[ -a ./issue ]] && write-debug "issue file exists" || write-debug "no existing issue file" ; write-debug "Removing old issue file" ; [[ -a ./issue ]] && unlink ./issue || write-debug "no issue file to remove" ; issue_original="$(cat ./issue-original)" ; write-debug "issue_original:\n${issue_original}" ; write-debug "about to check the IP numbers" ; show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ; #show_ip="$(ip addr show |fgrep 'inet ')" ; write-debug $? ; write-debug "show_ip:\n ${show_ip}" ; write-debug "checking out issue file to lock it" ; [[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ; co -l ./issue ; export new_issue="${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" ; write-debug "new_issue:\n${new_issue}" ; echo -e "${new_issue}" >./issue ; [[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ; ci -m -u ./issue ; write-debug "checked back in issue file" ;
Если вы хотите показать IP-адрес в /etc/issue
, тогда вы сможете использовать \4
в файле проблемы. Из man agetty
, под ISSUE ESCAPES
:
4 or 4{interface}
Вставьте IPv4-адрес указанного сетевого интерфейса (например: \ 4 {eth0}). Если аргумент интерфейса не указан, выберите первый полностью сконфигурированный (UP, non-LOCALBACK, RUNNING)> интерфейс. Если не найдено ни одного настроенного интерфейса, вернитесь к IP-адресу имени хоста машины.
6 or 6{interface}
То же, что \ 4, но для IPv6.
Это agetty from util-linux 2.28.2
из убунту.
Я нашел ответ: информация недоступна команде "ip" до тех пор, пока не будет выполнено изменение сети (от "перезапуска сети службы sudo" или перезагрузки). Поскольку изменение сети приводит к запуску "/ etc / sysconfig / network-scripts / ifup-post" до его завершения, который, в свою очередь, вызывает "/ sbin / ifup-local" для запуска до его завершения, "ip "вызываемый из" / sbin / ifup-local "вызываемый автоматически, никогда не может иметь эту информацию. Чтобы решить эту проблему, я переименовал сценарий из «/ sbin / ifup-local» в «/ sbin / update-issue» и создал новый «/ sbin / ifup-local», который асинхронно вызывает «/ sbin / update-issue». . Теперь это работает.
=====
"/ sbin / ifup-местные":
#!/bin/sh nohup (sleep 1 ; /sbin/update-issue) &
=====
"/ sbin / обновление-проблема":
#!/bin/bash function write-debug() { msg="$(date +'%Y-%m-%d %H:%M:%S%S')\tDEBUG:\t$1\n" ; echo -e ${msg} >>${LOGFILE} ; } ################################################ ################################################ set -x ; export LOGFILE='/tmp/ifup-local.log' ; export PATH="/usr/sbin/:/usr/bin/:${PATH}" ; echo -e "\n--------------------------------------------------\n" >>${LOGFILE} ; write-debug "PATH: ${PATH}" ; cd /etc ; write-debug "PWD: $(pwd)" ; [[ -a ./issue ]] && write-debug "issue file exists" || write-debug "no existing issue file" ; write-debug "Removing old issue file" ; [[ -a ./issue ]] && unlink ./issue || write-debug "no issue file to remove" ; issue_original="$(cat ./issue-original)" ; write-debug "issue_original:\n${issue_original}" ; write-debug "about to check the IP numbers" ; show_ip="$(ip addr show |awk '$1=="inet" && $2 !~ /^127/ {print "\t"$2}')" ; #show_ip="$(ip addr show |fgrep 'inet ')" ; write-debug $? ; write-debug "show_ip:\n ${show_ip}" ; write-debug "checking out issue file to lock it" ; [[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ; co -l ./issue ; export new_issue="${issue_original}\n\n\tCurrent IP Numbers:\n\t===================\n${show_ip}\n" ; write-debug "new_issue:\n${new_issue}" ; echo -e "${new_issue}" >./issue ; [[ -a ./issue ]] && write-debug "issue file exists" || "no existing issue file" ; ci -m -u ./issue ; write-debug "checked back in issue file" ;
Я думаю, что проблема в пути. Команда ip находится в каталоге / sbin.
Обычно - этот каталог не находится в пути, кроме пользователя root, поэтому - использование его в скриптах может вызвать проблемы.
Попробуйте использовать / sbin / ip вместо команды ip.