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 . Если файл-блокировка уже существует
, сценарий ждет его удаления другой программой, после чего создает свой файл, выполняет необходимые операции
и удаляет его по завершении
.
Читать дальше