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

Мне нужно иметь возможность создавать учетные записи пользователей в моем 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 ]#

20 ответов

Решение

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

echo thePassword | passwd theUsername --stdin

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

echo username:new_password | chpasswd

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

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

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

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

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

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

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

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

Взято из @Tralemonkey

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

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

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

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

`passwd: unrecognized option '--stdin'`

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

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

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

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

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

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

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

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

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

лайк:

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

===========

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

Ура, Карел

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

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

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

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

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

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

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

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

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

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

Пожалуйста, запустите приведенный ниже сценарий с разрешением sudo для создания пользователя по сценарию.

Примечание. Этот скрипт поддерживает все ОС Linux, такие как Redhat, Centos, Ubuntu, suse, kali, Arch, Bitname, BSD и т. д.

      #!/bin/bash
#author: bablish jaiswal
#purpos: Linux user creation with a storng password
clear
#echo "Hi, I am a function to create sudo user with strong password. Kindly share following information"
echo -e "\n\n\n"
printf "\e[6;33mHi, I am a function to create sudo user with a strong password. Kindly share following information\e[0m";echo
read -p "user name:- " name #input name
read -p "complete path for $name home directory? example: /home/$name :- " home #user home path
( useradd  -m -d $home $name -s /bin/bash ) > /dev/null 2>&1
pass=$(cat /dev/urandom |tr -dc "[[:graph:]]" |head -c16)
(echo -e "$pass\n$pass" | passwd $name ) > /dev/null 2>&1
echo " "
printf "\e[6;33m-----------------------------Copy below credentials-------------------------\e[0m";echo
echo -e "User:- $name\nHomeDir:- $home\npassword:- $pass"
#svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{$1=""}1')
svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{print $2}')
echo "${name} ${svalue} NOPASSWD:ALL" >> /etc/sudoers && echo “Remark:- User $name is a sudo user”
Другие вопросы по тегам