Использование sed для изменения / etc / fstab - PullRequest
5 голосов
/ 02 февраля 2012

Я хотел бы изменить /etc/fstab внутри скрипта. Я хочу добавить атрибут acl в корневой раздел.

Одна fstab строка выглядит следующим образом:

UUID=730aee20-52b7-4920-75cd-d0d995ef2445 /   ext3   errors=remount-ro 0   1

Я хочу изменить его на:

UUID=730aee20-52b7-4920-75cd-d0d995ef2445 /   ext3    acl,errors=remount-ro 0   1

Я подумал: 1. Строка поиска с корневым разделом / 2. вставить acl после /

Как я могу сделать это с помощью sed?

Ответы [ 6 ]

7 голосов
/ 03 февраля 2012

Кому нужен какой-нибудь сторонний инструмент, когда у всех нас есть awk?

awk '$2~"^/$"{$4="acl,"$4}1' OFS="\t" /etc/fstab

Пример вывода

$ awk '$2~"^/$"{$4="acl,"$4}1' OFS="\t" /etc/fstab
/dev/sda2        swap             swap        defaults         0   0
/dev/sda5       /       ext4    acl,defaults    1       1
/dev/sda1        /boot            ext4        defaults         1   2
/dev/sda6        /home            ext4        defaults         1   2
/dev/sdb1        /backup          ext4        defaults         1   2
#/dev/cdrom      /mnt/cdrom       auto        noauto,owner,ro  0   0
/dev/fd0         /mnt/floppy      auto        noauto,owner     0   0
devpts           /dev/pts         devpts      gid=5,mode=620   0   0
proc             /proc            proc        defaults         0   0
tmpfs            /dev/shm         tmpfs       defaults         0   0

Объяснение

  1. $2~"^/$" Поиск во 2-м поле $2, чтобы определить, совпадает ли оно с косой чертой ^/$
  2. {$4="acl,"$4} Если мы увидим совпадение, добавьте acl к началу 4-го поля $4
  3. }1 Это ярлык awk, который эквивалентен print $0, т.е. печатать всю строку (включая любые изменения, которые мы могли внести)
  4. OFS="\t" Установите разделитель поля вывода OFS на вкладку \t. По умолчанию это пробел
  5. /etc/fstab Файл, который мы хотим использовать в качестве ввода
4 голосов
/ 02 февраля 2012

Полагаю, лучшим способом было бы использовать augeas, который является отличным инструментом.С помощью augeas вы можете автоматически анализировать файлы конфигурации, добавлять / удалять / обновлять некоторые поля с помощью XPATH, который используется для навигации по XML.

Вы можете найти все поддерживаемые файлы конфигурации, которые augeas может правильно проанализировать, в следующемкаталог:

/usr/share/augeas/lenses/dist/

Один из файлов - это fstab.aug, который вам нужен.На самом деле вам ничего не нужно делать с этими файлами, это просто для того, чтобы вы знали, что augeas может делать то, что вы хотите:).

# ls /usr/share/augeas/lenses/dist/fstab.aug
/usr/share/augeas/lenses/dist/fstab.aug

Вы также можете посмотреть здесь более подробный пример об изменении/ etc / fstab через augeas.

Пример Augeas

Я думаю, вы можете использовать что-то вроде следующего:

# augtool
augtool> set /files/etc/fstab/1[file='/']/opt[1] "acl"
augtool> set /files/etc/fstab/1[file='/']/opt[2] "errors=remount-ro"
augtool> print /files/etc/fstab/1
/files/etc/fstab/1
/files/etc/fstab/1/spec = "/dev/mapper/system"
/files/etc/fstab/1/file = "/"
/files/etc/fstab/1/vfstype = "ext3"
/files/etc/fstab/1/opt[1] = "acl"
/files/etc/fstab/1/opt[2] = "errors=remount-ro"
/files/etc/fstab/1/dump = "0"
/files/etc/fstab/1/passno = "1"
augtool> save

Если вы хотитеиспользуя augeas в сценарии оболочки, вы можете просто вставить вышеупомянутые команды с ключевым словом augtool, поэтому, если вы хотите изменить первый 'opt' на 'acl', вы должны сделать:

augtool set /files/etc/fstab/1[file='/']/opt[1] "acl"
augtool set /files/etc/fstab/1[file='/']/opt[2] "errors=remount-ro"
augtool save

Посмотрите на оригинальные augeasстраница для более: Домашняя страница Augeas

2 голосов
/ 02 февраля 2012

Добавлена ​​ценность к Уесу - \w вместо [a-zA-Z0-9], \s вместо пробела. И это на самом деле работает:)

sed -e 's:\(.*\)\(/\s*\w*\s*\)\(.*\):\1\2acl,\3:' /etc/fstab
1 голос
/ 03 февраля 2012

Это может работать для вас:

sed 's|^\S*\s\+/\s\+\S*\s\+|&acl,|' /etc/fstab
1 голос
/ 02 февраля 2012

Ну, я не буду спорить, является ли sed подходящим инструментом для работы или нет (я не уверен, что это так), но:

sed 's#( / +[a-zA-Z0-9]+ +)#$1acl,#'

Который должен найти / mount и добавить acl непосредственно перед 2-м полем после точки монтирования.

0 голосов
/ 15 декабря 2012

для меня работает следующее (поиск точки монтирования «/» и добавление «acl» перед «значениями по умолчанию»):

sed -e 's:\(.*\)\(\s/\s\s*\)\(\w*\s*\)\(\w*\s*\)\(.*\):\1\2\3acl,\4\5:' /etc/fstab

для содержимого моего fstab:

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

Он группирует содержимое в пять полей (том, точка монтирования, тип файловой системы, параметры, все остальное), разделенных пробелами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...