วิธีเพิ่มบัญชีผู้ใช้และรหัสผ่านโดยอัตโนมัติด้วยสคริปต์ Bash


200

ฉันต้องมีความสามารถในการสร้างบัญชีผู้ใช้บน Linux ของฉัน (Fedora 10) และกำหนดรหัสผ่านโดยอัตโนมัติผ่านสคริปต์ทุบตี (หรืออื่น ๆ ถ้าจำเป็น)

ง่ายในการสร้างผู้ใช้ผ่าน 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 hat มันอาจจะเหมาะสมกว่าถ้าจะย้ายสิ่งนี้ไปยัง SuperUser
Anthony Geoghegan

1
คำถามที่คล้ายกัน: askubuntu.com/q/94060/250556
ThorSummoner

สิ่งนี้สามารถแก้ไขได้ด้วยexpectสคริปต์
Yaron

คำตอบ:


122

คุณสามารถรันคำสั่ง passwd และส่งไปยังอินพุต piped ดังนั้นทำสิ่งที่ชอบ:

echo thePassword | passwd theUsername --stdin

3
โบนัสของวิธีการที่เป็นที่เป็นที่ปลอดภัย (สันนิษฐานว่าechoเป็น builtin ในเปลือกที่ใช้ซึ่งมันเป็นปกติ) /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ดังนั้นนี่คือสิ่งที่ทำงาน: หวังว่าจะช่วย
Amir Rustamzadeh

ฉันจะใส่มันลงในไฟล์ docker ได้ไหม? ฉันคิดว่ามันน่าจะกินได้สำหรับนักเทียบท่า
qubsup

201

คุณสามารถใช้chpasswd :

echo username:new_password | chpasswd

ดังนั้นคุณเปลี่ยนรหัสผ่านสำหรับผู้ใช้เพื่อusernamenew_password


5
+1 นี้เป็นเครื่องมือที่เหมาะสมสำหรับงาน: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
สตีเว่น K

วิธีนี้ใช้ได้กับbusyboxในขณะที่passwdไม่มี (ไม่มี--stdinตัวเลือก)
Timmmm

83

ฉันถามตัวเองในสิ่งเดียวกันและไม่ต้องการพึ่งพาสคริปต์ Python

นี่คือบรรทัดสำหรับเพิ่มผู้ใช้ด้วยรหัสผ่านที่กำหนดในหนึ่งบรรทัด bash:

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

25
useradd -p $(openssl passwd -1 $PASS) $USERมีความทันสมัยมากขึ้นเนื่องจากมีการยกเลิกเห็บและ$()แนะนำให้ใช้
Bryson

ปัญหาที่ฉันมี: ฉันสร้างผู้ใช้ด้วย shell of zsh โดยไม่ทราบว่า ณ จุดนั้น zsh ไม่ได้ถูกติดตั้ง การเข้าสู่ระบบรหัสผ่านจะล้มเหลวถ้าคุณทำเช่นนี้ดังนั้นก่อนที่คุณจะคิดว่ามันไม่ทำงาน (มันจะใช้งานได้กับ Arch ของวันนี้และบน Debian 7) คุณอาจตรวจสอบว่ามีการติดตั้งใหม่หรือไม่
Bryson

2
useradd -m -p <password> -s /bin/bash <user>, -m โฮมไดเร็กทอรี Crates, -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
Alban

11
en.wikipedia.org/wiki/Gecos_field ฟิลด์ gecos หรือฟิลด์ GECOS เป็นรายการในไฟล์ / etc / passwd บน Unix และระบบปฏิบัติการที่คล้ายคลึงกัน โดยทั่วไปจะใช้เพื่อบันทึกข้อมูลทั่วไปเกี่ยวกับบัญชีหรือผู้ใช้เช่นชื่อจริงและหมายเลขโทรศัพท์ GECOS หมายถึงระบบปฏิบัติการที่ครอบคลุมทั่วไปของ General Electric ซึ่งเปลี่ยนชื่อเป็น GCOS เมื่อแผนกระบบขนาดใหญ่ของ GE ถูกขายให้กับ Honeywell
Ying

นี่คือคำตอบที่ถูกต้องสำหรับฉันใน 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
ทำงานได้อย่างสวยงามในทุบตี อย่างไรก็ตามหากทำงานใน sh ตัวเลือก -e จะไม่ทำงาน ฉันพบวิธีที่ยากจริง ๆ แล้วมันส่งออก "-e" โชคดีที่ไม่จำเป็นต้องใช้ตัวเลือก -e ใน sh การหลบหนีเป็นค่าเริ่มต้นที่นั่น รุ่นพกพาคือการใช้ "password \ npassword \ n" | printf ... แทน.
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 ใช้ฟังก์ชัน crypt แบบเก่า - หากคุณใช้สิ่งที่ทันสมัยกว่าเช่นแฮช 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 Klatchko นั่นน่าจะใช้ได้ ฉันไม่อยากจะเชื่อเลยว่าฉันไม่รู้เกี่ยวกับตัวเลือก -p ฉันสามารถดูแลคร่ำเครียดตัวเองได้ :)
ModernCarpentry

5
perl -e 'print crypt ($ ARGV [0], "รหัสผ่าน")' 'mypassword'
mikewaters

คุณช่วยอธิบายได้นิดหน่อยว่าฉันจะใช้รหัสผ่านได้อย่างไรและไม่ใช้รหัสผ่านที่ถูกแฮชในภายหลัง
answerSeeker

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

คุณสามารถใช้ความคาดหวังในสคริปต์ทุบตีของคุณ

จาก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

===========

หวังว่านี่จะช่วยได้

ไชโย Carel


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รหัสผ่านที่ได้รับการเข้ารหัสและคำพูดเดียวปกป้องเนื้อหาจากการตีความโดยเชลล์ (ทุบตี) ในกรณีของฉัน

BTW ฉันรันคำสั่งนี้เป็นรูทในระบบ CentOS 5.6 ในกรณีที่มีใครสงสัย


จับดีไม่แน่ใจว่าคนอื่นจัดการเพื่อให้มันทำงานกับ newline thingy ได้อย่างไร
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 นี่คือรหัสที่สร้างผู้ใช้เพิ่มรหัสผ่านและทำให้ผู้ใช้เป็น 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.