Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
Этот процесс длится до тех пор, пока все имена пользователей не будут просмотрены. При этом имя пользователя сравнивается со значением переменной USER. Если при просмотре всего файла совпадение не установлено, конструкция test в конце программного кода проверяет значение переменной FOUND. Если значением переменной является "ложь", пользователю отказывается в дальнейшей работе.
Если в процессе выполнения цикла while устанавливается искомое соответствие, переменной found присваивается значение "истина". Затем с помощью конструкции case выбираются права доступа. При этом возвращается 1 для обычных прав доступа либо 0 — для расширенных прав доступа.
Когда пользователь приступает к внесению изменений в запись или к удалению записи, выполняется проверка. Этот процесс основывается на коде возврата функции, описанном выше. В приведенном сценарии либо выполняется сортировка файла passwd, либо отображается каталог:
if user_level; then
sort /etc/passwd
else
restrict
fi
Функция restrict просто выводит на экран сообщение о нарушении прав доступа.
Вышеприведенная проверка может быть реализована за один цикл. Однако кодирование выглядит более привлекательно, если применяется метод работы с двумя файлами. В результате значительно облегчается отладка кода.
Чтобы выйти из меню, пользователь выбирает пункт q или Q, в результате чего вызывается функция для очистки экрана. Когда пользователь завершает работу с любым обширным сценарием, очень удобно в этом случае воспользоваться функцией. Это позволяет увеличить количество команд, выполняемых пользователем при завершении работы. Кроме того, значительно улучшается читабельность кода.
Ниже приводится соответствующий сценарий.
$ pg menu2
#!/bin/sh
#menu2
#СЦЕНАРИЙ ГЛАВНОГО МЕНЮ
#игнорирование CTRL-C и прерывания QUIT
trap "" 2 3 15
MYDATE=`date +%d/%m/%Y`
THIS_HOST=`hostname -s`
USER=`whoami`
#файл, описывающий права доступа пользователя USER_LEVELS=priv.user
#файл для хранения
HOLDl=holdl.$$
#функция задания цвета
colour
{
# формат цвет_фона; цвет_переднего_планаm
case $1 in
black_green)
echo '^[[40;32m' ;;
black yellow)
echo '^[[40;33m' ;;
black_white)
echo '^[[40;37m' ;;
Ьlаск_суап)
echo '^[[40;36m' ;;
red_yellow)
echo '^[[41;33m' ;;
esac
}
# чтение значения клавиши
get_char
(
#get_char
#сохранение текущих установок stty SAVEDSTTY=`stty -g`
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -cbreak
# восстановление установок stty
stty $SAVEDSTTY
}
# отображение или сокрытие курсора
cursor
{
#cursor
#отображение/сокрытие курсора
_OPT=$1
case $_OPT in
on) echo '^[[?25h';;
off) echo '^[[?251';;
*) return 1;;
esac }
# проверка прав доступа пользователя
restrict
{
colour red_yellow
echo -e -n "\n\n\007Sorry you are not authorised to use this function"
colour black_green
}
user_level {
# user level
# просмотр файла priv.user
while read LINE
do
case $LINE in
# игнорирование комментариев
\#*);;
*) echo $LINE >> $HOLD1 ;;
esac
done < $USER_LEVELS
FOUND=false
while read MENU_USER PRIV
do
if [ "$MENU_USER"="$USER" ]; then
FOUND=true
case $PRIV in
yes|YES)
return 0 ;;
no|NO)
return 1 ;;
esac
else
# соответствие не найдено, чтение следующей записи
continue
fi
done <$HOLD1
if [ "$FOUND"="false" ]; then
echo "Sorry $USER you have not been authorised to use this menu"
exit 1
fi
}
# вызывается, если пользователь выполняет выход из программы
my_exit
{
#my_exit
#вызывается, если пользователь выбирает выход из сценария!
colour black_white
cursor on
rm *.$$
exit 0
}
tput init
# отображение на экране уровня доступа пользователя
if user_level; then
ACCESS="Access Mode ls High"
else
ACCES3="Access Mode ls Normal"
fi
tput init
while :
do
tput clear
colour black_green
cat < MAYDAY
$ACCESS
MAYDAY
colour black_cyan
echo -e -n "\tYour Choice [1,2,3,4,5,P, H,Q] >"
@ read CHOICE
CHOICE=`get_char`
case $CHOICE in
1) ls ;;
2) vi ;;
3) who ;;
if userlevel; then
ls -l |wc
else
restrict
fi ;;
5)
if userlevel; then
sort /etc/passwd
else
restrict
fi ;;
esac
echo -e -n "\tHit the return key to continue"
read DUMMY
done
Подобное меню можно вызвать с помощью команды exec (из файла profile). Пользователи не могут изменить эту последовательность действий. Такой подход распространен в случае с пользователями, работающими только с приложениями UNIX или Linux и не использующими возможности интерпретатора shell.
21.3. Заключение
Команда tput позволяет значительно улучшить контроль со стороны пользователей за выполнением сценариев. Применение цветов улучшает внешний вид меню. Будьте осторожны при использовании гаммы цветов; цвета могут быть привлекательны для вас, но не отвечать вкусам пользователя, вынужденного применять сценарий. Работа со сценариями значительно облегчается при использовании управляющих символов. Это особенно проявляется в случае, когда пользователи осуществляют ввод информации путем выбора назначенных клавиш.