Как автоматически добавить учетную запись пользователя и пароль с помощью Bash-скрипта?

200

Мне нужно иметь возможность создавать учетные записи пользователей в моем 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 ]#
ModernCarpentry
источник
11
Почему это оффтоп?
OrangeTux
16
Я думаю, что этот вопрос по теме. Одной из самых сильных тенденций сейчас является отношение DevOps к «конфигурации как коду», то есть к тому, что платформа создается путем «программирования» последовательности шагов администратора, которые загружают платформу. Управление пользователями в режиме сценария, безусловно, является частью этого программирования.
Дэн Берг Джонссон
2
Как DevOps, я думаю, что это полезный вопрос (с полезными ответами), но это с моей шляпой SysAdmin. Возможно, имеет смысл переместить это в SuperUser.
Энтони Геогеган
1
Аналогичный вопрос: askubuntu.com/q/94060/250556
ThorSummoner
Это также можно решить с помощью expectсценария.
Ярон

Ответы:

122

Вы можете запустить команду passwd и отправить ее по конвейеру. Итак, сделайте что-то вроде:

echo thePassword | passwd theUsername --stdin
Tralemonkey
источник
3
Преимущество этого метода в том, что он безопасен (предполагается, echoчто это встроенная в используемую оболочку, как это обычно бывает), по крайней мере, в отношении /proc/.
Мариан
8
Я должен был сделать echo -e "password\npassword\n" | passwd13.04
d0c_s4vage
31
--stdin устарел в новых системах Linux. Пожалуйста, используйте chpasswd вместо этого.
wuxb
16
@MarkusOrreilly работает, но не при использовании инструмента обеспечения, такого как Ansible. Как сказано в @Nybble, вы должны использовать chpasswd. Так вот что работает: echo 'myuser:mypass' | chpasswd. Надеюсь, это поможет.
Амир Рустамзаде
Могу ли я положить это в файл Docker? Я думаю, что это должно быть съедобным для докера.
17
201

Вы также можете использовать chpasswd :

echo username:new_password | chpasswd

Итак, вы меняете пароль для пользователя usernameна new_password.

SilverDaemon
источник
5
+1, это правильный инструмент для работы: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K
Это также работает busybox, в то время как passwdнет (нет --stdinвыбора).
Тимммм
83

Я спрашивал себя об этом и не хотел полагаться на сценарий Python.

Это строка для добавления пользователя с определенным паролем в одну строку bash:

useradd -p $(openssl passwd -1 $PASS) $USER
Damien
источник
25
useradd -p $(openssl passwd -1 $PASS) $USERявляется более современным, поскольку обратные тики устарели и $()рекомендуется.
Брайсон
У меня возникла проблема: я создал своего пользователя с оболочкой zsh, не понимая, что на тот момент zsh не был установлен. Если вы сделаете это, произойдет сбой входа в систему с паролем, поэтому, прежде чем предположить, что это не работает (это определенно будет работать в сегодняшнем Arch и Debian 7), вы можете проверить это в новой установке.
Брайсон
2
useradd -m -p <password> -s /bin/bash <user>-m Создает домашний каталог, -s указывает на то, что пользователи по умолчанию используют оболочку, замену passwordи userдля ваших нужд.
ThorSummoner
2
Вы можете также соль пароль: useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). Я думаю, что это требуется на более поздних версиях Ubuntu.
craigmj
55

Код ниже работал в 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
Ин
источник
3
я не понимаю--gecos
Албан
11
en.wikipedia.org/wiki/Gecos_field Поле gecos или поле GECOS - это запись в файле / etc / passwd в Unix и аналогичных операционных системах. Обычно он используется для записи общей информации об учетной записи или ее пользователях, таких как их настоящее имя и номер телефона. GECOS означает комплексную операционную систему General Electric, которая была переименована в GCOS, когда крупное системное подразделение GE было продано Honeywell.
Ин
Это был правильный ответ для меня на Debian 8, который работал как прелесть в моем скрипте установки сервера!
levelzwo
Поле GECOS - это поле описания пользователя. Напишите там, что вы хотите.
Константин Ван
30

Мне понравился подход Tralemonkey, 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

Здесь должно быть достаточно одинарных кавычек.

Пол С
источник
2
Прекрасно работает в Bash. Однако, если работает в sh, то опция -e не работает. Я обнаружил, что он на самом деле выдает «-e». К счастью, опция -e не нужна в sh, экранирование там по умолчанию. Портативная версия должна использовать printf "пароль \ npassword \ n" | ... вместо
Дэн Берг Джонссон
Идеальный ответ для Ubuntu.
Машпи Рахман
23

Следующее работает у меня и проверено на Ubuntu 14.04. Это один вкладыш, который не требует никакого пользовательского ввода.

sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME

Взято из @Tralemonkey

cevaris
источник
13

Вы можете использовать опцию -p.

useradd -p encrypted_password newuser

К сожалению, для этого требуется, чтобы вы хэшировали пароль самостоятельно (где passwd сделает это за вас). К сожалению, не существует стандартной утилиты для хеширования некоторых данных, поэтому вам придется написать ее самостоятельно.

Вот небольшой скрипт на Python, который я написал для того, чтобы сделать шифрование для вас. Предполагая, что вы назвали его pcrypt, вы должны написать вышеприведенную командную строку:

useradd -p $(pcrypt ${passwd}) newuser

Пару предупреждений, о которых нужно знать.

  1. Во время работы pcrypt открытый текст будет виден любому пользователю с помощью команды ps.
  2. 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),))
R Самуэль Клатчко
источник
Спасибо R Klatchko, Это должно работать. Я не могу поверить, что я не знал о опции -p. Я могу позаботиться о хешировании себя :)
ModernCarpentry
5
perl -e 'print crypt ($ ARGV [0], "password")' 'mypassword'
mikewaters
Не могли бы вы немного объяснить, как я смогу позже использовать пароль, а не хешированный пароль?
answerSeeker
12

Единый вкладыш для создания пользователя sudo с домашним каталогом и паролем.

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
Sandeep
источник
Потрясающие. Хорошо работает в сценарии развертывания
TheRealChx101
7

--stdinне работает на Debian. Это говорит:

`passwd: unrecognized option '--stdin'`

Это сработало для меня:

#useradd $USER
#echo "$USER:$SENHA" | chpasswd

Здесь мы можем найти несколько других хороших способов:

Роджер
источник
Это правильный способ сделать это, и единственный способ, официально поддерживаемый сопровождающими теневого пакета. Смотрите этот отчет об ошибке .
Ярдена
6

Вы можете использовать ожидаемый в вашем скрипте 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"
Карлос Тасада
источник
5

Я знаю, что приеду в этом году спустя, но я не могу поверить, что никто не предложил 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 или много других команд вместо него.

Jeight
источник
3

Вот скрипт, который сделает это за вас .....

Вы можете добавить список пользователей (или только одного пользователя), если хотите, все сразу, и у каждого будет свой пароль. В качестве бонуса вы представлены в конце скрипта со списком паролей каждого пользователя. .... Если вы хотите, вы можете добавить некоторые параметры обслуживания пользователей

лайк:

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

===========

Надеюсь это поможет.

Ура, Карел

Карел Люббе
источник
2

Я проверил в своем собственном сценарии оболочки.

  • $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"

источник
1

Решение Tralemonkey почти сработало и для меня ... но не совсем. В итоге я сделал это так:

echo -n '$#@password@#$' | passwd myusername --stdin

2 ключевые детали, которые не были включены в его решение, не -nотражают добавление\n к паролю, который шифруется, и одинарные кавычки защищают содержимое от интерпретации оболочкой (bash) в моем случае.

Кстати, я выполнил эту команду от имени пользователя root в системе CentOS 5.6 на случай, если кому-то интересно.

ОДС
источник
хороший улов, не уверен, как другим удалось заставить его работать с новой строкой.
M03
1

Решение, которое работает как на 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
голем
источник
1

От 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

Вот и все. Решение является (а) масштабируемым и (б) не включает печать паролей в командной строке.

Вьетнхи пуван
источник
0

Для 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
Левша Дж Балог
источник
0

использование: ./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;
hustljian
источник