№ 41. Приостановка действия учетной записи
Есть много случаев, когда желательно заблокировать учетную запись, не удаляя ее из системы, например, когда пользователь уличен в краже промышленных секретов и идет разбирательство, студент отправился отдыхать на летние каникулы или подрядчик ушел в отпуск.
Можно просто изменить пароль пользователя и не сообщить ему, но, если пользователь в это время находится в системе, также важно было бы принудительно вывести его из системы и закрыть доступ к его домашнему каталогу из других учетных записей в системе. Когда действие учетной записи приостанавливается, почти всегда требуется вывести пользователя из системы немедленно , а не когда он сам пожелает сделать это.
Бо́льшая часть сценария в листинге 5.16 связана с определением присутствия пользователя в системе, его уведомлением о завершении сеанса и принудительным выводом из системы.
Листинг 5.16.Сценарий suspenduser
#!/bin/bash
# suspenduser — приостанавливает действие учетной записи до неопределенного
#·· момента в будущем
homedir="/home" # Местонахождение домашних каталогов пользователей
secs=10········ # Пауза в секундах перед выводом пользователя из системы
if [-z $1]; then
··echo "Usage: $0 account" >&2
··exit 1
elif ["$(id −un)"!= "root"]; then
··echo "Error. You must be 'root' to run this command." >&2
··exit 1
fi
echo "Please change the password for account $1 to something new."
passwd $1
# Теперь посмотрим, если пользователь зарегистрирован в системе.
#·· выведем его принудительно.
if who|grep "$1" > /dev/null; then
··for tty in $(who | grep $1 | awk '{print $2}'); do
····cat << "EOF" > /dev/$tty
******************************************************************************
URGENT NOTICE FROM THE ADMINISTRATOR:
This account is being suspended, and you are going to be logged out
in $secs 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.
******************************************************************************
EOF
··done
··echo "(Warned $1, now sleeping $secs seconds)"
··sleep $secs
··jobs=$(ps −u $1 | cut −d\ −f1)
kill −s HUP $jobs # Послать сигнал остановки процессам пользователя.
·· 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.
Читать дальше