Як автоматично додати обліковий запис користувача І пароль за допомогою сценарію 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 ]#

11
Чому це офтопік?
OrangeTux

16
Я думаю, це питання є тематичним. Однією з найсильніших тенденцій зараз є ставлення DevOps до "конфігурації як коду", тобто платформа створюється "програмуванням" послідовності кроків адміністратора, які завантажують платформу. Управління користувачем у режимі сценарію, безумовно, є частиною цього програмування.
Dan Bergh Johnsson

2
Як DevOps, я думаю, що це корисне питання (з корисними відповідями), але це стосується моєї шапки SysAdmin. Можливо, буде більше сенсу перенести це на SuperUser.
Ентоні Геоґеган

1
Аналогічне запитання: askubuntu.com/q/94060/250556
ThorSummoner

Це також можна вирішити за допомогою expectсценарію.
Ярон

Відповіді:


122

Ви можете запустити команду passwd і надіслати її вхідним шляхом. Отже, зробіть щось на кшталт:

echo thePassword | passwd theUsername --stdin

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. Сподіваюся, що це допомагає.
Амір Рустамзаде

чи можу я помістити це у файл докера? Я думаю, він повинен бути їстівним для докера.
підривання

201

Ви також можете використовувати chpasswd :

echo username:new_password | chpasswd

так, змінити пароль для користувача usernameв new_password.


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

Це також працює з busybox, тоді як passwdні (немає --stdinможливості).
Timmmm

83

Я запитував у себе те саме, і не хотів покладатися на сценарій Python.

У цьому рядку потрібно додати користувача з визначеним паролем в один рядок bash:

useradd -p $(openssl passwd -1 $PASS) $USER

25
useradd -p $(openssl passwd -1 $PASS) $USERє більш сучасним, оскільки зворотні кліщі застаріли і $()рекомендуються.
Брайсон

Проблема у мене була з цим: я створив свого користувача з оболонкою zsh, не розуміючи, що в цей момент zsh не був встановлений. Якщо ви зробите це, не вдасться ввійти через пароль, тому перш ніж припустити, що це не працює (воно обов'язково працюватиме на сьогоднішній Arch та на Debian 7), ви можете перевірити це на абсолютно новій установці.
Брайсон

2
useradd -m -p <password> -s /bin/bash <user>, -m Домашній каталог ящиків, -s вказує користувачеві defualt оболонку, замінник 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 означає загальну електричну комплексну операційну систему, яка була перейменована в GCOS, коли велика система систем GE була продана Honeywell.
Ян

Це була правильна відповідь для мене на Debian 8, працювала як шарм на моєму скрипті настройки сервера!
levelzwo

Поле GECOS - це поле опису користувача. Напиши все, що ти хочеш там.
Константин Ван

30

Мені сподобався підхід Тралемонкі, 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
Прекрасно працює в баші. Однак, якщо працює в sh, тоді опція -e не працює. Я з'ясував важкий шлях, що він насправді виводить "-e". На щастя, опція -e в SH не потрібна, параметр "escape" є типовим. Портативна версія - це використовувати printf "пароль \ nсловне слово \ n" | ... замість цього.
Dan Bergh Johnsson

Ідеальна відповідь для ubuntu.
Mashpy Rahman

23

Наступні роботи для мене і протестовані на Ubuntu 14.04. Це один вкладиш, який не потребує введення користувачем.

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

Взято з @Tralemonkey


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),))

Дякую Р Клачко, це повинно працювати. Я не можу повірити, що не знав про опцію -p. Я можу подбати про
хеширование

5
perl -e 'криптовалюта для друку ($ ARGV [0], "пароль")' mypassword '
mikewaters

Чи можете ви трохи пояснити, як я зможу пізніше використовувати пароль, а не хешований пароль?
відповідьПереглядач

12

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

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

Дивовижно. Добре працює в сценарії розгортання
TheRealChx101

7

--stdinне працює на Debian. Він говорить:

`passwd: unrecognized option '--stdin'`

Це працювало для мене:

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

Тут ми можемо знайти кілька інших хороших способів:


Це правильний спосіб зробити це, і єдиний спосіб, який офіційно підтримують ті, хто підтримує тіньовий набір. Дивіться цей звіт про помилку .
yardena

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 --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 або багато інших команд.


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) у моєму випадку.

BTW Я запустив цю команду як корінь у системі 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 та заповніть його користувачеві: паролі пар таким чином:

user1:password1
user2:password2
...
usern:passwordn

Збережіть файл text.txt та запустіть

cat text.txt | chpassword

Це воно. Рішення є (a) масштабованим і (b) не передбачає друку паролів у командному рядку.



0

Для RedHat / CentOS ось код, який створює користувач, додає паролі та робить користувача судором:

#!/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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.