Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
·· sleep 1·········· # Дать одну секунду…
kill −s KILL $jobs > /dev/null 2>1 # и остановить те, что еще остались.
·· echo "$1 was logged in. Just logged them out."
fi
# В заключение закрыть домашний каталог от любопытных глаз.
chmod 000 $homedir/$1
echo "Account $1 has been suspended."
exit 0
Как это работает
Сценарий меняет пароль пользователя на неизвестную ему комбинацию символов и затем закрывает его домашний каталог. Если в это время пользователь находится в системе, сценарий посылает ему текст предупреждения, ждет несколько секунд и останавливает все запущенные им процессы.
Обратите внимание, что сценарий посылает сигнал остановки SIGHUP (HUP) всем процессам, запущенным пользователем , ждет одну секунду и затем посылает более жесткий сигнал SIGKILL (KILL)
. Сигнал SIGHUP завершает работу запущенного приложения, но не всегда, и оболочка входа не реагирует на него. Однако сигнал SIGKILL не может быть проигнорирован или заблокирован, поэтому он действует со стопроцентной гарантией. Однако такой способ остановки приложений нельзя назвать предпочтительным, потому что этот сигнал не дает приложению возможности удалить временные файлы, вытолкнуть буферы, чтобы гарантировать запись изменений на диск, и выполнить другие заключительные операции.
Разблокирование пользователя выполняется в два шага: открыть его домашний каталог (командой chmod 700) и установить известный пользователю пароль (командой passwd).
Запуск сценария
Этот сценарий должен запускаться с привилегиями root и принимает один аргумент: имя учетной записи, действие которой требуется приостановить.
Результаты
Выяснилось, что пользователь snowy нарушил правила пользования учетной записи. Давайте приостановим ее действие, как показано в листинге 5.17.
Листинг 5.17.Тестирование сценария suspenduser на пользователе snowy
$ sudo suspenduser snowy
Please change the password for account snowy to something new.
Changing password for user snowy.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
(Warned snowy, now sleeping 10 seconds)
snowy was logged in. Just logged them out.
Account snowy has been suspended.
Так как snowy в этот момент был зарегистрирован в системе, он получил сообщение, показанное в листинге 5.18, за несколько секунд до того, как его принудительно вывели из системы.
Листинг 5.18.Текст предупреждения, появившийся на терминале пользователя перед его отключением [5] Перевод: СРОЧНОЕ СООБЩЕНИЕ ОТ АДМИНИСТРАТОРА: Эта учетная запись блокируется, и вы будете выведены из системы через 10 секунд. Пожалуйста, завершите все свои процессы и выйдите из системы. По всем вопросам обращайтесь к своему руководителю или Джону Доу, начальнику отдела информационных технологий.
******************************************************************************
URGENT NOTICE FROM THE ADMINISTRATOR:
This account is being suspended, and you are going to be logged out
in 10 seconds. Please immediately shut down any processes you
have running and log out.
If you have any questions, please contact your supervisor or
John Doe, Director of Information Technology.
******************************************************************************
№ 42. Удаление учетной записи
Удаление учетной записи немного сложнее в реализации, чем приостановка ее действия, потому что сценарий должен прочесать всю файловую систему в поисках файлов, принадлежащих удаляемой учетной записи, прежде чем информация о ней будет стерта из файлов /etc/passwd и /etc/shadow . Сценарий в листинге 5.19 гарантирует полное удаление из системы учетной записи и всех ее данных. Предполагается, что предыдущий сценарий suspenduser находится в одном из каталогов, перечисленных в текущем значении переменной PATH.
Код
Листинг 5.19.Сценарий deleteuser
··#!/bin/bash
··# deleteuser — удаляет учетную запись без следа.
··#·· Не предназначен для использования в OS X.
··homedir="/home"
··pwfile="/etc/passwd"
··shadow="/etc/shadow"
··newpwfile="/etc/passwd.new"
··newshadow="/etc/shadow.new"
··suspend="$(which suspenduser)"
··locker="/etc/passwd.lock"
··if [-z $1]; then
····echo "Usage: $0 account" >&2
····exit 1
··elif ["$(whoami)"!= "root"]; then
····echo "Error: you must be 'root' to run this command.">&2
····exit 1
··fi
··$suspend $1 # Заблокировать учетную запись на время выполнения работы.
··uid="$(grep −E "^${1}:" $pwfile | cut −d: −f3)"
··if [-z $uid]; then
····echo "Error: no account $1 found in $pwfile" >&2
····exit 1
··fi
··# Удалить пользователя из файлов password и shadow.
··grep −vE "^${1}:" $pwfile > $newpwfile
··grep −vE "^${1}:" $shadow > $newshadow
··lockcmd="$(which lockfile)" # Найти приложение lockfile.
··if [! -z $lockcmd]; then # Использовать системную команду lockfile.
····eval $lockcmd −r 15 $locker
··else························# Не вышло, используем свой механизм.
····while [-e $locker]; do
······echo "waiting for the password file"; sleep 1
····done
····touch $locker············# Создать блокировку на основе файла.
··fi
··mv $newpwfile $pwfile
··mv $newshadow $shadow
rm −f $locker··············# Щелк! Снять блокировку.
··chmod 644 $pwfile
··chmod 400 $shadow
··# Теперь удалить домашний каталог и перечислить все, что осталось.
··rm −rf $homedir/$1
··echo "Files still left to remove (if any):"
··find / −uid $uid −print 2>/dev/null | sed 's/^/ /'
··echo ""
··echo "Account $1 (uid $uid) has been deleted, and their home directory "
··echo "($homedir/$1) has been removed."
··exit 0
Как это работает
Чтобы избежать любых изменений в учетной записи в то время, пока работает сценарий deleteuser, сразу после запуска он приостанавливает ее действие, вызывая suspenduser.
Перед изменением файла с паролями этот сценарий блокирует доступ к нему с помощью программы lockfile, если она доступна . Как вариант, для создания файла-блокировки в Linux можно также использовать утилиту flock. Если этой программы нет, сценарий использует относительно примитивный механизм блокировки, основанный на создании файла /etc/passwd.lock . Если файл-блокировка уже существует
, сценарий ждет его удаления другой программой, после чего создает свой файл, выполняет необходимые операции
и удаляет его по завершении
.
Интервал:
Закладка: