Сценарий Bash для удаления пользователя

Мне нужно создать сценарий Bash для удаления пользователя.
Мы используем RHEL версии 4, 5 и 6.
Допустим, что имена пользователей – Ray4 & Ray6, а имя сценария – дело.
Конкретные задачи для этого скрипта:

  1. Существует ли пользователь?
  2. Если пользователь существует, backup / homedirectory для этого пользователя, удалите имя пользователя и поместите его в / root / DeletedUsers
  3. Если каталог / root / DeletedUsers не существует, создайте его.
  4. Если для этого пользователя существуют правила брандмауэра, напишите мне результаты для этих правил и на каких узлах.
  5. Если этот пользователь существует в sudoers, не удаляйте, а комментируйте.

Это то, что у меня есть до сих пор. Я хочу убедиться, что это работает, прежде чем запускать его в RHN Satellite. После внесения предлагаемых изменений. Вот новые ошибки, которые я получаю сейчас.

[root@localhost bin]# ./deal ./deal: line 7: [[!: command not found Usage: userdel [options] LOGIN Options: -f, --force force removal of files, even if not owned by user -h, --help display this help message and exit -r, --remove remove home directory and mail spool -Z, --selinux-user remove SELinux user from SELinux user mapping Usage: userdel [options] LOGIN Options: -f, --force force removal of files, even if not owned by user -h, --help display this help message and exit -r, --remove remove home directory and mail spool -Z, --selinux-user remove SELinux user from SELinux user mapping Null message body; hope that's ok ./deal: line 22: [: -me: binary operator expected This is source code: 
 [root@localhost bin]# cat -n deal 1 #!/bin/bash 2 3 count=$(egrep -c Ray[46] /etc/passwd) 4 firewall=$(grep -c "192.168.5.5" /etc/sysconfig/iptables) 5 doers=$(egrep -c Ray[46] /etc/sudoers) 6 7 if [[! -d /root/DeletedUsers]] 8 then mkdir /root/DeletedUsers 9 10 fi 11 12 cp -Rf /home/Ray[46] /root/DeletedUsers 13 userdel -rf Ray [4] 14 userdel -rf Ray [6] 15 16 if [ $firewall -ne 0 ] 17 18 then mail -s "$firewallrulesexist" emailaddress < /dev/null 19 20 fi 21 22 if [ $doers -me 0 ] 23 then sed ^Ray[46] /#/i 24 25 EOF 26 fi 

  • Прекратите использование сценария bash, если соединение SSH невозможно сделать невзаимодействующим
  • Почему это «пока прочитано» работает в терминале, но не в сценарии оболочки?
  • Функция bash для обработки файла через symlink: проблема с аргументами командной строки
  • Скопируйте определенные файлы из указанных подкаталогов в отдельный подкаталог
  • Сценарий Bash для удаления самого старого файла из папки
  • Проверка md5sum (без файла)
  • Запустите скрипт, прежде чем что-либо появится на экране после входа в систему
  • Как узнать, работает ли скрипт в Linux или OSX
  • 2 Solutions collect form web for “Сценарий Bash для удаления пользователя”

    Я предлагаю вам использовать getent для проверки наличия пользователя. Этот скрипт должен вас поймать.

     ##Check if the user exists using getent command user_exists=$(getent passwd $1) ##If the user doesn't exist, we need not perform the backup. if [ -z "$user_exists" ] then echo "User $1 does not exist" else cd /root #Incorporating derobert's suggestion here. mkdir -p "DeletedUsers" ##Use tar or rsync to do the backup as cp will be inefficient. tar czvf "$1".tar.gz /home/"$1" firewall=$(grep -c "192.168.5.5" /etc/sysconfig/iptables) doers=$(egrep -c "$1" /etc/sudoers) userdel -rf "$1" if [ $firewall -ne 0 ] then mail -s "$firewallrulesexist" emailaddress < /dev/null fi if [ $doers -ne 0 ] then sed ^"$1" /#/i fi fi 

    Вы можете вызвать скрипт как ./deal ray[4] а затем, если вам нужно запустить другого пользователя, вы можете вызвать его, используя ./deal ray[6] . Я не тестировал скрипт в своей системе, но это должно помочь вам, как в случае, если вам нужно удалить другого пользователя в будущем, вам не нужно изменять скрипт, а скорее вызвать скрипт с именем пользователя в качестве аргумента.

    РЕДАКТИРОВАТЬ

    Согласно предложению Derobert, вы можете опустить проверку каталогов, если используете флаг -p .

    Если Ray[46] , безусловно, уникален, почти каждый тест в вашем скрипте является избыточным.

     printf %s\\n 123 456 | sed '/2/s///' #OUTPUT# 13 456 

    Вышеуказанное сканирует его ввод для любой строки, содержащей /addressed/ строку 2 , и, если найден, изменит только эту строку, чтобы содержать все, кроме адресной строки. Следующее просто удаляет только адресные строки:

     printf %s\\n 123 456 | sed '/2/d' #OUTPUT# 456 

    Поэтому grep тогда sed не нужен. Правда, grep быстрее, чем sed , но в то время, когда требуется вывести grep и [test] его вывод, затем вызвать sed , sed , скорее всего, уже завершил очистку всех соответствующих файлов строки-нарушителя.

    Опять же, если вы хотите, чтобы grep then sed по какой-то причине, следующее было бы намного больше:

     remove=string ; for f in $(grep -l "$remove" $file_list) ; do printf %s "$(sed "/$remove/s///" "$f")" >"$f" ; done 

    Или с GNU sed :

     sed -i "/$remove/s///" $(grep -l "$remove" $file_list) 

    И, как упоминалось выше, mkdir -p делает целевой каталог только в случае необходимости, поэтому этого должно быть достаточно:

     mkdir -p /root/DeletedUsers ; mv /home/$string "$_" 

    Вы даже можете получить журнал всего этого, чтобы точно просмотреть, что было сделано только на тех машинах, которые произошли:

     #ensure $tgt dir exists mkdir -p ${tgt=/root/DeletedUsers} #handles Ray4 and Ray6 cases on a single machine for remove in /home/Ray[46] ; do hostname #print hostname #nothing happens unless user's $HOME exists cd "$remove" 2>/dev/null || { echo "No $remove found here." break } #get out of user's $HOME and mv it cd - ; mv -v "$remove" "$tgt" #strip $remove to only username then userdel it remove=${remove##*/} userdel -rf $remove #if $remove in /etc/sudoers comment file's line and and copy change to stderr sed -nei "/$remove/{!p;b};s/^/#/p" /etc/sudoers \ -ne "s/^/sudoers change: /w /dev/stderr" #print all iptables lines containing string $remove grep "$remove" /etc/sys/config/iptables | #for each rule found append a noticeable marker line sed "a--- "$(hostname)"firewall found" #finish for statement and pipe all to remote cat to append to log done 2>&1 | ssh you@host 'cat >>~/Raydel.log' 

    Это выше предполагает, что у вашего целевого пользователя есть $HOME в /home именем пользователя. Если предположение верно, оно принимает меры только на любой машине, на которой зарегистрировано имя пользователя целевого пользователя.

    Чтобы сделать то же самое без grep вы также можете оставить tee . Просто измените строку sed на:

     for f in $file_list ; do sed -ni "/$remove/{h;s///};p;\$!b;x;/$remove/s|.*|$f|w /dev/stderr" "$f" done 

    Это перезапишет тэг sed's с каждым новым поиском строк sed содержащим строку "$remove" . Когда сканирование sed's и доходит до последней строки, он переключается в пространство хранения и, если он находит какие-либо ссылки на $remove он записывает имя файла в stderr .

    Если вы запускаете сценарий, подобный тому, который я написал выше, с вашей собственной машины, и вы выходите на все целевые объекты, вам не нужно открывать соединение ssh с каждого из них на свою собственную машину – вы уже там , Вы можете удалить последнюю |pipe и все, что следует за ней, и сделать это вместо этого:

     script=$(cat <<\SCRIPT #body of the script I wrote above less the |pipe and all that followed SCRIPT ) for host in $hosts ; do ssh you@$host "$script" ; done >>~/Raydel.log 
    Interesting Posts

    Stream Youtube с mpv, начиная с произвольной точки позже в видео

    tar определенное количество файлов, перечисленных в текстовом файле

    Расширение списка, разделенного запятыми, на отдельные строки

    поиск и увеличение значений между символом второй тильды и символом третьей тильды в каждой строке файла txt

    Набор переменных среды, но не соблюдается

    Как предотвратить автоматизацию от перезагрузки INSTALL?

    systemd, используя 100% моего процессора, если нет, если я запустил его без systemd

    tar.gz извлекал только пустые файлы

    Переключение языка с французского на английский в Solaris 8

    Режим файла на MacOSX

    Как обновить grub от другого дистрибутива?

    ACL по умолчанию: файлы и каталоги

    просмотреть историю открытых программ Manjaro Linux

    Как клонировать только мой раздел Linux с моего жесткого диска 500 ГБ на SSD на 250 ГБ?

    в чем разница между кешем страницы и кешем буфера?

    Linux и Unix - лучшая ОС в мире.