нужно дать некоторым юзерам в системе добавлять и задавать пароли пользователям(стоит postfix, необходимо дать доступ создавать новые почтовые ящики)чтобы случайно не изменили пароли на рута, администраторов и системных пользователей, (их логины поместил в файлик danger)нужно сделать скрипт, который бы потом запускался из под sudo(sudo script имя_пользователя вместо passwd имя_пользователя),но проверял на запрещенные логины в файле danger, сделал такой скрипт
#!/bin/sh
flag=true
echo $flag
cut -f1 danger | while read NAME
do
if [ $flag = "false" ]; then
break
elif [ "$1" = "$NAME" ]; then
flag=false
echo $flag
fi
echo $flag
done
# vivodim i zapuskaem proverku
echo $flag
if [ "$flag" = "true"]; then
passwd $1
echo parol $1 izmenen
else
echo net dostupa
exit
(echo поставил для проверки состояния $flag, в рабочем скрипте уберу)но проблема в том, что при выходе из цикла в любом случае переменная сбрасывается на true, подскажите что не так делаю или альтернативные варианты решения проблемы в bash
Ммм... Если все равно выполняете скрипт под sudo, то почему бы так и не указывать в sudoers:informix ALL=(ALL) NOPASSWD: /usr/sbin/useradd, /usr/sbin/usermod, /bin/passwd, !/bin/passwd root, !/bin/passwd sinitsa, /bin/chmod, /bin/chown
в этом примере пользователю informix дозволяется вызывать passwd под sudo кроме тех случаев, когда passwd запускается с параметром root или sinitsa
в вашем бы случае я написал бы скрипт так:
#!/bin/bashgrep -qEe "^$1\W*" danger
[ $? -eq 0 ] && exit
passwd $1То есть, grep-ом проверяем наличие в файле danger логина пользователя и если его там нет, выполняем passwd
>Ммм... Если все равно выполняете скрипт под sudo, то почему бы так
>и не указывать в sudoers:
>
>informix ALL=(ALL)
> NOPASSWD: /usr/sbin/useradd, /usr/sbin/usermod, /bin/passwd, !/bin/passwd root, !/bin/passwd sinitsa,
>/bin/chmod, /bin/chown
>
>в этом примере пользователю informix дозволяется вызывать passwd под sudo кроме тех
>случаев, когда passwd запускается с параметром root или sinitsa
>
>в вашем бы случае я написал бы скрипт так:
>#!/bin/bash
>
>grep -qEe "^$1\W*" danger
>[ $? -eq 0 ] && exit
>passwd $1
>
>То есть, grep-ом проверяем наличие в файле danger логина пользователя и если
>его там нет, выполняем passwdспасибо за совет по поводу grep, послеучтения всех пожеланий, решил сделать таким образом:
ravno=`grep $1 danger`
if [ "$1" != "$ravno" ]; then
/usr/bin/passwd $1
echo $1 izmenen
echo `date` $1 izmenen
else
echo `date` net dostupa
fiоднако учитывая, что скрипт выполняется под sudo возникла необходимость исключить такую ошибку, когда после скрипта ничего не вводится, и возникает опасность изменить пароль на рута(sudo passwd), поэтому добавил в начало скрипта такое условие:
if [ $1 = ]; then
echo `date` ne zadano imya
exit 0
fi
При выполнении скрипта без ввода данных, все проходит нормально, когда вводится новое имя пользователя после скрипта, все работает нормально, однако выдает такое сообщение:
./passwd.sh: line 3: [: test(вводимое имя): unary operator expectedподскажите, как устранить, ввод $1 в кавычки и тд не помогают
>if [ $1 = ]; then
>echo `date` ne zadano imya
>exit 0
>fi
>При выполнении скрипта без ввода данных, все проходит нормально, когда вводится новое
>имя пользователя после скрипта, все работает нормально, однако выдает такое сообщение:
>
>./passwd.sh: line 3: [: test(вводимое имя): unary operator expected
>
>подскажите, как устранить, ввод $1 в кавычки и тд не помогаютрешил проблему, заменив на if [ -z "$1" ]
>>if [ $1 = ]; then
>>echo `date` ne zadano imya
>>exit 0
>>fi
>>При выполнении скрипта без ввода данных, все проходит нормально, когда вводится новое
>>имя пользователя после скрипта, все работает нормально, однако выдает такое сообщение:
>>
>>./passwd.sh: line 3: [: test(вводимое имя): unary operator expected
>>
>>подскажите, как устранить, ввод $1 в кавычки и тд не помогают
>
>решил проблему, заменив на if [ -z "$1" ]
как вариант
if [ $# -ne 1 ];then
echo `date` ne zadano imya
exit 0
fi