Мне нужно иметь возможность создавать учетные записи пользователей на моем Linux (Fedora 10) и автоматически назначать пароль через bash script (или, в противном случае, если потребуется).
Легко создать пользователя через 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 ]#
Вы можете запустить команду passwd и отправить ее по каналу ввода. Итак, сделайте что-нибудь вроде:
echo thePassword | passwd theUsername --stdin
echo
- это встроенная в используемую оболочку, как это обычно бывает), по крайней мере, в отношении /proc/
.
Вы также можете использовать chpasswd:
echo username:new_password | chpasswd
поэтому вы меняете пароль для пользователя username
на new_password
.
$ 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
более современен, поскольку обратные тики устарели и рекомендуется $()
.
Код ниже работал в 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
--gecos
Мне понравился подход 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
Здесь должны быть одинарные кавычки.
Следующие работы для меня и тестируются на Ubuntu 14.04. Это один лайнер, который не требует ввода пользователем.
sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME
Взято с @Tralemonkey
Вы можете использовать опцию -p.
useradd -p encrypted_password newuser
К сожалению, это требует, чтобы вы сами хешировали пароль (где passwd делает это для вас). К сожалению, не существует стандартной утилиты для хеширования некоторых данных, поэтому вам придется написать это сами.
Здесь немного Python script Я взломал, чтобы сделать шифрование для вас. Предполагая, что вы назвали его pcrypt, вы тогда напишите приведенную выше командную строку:
useradd -p $(pcrypt ${passwd}) newuser
Несколько предупреждений, о которых нужно знать.
и здесь 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
Здесь мы можем найти другие полезные способы:
Одиночный вкладыш для создания пользователя sudo с домашним каталогом и паролем.
useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
Вы можете использовать ожидание в bash script.
От 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"
Я знаю, что я приду в эти годы позже, но я не могу поверить, что никто не предложил нам.
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
===========
Надеюсь, что это поможет.
Cheers, Карел
Я тестировал свою собственную оболочку script.
$new_username
означает вновь созданный пользователь$new_password
означает новый парольecho "$new_password" | passwd --stdin "$new_username"
echo "$new_username:$new_password" | chpasswd
echo -e "$new_password\n$new_password" | passwd "$new_username"
От IBM (https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm):
Создайте текстовый файл, скажем text.txt и заполните его паролем пользователя: пароль следующим образом:
user1:password1
user2:password2
...
usern:passwordn
Сохраните файл text.txt и запустите
cat text.txt | chpassword
Что это. Решение (a) масштабируется и (b) не требует печати паролей в командной строке.
Решение, которое работает как на 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
Решение Tralemonkey почти сработало и для меня... но не совсем. Я закончил так:
echo -n '$#@password@#$' | passwd myusername --stdin
2 ключевых данных, которые его решение не включило, -n
сохраняет эхо от добавления \n
к зашифрованному паролю, а одинарные кавычки защищают содержимое от интерпретации оболочкой (bash ) в моем случае.
BTW Я выполнил эту команду как 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;
Для 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
{ echo $password; echo $password; } | passwd $username