Как я могу использовать bash для сбора всех точек монтирования NFS с несколькими файлами конфигурации, чтобы проверить, что каждое монтирование доступно для записи?

Я пытаюсь создать сценарий, который будет динамически находить все точки монтирования NFS, которые должны быть доступны для записи, и проверять, доступны ли они для записи, однако я не могу понять, как подключить точки монтирования к их общим каталогам.

Так, например, у меня есть сервер /etc/auto.master, подобный этому (я очистил некоторые данные):

/etc/auto.master
/nfs1        /etc/auto.nfs1 --ghost
/nfs2        /etc/auto.nfs2 --ghost

И каждый из этих файлов имеет:

/etc/auto.nfs1
home   -rw,soft-intr -fstype=nfs server1:/shared/home
store  -rw,soft-intr -fstype=nfs server2:/shared/store

/etc/auto.nfs2
data   -rw,soft-intr -fstype=nfs oralceserver1:/shared/data
rman   -rw,soft-intr -fstype=nfs oracleserver1:/shared/rman

Я пытаюсь выйти из этого

/nfs1/home
/nfs1/store

/nfs2/data
/nfs2/rman

Без каких-либо ошибочных или прокомментированных записей, попавших в сеть.

Моя попытка кода такова:

#!/bin/bash

for automst in `grep '^/' /etc/auto.master|awk -F" " '{for(i=1;i<=NF;i++){if ($i ~ /etc/){print $i}}}'`;
do echo $automst > /tmp/auto.mst
done

AUTOMST=`cat /tmp/auto.mst`

for mastermount in `grep '^/' /etc/auto.master|awk -F" " '{for(i=1;i<=NF;i++){if ($i ~ /etc/){print $i}}}'`;
do grep . $mastermount|grep -v '#'|awk {'print $1'};
done > /tmp/nfsmounteddirs

for dir in `cat /tmp/nfsmounteddirs`;
do
if [ -w "$dir" ]; then echo "$dir is writeable"; else echo "$dir is not writeable!";fi
done

У меня 600 серверов Linux, и многие из них имеют свои собственные индивидуальные настройки NFS, и у нас нет решения для оповещения, которое могло бы проверять, и хотя наличие всех этих отдельных сценариев было бы «решением», управлять им было бы кошмаром. много работы, поэтому динамический аспект был бы очень полезен.

В вашем коде есть много простых проблем с надежностью, которых легко избежать — попробуйте shellcheck.net в будущем. Для этой задачи в любом случае имеет смысл перейти на чистый Awk, как в ответе, который вы уже получили.

tripleee 18.12.2020 18:34
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
awk '/^// {  # Process where lines begin with a /
             fil=$2; # Track the file name
             nfs=$1 # Track the nfs
             while (getline line < fil > 0) { # Read the fil specified by fil till the end of the file
                 split(line,map,","); # Split the lines in array map with , as the delimiter
                 split(map[1],map1,/[[:space:]]+/); # Further split map into map1 with spaces as the delimiter
                 if (map1[2]~/w/ && line !~ /^#/) { 
                   print nfs" "map1[1] # If w is in the permissions string and the line doesn't begin with a comment, print the nfs and share 
                 } 
             } 
             close(fil) # Close the file after we have finished reading
            }' /etc/auto.master

Один лайнер:

awk '/^// { fil=$2;nfs=$1;while (getline line < fil > 0) { split(line,map,",");split(map[1],map1,/[[:space:]]+/);if (map1[2]~/w/ && line !~ /^#/) { print nfs" "map1[1] } } close(fil) }' /etc/auto.master

Выход:

/nfs1 home
/nfs1 store
/nfs2 data
/nfs2 rman

Другие вопросы по теме