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

155

Мне нужно иметь возможность создавать учетные записи пользователей на моем 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 ]#
  • 10
    Почему это оффтоп?
  • 13
    Я думаю, что этот вопрос по теме. Одной из самых сильных тенденций сейчас является отношение DevOps к «конфигурации как коду», то есть к тому, что платформа создается путем «программирования» последовательности шагов администратора, которые загружают платформу. Управление пользователями в режиме сценария, безусловно, является частью этого программирования.
Показать ещё 3 комментария
Теги:
passwd

19 ответов

107
Лучший ответ

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

echo thePassword | passwd theUsername --stdin
  • 3
    Преимущество этого метода в том, что он безопасен (предполагается, что echo - это встроенная в используемую оболочку, как это обычно бывает), по крайней мере, в отношении /proc/ .
  • 27
    Это не работает на Ubuntu 12.04 или Debian 6.0.5.
Показать ещё 6 комментариев
182

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

echo username:new_password | chpasswd

поэтому вы меняете пароль для пользователя username на new_password.

  • 5
    +1, это правильный инструмент для работы: $ apropos chpasswd ... chpasswd (8) - update passwords in batch mode
67

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

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

useradd -p $(openssl passwd -1 $PASS) $USER
  • 2
    в Ubuntu 12 .... useradd -p `openssl passwd $ PASS` $ USER
  • 20
    useradd -p $(openssl passwd -1 $PASS) $USER более современен, поскольку обратные тики устарели и рекомендуется $() .
Показать ещё 3 комментария
43

Код ниже работал в 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
  • 9
    en.wikipedia.org/wiki/Gecos_field Поле gecos или поле GECOS - это запись в файле / etc / passwd в Unix и аналогичных операционных системах. Обычно он используется для записи общей информации об учетной записи или ее пользователях, таких как их настоящее имя и номер телефона. GECOS означает комплексную операционную систему General Electric, которая была переименована в GCOS, когда крупное системное подразделение GE было продано Honeywell.
Показать ещё 2 комментария
28

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

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

  • 2
    Прекрасно работает в Bash. Однако, если работает в sh, то опция -e не работает. Я обнаружил, что он на самом деле выдает «-e». К счастью, опция -e не нужна в sh, экранирование там по умолчанию. Портативная версия должна использовать printf "пароль \ npassword \ n" | ... вместо
  • 0
    Работал у меня в санто 6,4 !!!
Показать ещё 2 комментария
22

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

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

Взято с @Tralemonkey

  • 2
    Это сработало и для меня в Dockerfile.
11

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

useradd -p encrypted_password newuser

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

Здесь немного Python script Я взломал, чтобы сделать шифрование для вас. Предполагая, что вы назвали его 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),))
  • 0
    Спасибо R Klatchko, Это должно работать. Я не могу поверить, что я не знал о опции -p. Я могу позаботиться о перемешивании себя :)
  • 5
    perl -e 'print crypt ($ ARGV [0], "password")' 'mypassword'
Показать ещё 2 комментария
7

--stdin не работает в Debian. В нем говорится:

`passwd: unrecognized option '--stdin'`

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

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

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

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

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

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
5

Вы можете использовать ожидание в 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"
4

Я знаю, что я приду в эти годы позже, но я не могу поверить, что никто не предложил нам.

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 или многие другие команды на своем месте.

3

Вот 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, Карел

2

Я тестировал свою собственную оболочку script.

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

От 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) не требует печати паролей в командной строке.

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

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

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

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

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

  • 0
    хороший улов, не уверен, как другим удалось заставить его работать с новой строкой.
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;
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
{ echo $password; echo $password; } | passwd $username 
  • 0
    Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню