Выбрать главу

Если в процессе выполнения цикла 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.