Я пытаюсь создать сценарий, который будет динамически находить все точки монтирования 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, и у нас нет решения для оповещения, которое могло бы проверять, и хотя наличие всех этих отдельных сценариев было бы «решением», управлять им было бы кошмаром. много работы, поэтому динамический аспект был бы очень полезен.
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
В вашем коде есть много простых проблем с надежностью, которых легко избежать — попробуйте shellcheck.net в будущем. Для этой задачи в любом случае имеет смысл перейти на чистый Awk, как в ответе, который вы уже получили.