Это был известный недостаток инструментов GNU inetutils ifconfig
и NET -3 net -ifconfig
в течение длительного времени. Если ваш интерфейс имеет несколько IP-адресов версии 4, как в случае, если он имеет назначенный DHCP -и локальный адрес -, эти два ifconfigs
покажут вам только один из адресов, в в этом случае ссылка -локальная. Кроме того, утилита GNU inetutils ifconfig
вообще не покажет вам никаких IP-адресов версии 6 для интерфейса.
В этих инструментах эта проблема не рассматривалась более десяти лет. Люди сделали патчи для этого, в том числе один в 2009 году для NET -3 net -tools one. Через 4 года оно дошло до Бернда Эккенфельса , который так и не принял его .
Наличие второй ссылки -локального IP-адреса версии 4 в 169.254.0.0/16 в дополнение к «маршрутизируемому» в 192.168.0.0/16 на самом деле не является проблемой для самого сетевого интерфейса, и вы может оставить вашу систему сконфигурированной таким образом, с (, как вы заметили, )незначительный или вообще не -вредный -эффект, если не более одного сетевого интерфейса. Помимо удивления для вас, что ваша система имеет этот адрес, и что она имеет сопутствующий маршрут и будет привязывать локальные сокеты к этому адресу при попытке подключения к другой ссылке -местные адреса,это действительно только значительная проблема для этих двух ifconfig
инструментов .
Как вы заметили, ip
покажет вам все адреса IPv4.
Так и мой ifconfig
.
Используя ответ @Archemar, я использовал следующий код, который у меня сработал! Спасибо, что указали, что удаление _приведет к ошибке.
awk -F\: '/^#/{next}''{system("chown " $1" " $6)}' /etc/passwd
последний файл можно обработать в bash таким образом:
cat YOURFILE | \
while read CMD; do
field1=${CMD% *}; # take first field
field2=${CMD#* }; # take second field
echo do $field1 with $field2; # do something with it
done
Таким образом, вы должны заменить эхо на соответствующую команду chown, чтобы заставить его работать. Взято из Построчное чтение в скрипте bash
Я не уверен в том, что вы намерены удалить интерлиньяж, _
это может привести к chown: _user not found
, когда chown
будет
попробуй
awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd
где
-F:
указать awk использовать :
в качестве разделителя /^#/ { next }
пропустить строку, начинающуюся с#
/^_/ { next }
для пропуска строки, начинающейся с _
(, если необходимо)Если результат выглядит нормально, просто подключитесь кbash
Вам не нужна куча других команд и конвейеров, когда вы используете awk. Как правильно писать:
cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}'
это:
awk -F':' '!/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd
и затем использовать этот вывод в оболочке (немного изменил команду awk для получения:
-разделенного вывода, поскольку он имеет:
-разделенный ввод, и поэтому в поле ввода не должно быть :
s значения):
while IFS=':' read -r user dir; do
echo chown -- "$user" "$dir"
done < <(awk 'BEGIN{FS=OFS=":"} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd)
или, если хотите,:
awk 'BEGIN{FS=":"; OFS=ORS} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd |
xargs -n 2 bash -c 'echo chown "$1" "$2"' bash
Удалите echo
, когда вы закончите тестирование и захотите выполнить его на самом делеchown
Одним из способов может быть
cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | cut -d: -f1,6 | xargs -L -t chown
При этом я не переписывал ваш пайплайн, а дополнял его.