Как динамически менять владельца каталога с помощью вывода awk?

Это был известный недостаток инструментов 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.

Дополнительная литература

0
16.07.2020, 16:25
5 ответов

Используя ответ @Archemar, я использовал следующий код, который у меня сработал! Спасибо, что указали, что удаление _приведет к ошибке.

awk -F\: '/^#/{next}''{system("chown " $1" " $6)}' /etc/passwd

-1
18.03.2021, 23:19

последний файл можно обработать в 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

1
18.03.2021, 23:19

Я не уверен в том, что вы намерены удалить интерлиньяж, _это может привести к chown: _user not found, когда chownбудет

попробуй

awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd

где

  • -F:указать awk использовать :в качестве разделителя
  • /^#/ { next }пропустить строку, начинающуюся с#
  • аналогично добавить /^_/ { next }для пропуска строки, начинающейся с _(, если необходимо)
  • Команда печати следующего шаблона/действия.

Если результат выглядит нормально, просто подключитесь кbash

1
18.03.2021, 23:19

Вам не нужна куча других команд и конвейеров, когда вы используете 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

0
18.03.2021, 23:19

Одним из способов может быть

cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | cut -d: -f1,6 | xargs -L -t chown

При этом я не переписывал ваш пайплайн, а дополнял его.

0
18.03.2021, 23:19

Теги

Похожие вопросы