Как автоматически добавить учетную запись пользователя и пароль с помощью Bash-скрипта?
Мне нужно иметь возможность создавать учетные записи пользователей в моем Linux (Fedora 10) и автоматически назначать пароль с помощью bash-скрипта (или иным образом, если это необходимо).
С помощью Bash легко создать пользователя, например:
[whoever@server ]# /usr/sbin/useradd newuser
Можно ли назначить пароль в Bash, что-то функционально похожее на это, но автоматически:
[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[whoever@server ]#
20 ответов
Вы можете запустить команду passwd и отправить ее по конвейеру. Итак, сделайте что-то вроде:
echo thePassword | passwd theUsername --stdin
Вы также можете использовать chpasswd:
echo username:new_password | chpasswd
Итак, вы меняете пароль для пользователя username
в new_password
,
Я спрашивал себя об этом и не хотел полагаться на сценарий Python.
Это строка для добавления пользователя с определенным паролем в одну строку bash:
useradd -p $(openssl passwd -1 $PASS) $USER
Код ниже работал в 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
Мне понравился подход Тралемонки echo thePassword | passwd theUsername --stdin
хотя это не совсем работает для меня, как написано. Однако это сработало для меня.
echo -e "$password\n$password\n" | sudo passwd $user
-e
это признать \n
как новая строка.
sudo
это корневой доступ для Ubuntu.
Двойные кавычки должны признать $
и разверните переменные.
Приведенная выше команда передает пароль и новую строку два раза passwd
, который является то, что passwd
требует.
Если не использовать переменные, я думаю, что это, вероятно, работает.
echo -e 'password\npassword\n' | sudo passwd username
Здесь должно быть достаточно одинарных кавычек.
Следующее работает у меня и проверено на Ubuntu 14.04. Это один вкладыш, который не требует ввода пользователя.
sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME
Взято из @Tralemonkey
Единый вкладыш для создания пользователя sudo с домашним каталогом и паролем.
useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
Вы можете использовать опцию -p.
useradd -p encrypted_password newuser
К сожалению, это требует от вас хеширования пароля самостоятельно (где passwd сделает это за вас). К сожалению, не существует стандартной утилиты для хеширования некоторых данных, поэтому вам придется написать ее самостоятельно.
Вот небольшой скрипт на Python, который я написал для того, чтобы сделать шифрование для вас. Предполагая, что вы назвали его pcrypt, вы должны написать вышеприведенную командную строку:
useradd -p $(pcrypt ${passwd}) newuser
Пару предупреждений, о которых нужно знать.
- Во время работы pcrypt открытый текст будет виден любому пользователю с помощью команды ps.
- pcrypt использует функцию шифрования старого стиля - если вы используете что-то более современное, например, хеш MD5, вам нужно изменить pcrypt.
и вот 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),))
--stdin
не работает на Debian. Это говорит:
`passwd: unrecognized option '--stdin'`
Это сработало для меня:
#useradd $USER
#echo "$USER:$SENHA" | chpasswd
Здесь мы можем найти несколько других хороших способов:
Я знаю, что приеду в этом году спустя, но я не могу поверить, что никто не предложил usermod.
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 необходим только в том случае, если пользователь, выполняющий скрипт, является текущим пользователем. Конечно, вам не нужно использовать Perl для создания хеша. Вы можете использовать openssl или много других команд вместо него.
Вы можете использовать ожидаемый в вашем скрипте bash.
С http://www.seanodonnell.com/code/?id=21
#!/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"
Я проверил в своем собственном сценарии оболочки.
$new_username
означает вновь созданного пользователя$new_password
означает новый пароль
Для CentOS
echo "$new_password" | passwd --stdin "$new_username"
Для Debian/Ubuntu
echo "$new_username:$new_password" | chpasswd
Для OpenSUSE
echo -e "$new_password\n$new_password" | passwd "$new_username"
Вот скрипт, который сделает это за вас.....
Вы можете добавить список пользователей (или только одного пользователя), если хотите, все сразу, и у каждого будет свой пароль. В качестве бонуса вы представлены в конце скрипта со списком паролей каждого пользователя..... Если вы хотите, вы можете добавить некоторые параметры обслуживания пользователей
лайк:
chage -m 18 $user
chage -M 28 $user
к сценарию, который будет устанавливать возраст пароля и так далее.
=======
#!/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
===========
Надеюсь это поможет.
Ура, Карел
Решение, которое работает как на Debian, так и на Red Hat. Зависит от perl, использует хэши sha-512:
cat userpassadd
#!/usr/bin/env bash
salt=$(cat /dev/urandom | tr -dc A-Za-z0-9/_- | head -c16)
useradd -p $(perl -e "print crypt('$2', '\$6\$' . '$salt' . '\$')") $1
Использование:
userpassadd jim jimslongpassword
Его можно эффективно использовать как однострочник, но вам нужно будет указать пароль, соль и имя пользователя в нужных местах самостоятельно:
useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username
От IBM ( https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm):
Создайте текстовый файл, скажем text.txt, и заполните его парами user: password следующим образом:
user1:password1
user2:password2
...
usern:passwordn
Сохраните файл text.txt и запустите
cat text.txt | chpassword
Вот и все. Решение является (а) масштабируемым и (б) не включает печать паролей в командной строке.
Для RedHat / CentOS вот код, который создает пользователя, добавляет пароли и делает пользователя sudoer:
#!/bin/sh
echo -n "Enter username: "
read uname
echo -n "Enter password: "
read -s passwd
adduser "$uname"
echo $uname:$passwd | sudo chpasswd
gpasswd wheel -a $uname
Решение Tralemonkey почти сработало и для меня... но не совсем. В итоге я сделал это так:
echo -n '$#@password@#$' | passwd myusername --stdin
2 ключевых детали, которые его решение не включало, -n
держит эхо от добавления \n
к паролю, который шифруется, и одинарные кавычки защищают содержимое от интерпретации оболочкой (bash) в моем случае.
Кстати, я запустил эту команду от имени пользователя root в системе CentOS 5.6 на случай, если кому-то интересно.
Использование: ./my_add_user.sh USER PASSWD
код:
#!/bin/bash
# my_add_user.sh
if [ "$#" -lt 2 ]
then
echo "$0 username passwd"
exit
fi
user=$1
passwd=$2
useradd $user -d /data/home/$user -m ;
echo $passwd | passwd $user --stdin;
Пожалуйста, запустите приведенный ниже сценарий с разрешением sudo для создания пользователя по сценарию.
Примечание. Этот скрипт поддерживает все ОС Linux, такие как Redhat, Centos, Ubuntu, suse, kali, Arch, Bitname, BSD и т. д.
#!/bin/bash
#author: bablish jaiswal
#purpos: Linux user creation with a storng password
clear
#echo "Hi, I am a function to create sudo user with strong password. Kindly share following information"
echo -e "\n\n\n"
printf "\e[6;33mHi, I am a function to create sudo user with a strong password. Kindly share following information\e[0m";echo
read -p "user name:- " name #input name
read -p "complete path for $name home directory? example: /home/$name :- " home #user home path
( useradd -m -d $home $name -s /bin/bash ) > /dev/null 2>&1
pass=$(cat /dev/urandom |tr -dc "[[:graph:]]" |head -c16)
(echo -e "$pass\n$pass" | passwd $name ) > /dev/null 2>&1
echo " "
printf "\e[6;33m-----------------------------Copy below credentials-------------------------\e[0m";echo
echo -e "User:- $name\nHomeDir:- $home\npassword:- $pass"
#svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{$1=""}1')
svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{print $2}')
echo "${name} ${svalue} NOPASSWD:ALL" >> /etc/sudoers && echo “Remark:- User $name is a sudo user”