Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
black_white)
echo '^[[40;37m' ;;
black_cyan)
echo '^[[40;36m' ;;
black_red)
echo '^[[40;31m' ;;
esac
}
xy() #xy
• для вызова: ху строка, столбец,"text"
• переход к координатам ху на экране {
#_R=row, _C=column
_R=$1
_C=$2
_TEXT=S3
tput cup $_R $_C
echo -n $_TEXT
}
center()
{
center
#центрирование строки текста на экране
#для вызова: center "строка" номер_строки
_STR=$1
_ROW=$2
# неудачный способ получения длины строки
LEN=`echo $_STR | wc -с`
COLS=`tput cols`
HOLD_COL=`expr $COLS - $LEN`
NEW_COL=`expr $HOLD_COL / 2`
tput cup $_ROW $NEW_COL
echo -n $_STR
}
tput clear
colour red_yellow
xy 2 3 "USER: $LOGNAME"
colour black_cyan
center "ADD A NEW WARP DRIVE TO A STAR SHIP" 3
echo -e "ff"
center " " 4
colour black_yeliow
xy 5 1 " "
xy 7 1 "_____"
xy 21 1 " "
center "Star Date $MYDATE " 22
xy 23 1 "____ _____________"
colour black_green
xy 6 6 "Initials :"
read INIT
xy 8 14
echo -n "Security Code No: :"
read CODE
xy 10 13
echo -n "Ship's Serial No: :"
read SERIAL
xy 12 14
echo -n "Is it on the Port Side :"
read PORT
colour red_yellow
center " Save This Record [Y..N]:" 18
read ans
# восстановление обычных цветов экрана
colour black_white
Нетрудно заметить, что этот сценарий не включает методов проверки. В данном случае все нормально. Сценарий просто демонстрирует, как можно раскрасить экран.
21.2.11. Улучшение внешнего вида меню
Помните ли вы меню, которое создавалось при обсуждении циклов while? Внесем в сценарий этого меню некоторые усовершенствования. В результате оно будет включать следующие варианты выбора:
1: ADD A RECORD
2: VIEW A RECORD
3: PAGE ALL RECORDS
4: CHANGE A RECORD
5: DELETE A RECORD
P: PRINT ALL RECORDS
H: Help screen
Q: Exit Menu
В сценарии обработки этого меню применяется функция read_char, поэтому пользователь не должен при выборе опций меню нажимать клавишу (Return]. Для игнорирования сигналов 2, 3 и 15 применяется команда trap (более подробно это команда обсуждается далее), поэтому пользователь может не прерывать работу с меню.
Меню также имеет возможности по управлению доступом. Пользователи, обладающие определенными привилегиями, могут вносить изменения в записи или удалять их. Остальным пользователям разрешается только добавлять записи, просматривать их и выводить на экран. Список действительных пользователей с указанием уровней доступа находится в файле priv.user.
Если к меню попытаются обратиться пользователи, имена которых не содержатся в указанном файле, отобразится сообщение о том, что эти пользователи не имеют права выполнять данное приложение. После этого выполнение приложения завершается.
Опции меню скрывают системные команды. Если нужно ознакомиться с подтверждением данных при обновлении файла, обратитесь к главе 22.
Ниже приводится файл priv.user, содержащий имена пользователей, которые могут или не могут удалять записи и вносить в них изменения. Из приведенного текста видно, что пользователи root, dave и matty не имеют права вносить изменения в файлы баз данных, а пользователи peter и louise располагают этим правом.
$ pg priv.user
#файл доступа priv.user для меню apps
#его изменение является рискованным !!!!
#формат реализуют записи USER AMEND/DELETE
#например, запись "root yes" означает, что пользователь root может
#обновлять или удалять записи
#запись "dave no" означает, что пользователь dave не может обновлять или удалять записи
root no
dave no
peter yes
louise yes
matty no
Чтобы проверить права доступа пользователей, сначала просмотрим файл. При этом игнорируются строки комментария, а все другие строки перенаправляются в файл temp.
user_level()
(
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
На следующем этапе просматривается заново отформатированный файл. Переменной FOUND присваивается значение "ложь". Теперь файл temp включает только описание имен и прав доступа; именам пользователей и правам доступа назначаются переменные. Чтобы уточнить, соответствует ли имя в файле значению user, производится проверка; значение user берется из команды whoami, расположенной в начале сценария. Если совпадение не найдено, выполняется проверка с помощью конструкции else, и с помощью команды continue обработка продолжается на следующей итерации.
Этот процесс длится до тех пор, пока все имена пользователей не будут просмотрены. При этом имя пользователя сравнивается со значением переменной 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
}
# чтение значения клавиши