Сценарий 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 

  • использование scp переименование всех файлов
  • Нужен сценарий оболочки для преобразования CSV в формат Apache httpd
  • Обновите / обновите Debian и пропустите любые взаимодействия
  • shell-скрипты все еще работают без #! (строка sha-bang)
  • Можно ли отслеживать отправленные письма?
  • Убедитесь, что только root может редактировать скрипт перед его выполнением
  • Скрипт для подсчета файлов, соответствующих шаблону в подкаталогах
  • как использовать команду eval для печати значения параметра
  • 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

    Получите «симпатичное» имя хоста в bash

    Ubuntu vs Debian для сервера

    Как запустить программу без ввода ./?

    Передача аргументов с пробелами и кавычками в скрипт (без цитирования всего)

    Объединение нескольких выходов grep в переменную

    Как скопировать содержимое файлов из поиска в командной строке в один файл?

    Как использовать multiline как group-separator в grep?

    перенаправление ввода-вывода zsh: перенаправление и последующее соединение; что происходит?

    setgid binary не имеет разрешения, права монтирования, я чего-то не хватает, но что, пожалуйста?

    Как сопоставить заголовки Markdown Setext в буйных ctags

    Изменение ключевой фразы GPG неэффективно

    Переименуйте кучу файлов с определенным шаблоном

    существует ли арка во всех системах linux / unix?

    Лучшая практика для установки времени в локальной сети с использованием NTP

    Gnome 3 не позволяет мне войти в систему как root

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