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

Мне нужно иметь возможность создавать учетные записи пользователей на моем Linux (Fedora 10) и автоматически назначать пароль через bash script (или, в противном случае, если потребуется).

Легко создать пользователя через bash например:

[[email protected] ]#  /usr/sbin/useradd newuser

Можно ли назначить пароль в Bash, что-то функционально похожее на это, но автоматически:

[[email protected] ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[[email protected] ]#

Ответ 1

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

echo thePassword | passwd theUsername --stdin

Ответ 2

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

echo username:new_password | chpasswd

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

Ответ 3

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

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

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

Ответ 4

Код ниже работал в 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

Ответ 5

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

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

Ответ 6

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

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

Взято с @Tralemonkey

Ответ 7

Вы можете использовать опцию -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),))

Ответ 8

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

`passwd: unrecognized option '--stdin'`

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

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

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

Я тестировал свою собственную оболочку 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"

Ответ 14

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

echo -n '$#@[email protected]#$' | passwd myusername --stdin

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

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

Ответ 15

Решение, которое работает как на 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

Ответ 16

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

Ответ 17

{ echo $password; echo $password; } | passwd $username 

Ответ 18

Для 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

Ответ 19

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