Как автоматически добавить учетную запись пользователя и пароль с помощью Bash-скрипта?
Мне нужно иметь возможность создавать учетные записи пользователей на моем Linux (Fedora 10) и автоматически назначать пароль через bash script (или, в противном случае, если потребуется). Легко создать пользователя через bash например:
[[email protected] ]# passwd newuser Changing password for user testpass. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. [[email protected] ]#
Я думаю, что этот вопрос по теме. Одной из самых сильных тенденций сейчас является отношение DevOps к «конфигурации как коду», то есть к тому, что платформа создается путем «программирования» последовательности шагов администратора, которые загружают платформу. Управление пользователями в режиме сценария, безусловно, является частью этого программирования.
Как DevOps, я думаю, что это полезный вопрос (с полезными ответами), но это с моей шляпой SysAdmin. Возможно, имеет смысл переместить это в SuperUser.
19 ответов
Вы можете запустить команду passwd и отправить ее по каналу ввода. Итак, сделайте что-нибудь вроде:
echo thePassword | passwd theUsername --stdin
Преимущество этого метода в том, что он безопасен (предполагается, что echo — это встроенная в используемую оболочку, как это обычно бывает), по крайней мере, в отношении /proc/ .
@MarkusOrreilly работает, но не при использовании такого инструмента, как Ansible. Как сказано в @Nybble, вы должны использовать chpasswd. Итак, вот что работает: echo ‘myuser:mypass’ | chpasswd . Надеюсь, это поможет.
Вы также можете использовать chpasswd:
echo username:new_password | chpasswd
поэтому вы меняете пароль для пользователя username на new_password .
+1, это правильный инструмент для работы: $ apropos chpasswd . chpasswd (8) — update passwords in batch mode
Я спрашивал себя об этом и не хотел полагаться на сценарий Python.
Это строка для добавления пользователя с определенным паролем в одну строку bash:
useradd -p $(openssl passwd -1 $PASS) $USER
useradd -p $(openssl passwd -1 $PASS) $USER более современен, поскольку обратные тики устарели и рекомендуется $() .
У меня возникла проблема: я создал своего пользователя с оболочкой zsh, не понимая, что на тот момент zsh не был установлен. Если вы сделаете это, пароль для входа не удастся, поэтому, прежде чем предположить, что это не работает (это определенно будет работать на сегодняшнем Arch и Debian 7), вы можете проверить это в новой установке.
useradd -m -p
Вы также можете useradd -m -p $(openssl passwd -1 -salt $SALT $PASS) пароль: useradd -m -p $(openssl passwd -1 -salt $SALT $PASS) . Я думаю, что это требуется на более поздних версиях Ubuntu.
Код ниже работал в Ubuntu 14.04. Попробуйте, прежде чем использовать его в других версиях/вариантах linux.
# quietly add a user without password adduser --quiet --disabled-password --shell /bin/bash --home /home/newuser --gecos "User" newuser # set password echo "newuser:newpassword" | chpasswd
en.wikipedia.org/wiki/Gecos_field Поле gecos или поле GECOS — это запись в файле / etc / passwd в Unix и аналогичных операционных системах. Обычно он используется для записи общей информации об учетной записи или ее пользователях, таких как их настоящее имя и номер телефона. GECOS означает комплексную операционную систему General Electric, которая была переименована в GCOS, когда крупное системное подразделение GE было продано Honeywell.
Это был правильный ответ для меня на Debian 8, который работал как прелесть в моем скрипте установки сервера!
Мне понравился подход Tralemonkey echo thePassword | passwd theUsername —stdin , хотя он не совсем сработал у меня, как написано. Тем не менее, это сработало для меня.
echo -e "$password\n$password\n" | sudo passwd $user
-e означает распознать \n как новую строку.
sudo — это root-доступ для Ubuntu.
Двойные кавычки должны распознать $ и развернуть переменные.
Вышеуказанная команда передает пароль и новую строку, два раза, на passwd , что требуется passwd .
Если не использовать переменные, я думаю, что это, вероятно, работает.
echo -e 'password\npassword\n' | sudo passwd username
Здесь должны быть одинарные кавычки.
Прекрасно работает в Bash. Однако, если работает в sh, то опция -e не работает. Я обнаружил, что он на самом деле выдает «-e». К счастью, опция -e не нужна в sh, экранирование там по умолчанию. Портативная версия должна использовать printf «пароль \ npassword \ n» | . вместо
Следующие работы для меня и тестируются на Ubuntu 14.04. Это один лайнер, который не требует ввода пользователем.
sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME
Вы можете использовать опцию -p.
useradd -p encrypted_password newuser
К сожалению, это требует, чтобы вы сами хешировали пароль (где passwd делает это для вас). К сожалению, не существует стандартной утилиты для хеширования некоторых данных, поэтому вам придется написать это сами.
Здесь немного Python script Я взломал, чтобы сделать шифрование для вас. Предполагая, что вы назвали его pcrypt, вы тогда напишите приведенную выше командную строку:
useradd -p $(pcrypt $) newuser
Несколько предупреждений, о которых нужно знать.
- Пока работает pcrypt, открытый текст будет доступен любому пользователю с помощью команды ps.
- pcrypt использует функцию склепа старого стиля — если вы используете что-то более современное, такое как хэш MD5, вам нужно будет изменить pcrypt.
#!/usr/bin/env python import crypt import sys import random saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" def salt(): return random.choice(saltchars) + random.choice(saltchars) def hash(plain): return crypt.crypt(arg, salt()) if __name__ == "__main__": random.seed() for arg in sys.argv[1:]: sys.stdout.write("%s\n" % (hash(arg),))
Спасибо R Klatchko, Это должно работать. Я не могу поверить, что я не знал о опции -p. Я могу позаботиться о перемешивании себя 🙂
—stdin не работает в Debian. В нем говорится:
`passwd: unrecognized option '--stdin'`
#useradd $USER #echo "$USER:$SENHA" | chpasswd
Здесь мы можем найти другие полезные способы:
Это правильный способ сделать это, и единственный способ, официально поддерживаемый сопровождающими из набора теней. Смотрите этот отчет об ошибке .
Одиночный вкладыш для создания пользователя sudo с домашним каталогом и паролем.
useradd -m -p $(openssl passwd -1 $) -s /bin/bash -G sudo $
Вы можете использовать ожидание в bash script.
#!/usr/bin/expect ######################################### #$ file: htpasswd.sh #$ desc: Automated htpasswd shell script ######################################### #$ #$ usage example: #$ #$ ./htpasswd.sh passwdpath username userpass #$ ###################################### set htpasswdpath [lindex $argv 0] set username [lindex $argv 1] set userpass [lindex $argv 2] # spawn the htpasswd command process spawn htpasswd $htpasswdpath $username # Automate the 'New password' Procedure expect "New password:" send "$userpass\r" expect "Re-type new password:" send "$userpass\r"
Я знаю, что я приду в эти годы позже, но я не могу поверить, что никто не предложил нам.
usermod --password `perl -e "print crypt('password','sa');"` root
Черт, на всякий случай кто-то хочет сделать это на более раннем HPUX, вы можете использовать usermod.sam .
/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username
-F требуется, только если пользователь, выполняющий script, является текущим пользователем. Конечно, вам не нужно использовать Perl для создания хэша. Вы можете использовать openssl или многие другие команды на своем месте.
Вот script, который сделает это для вас.
Вы можете добавить список пользователей (или только одного пользователя), если хотите, все за один раз, и каждый из них будет иметь другой пароль. В качестве бонуса вы представляете в конце script список каждого пароля пользователя. Если вы хотите, вы можете добавить некоторые параметры обслуживания пользователей
chage -m 18 $user chage -M 28 $user
в script, который установит возраст пароля и т.д.
#!/bin/bash # Checks if you have the right privileges if [ "$USER" = "root" ] then # CHANGE THIS PARAMETERS FOR A PARTICULAR USE PERS_HOME="/home/" PERS_SH="/bin/bash" # Checks if there is an argument [ $# -eq 0 ] && < echo >&2 ERROR: You may enter as an argument a text file containing users, one per line. ; exit 1; > # checks if there a regular file [ -f "$1" ] || < echo >&2 ERROR: The input file does not exists. ; exit 1; > TMPIN=$(mktemp) # Remove blank lines and delete duplicates sed '/^$/d' "$1"| sort -g | uniq > "$TMPIN" NOW=$(date +"%Y-%m-%d-%X") LOGFILE="AMU-log-$NOW.log" for user in $(more "$TMPIN"); do # Checks if the user already exists. cut -d: -f1 /etc/passwd | grep "$user" > /dev/null OUT=$? if [ $OUT -eq 0 ];then echo >&2 "ERROR: User account: \"$user\" already exists." echo >&2 "ERROR: User account: \"$user\" already exists." >> "$LOGFILE" else # Create a new user /usr/sbin/useradd -d "$PERS_HOME""$user" -s "$PERS_SH" -m "$user" # passwdgen must be installed pass=$(passwdgen -paq --length 8) echo $pass | passwd --stdin $user # save user and password in a file echo -e $user"\t"$pass >> "$LOGFILE" echo "The user \"$user\" has been created and has the password: $pass" fi done rm -f "$TMPIN" exit 0 else echo >&2 "ERROR: You must be a root user to execute this script." exit 1 fi
29. bash скрипты №3
В прошлый раз мы с вами разобрали if. Есть много других команд, но if ещё кое-где пригодится.
Начнём с того, что скрипт, который мы пишем, должен выполняться рутом, так как тут и команда useradd, и добавление строчки в sudoers. В самом скрипте мы нигде не пишем sudo, так как предполагаем, что либо root запустит этот скрипт, либо пользователь с командой sudo. Но что будет, если скрипт запустить без sudo? Выполнятся все команды, правда, некоторые выдадут ошибку, что недостаточно прав. Сейчас у нас скрипт небольшой, можно понять, что ничего страшного не произойдёт. Но в будущем в скрипте могут быть команды, которые могут сработать и у рута, и у обычного пользователя. И если скрипт запустится от обычного пользователя, то некоторые команды выполнятся, некоторые нет, в итоге это приведёт к неожиданным последствиям. Поэтому лучше в начале скрипта сделать проверку, а кто именно запускает скрипт. Если это root – то всё окей, если кто-то другой – то нужно остановить скрипт и выдать ошибку, что недостаточно прав.
Условие у нас такое – если текущий пользователь является рутом, запускать скрипт, иначе выдавать ошибку. Для этого нужно распознать текущего пользователя – это можно сделать с помощью команды id. Причём, всё завязано не на самом слове root, а на его uid, который равен 0. То есть можно встретить случаи, когда вместо root используется другой пользователь с uid-ом 0, поэтому лучше ориентироваться на uid. Команда id с ключом -u должна быть 0:
Проверку нужно делать в самом начале, чтобы никакие другие команды не выполнились. Как писать условие мы знаем – if, дальше нам нужно выполнить команду, чтобы узнать uid и убедиться, что он не равен 0:
И так, если uid не равен нулю, пусть скрипт выдаст ошибку — echo root permissions required — и завершится. Чтобы завершить скрипт, используем команду exit. Также, давайте вспомним, что обычно ошибки сыпятся в stderr. И чтобы наш скрипт тоже так делал, добавим после echo направление stdout в stderr (>&2), в итоге у нас вывод echo уйдёт в stderr. Также вспомним про статусы выхода. Именно с помощью команды exit мы и будем выдавать статус выхода с ошибкой, то есть единицу:
if [ "$(id -u)" != 0 ] then echo root permissions required >&2 exit 1 fi