Làm cách nào để tự động thêm tài khoản người dùng VÀ mật khẩu bằng tập lệnh Bash?


200

Tôi cần có khả năng tạo tài khoản người dùng trên Linux của mình (Fedora 10) và tự động gán mật khẩu thông qua tập lệnh bash (hoặc nếu không, nếu cần).

Thật dễ dàng để tạo người dùng thông qua Bash, vd:

[whoever@server ]#  /usr/sbin/useradd newuser

Có thể gán mật khẩu trong Bash, một cái gì đó có chức năng tương tự như thế này, nhưng tự động:

[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
Tại sao điều này là không chính thức?
OrangeTux

16
Tôi nghĩ rằng câu hỏi này là về chủ đề. Một trong những xu hướng mạnh nhất hiện nay là thái độ DevOps về "cấu hình như mã", tức là nền tảng được tạo ra bằng cách "lập trình" một chuỗi các bước quản trị khởi động nền tảng. Để thực hiện quản lý người dùng trong chế độ tập lệnh chắc chắn là một phần của chương trình này.
Dan Bergh Johnsson

2
Là một DevOps, tôi nghĩ rằng đây là một câu hỏi hữu ích (có câu trả lời hữu ích) nhưng đó là với chiếc mũ SysAdmin của tôi. Có thể có ý nghĩa hơn khi chuyển cái này sang SuperUser.
Anthony Geoghegan

1
Câu hỏi tương tự: askubfox.com/q/94060/250556
ThorSummoner

Điều này cũng có thể được giải quyết với một expectkịch bản.
Yaron

Câu trả lời:


122

Bạn có thể chạy lệnh passwd và gửi đầu vào đường ống. Vì vậy, hãy làm một cái gì đó như:

echo thePassword | passwd theUsername --stdin

3
Phần thưởng của phương pháp đó là nó an toàn (giả định echolà một phần dựng sẵn trong vỏ được sử dụng, thường là vậy), ít nhất là liên quan /proc/.
Mary

8
Tôi phải làm echo -e "password\npassword\n" | passwdvào ngày 13.04
d0c_s4vage

31
--stdin đã bị phản đối trong các hệ thống Linux mới hơn. Vui lòng sử dụng chpasswd thay thế.
wuxb

16
@MarkusOrreilly hoạt động, nhưng không phải khi sử dụng công cụ cung cấp như Ansible. Như @Nybble đã nêu, bạn nên sử dụng chpasswd. Vì vậy, đây là những gì hoạt động : echo 'myuser:mypass' | chpasswd. Mong rằng sẽ giúp.
Amir Rustamzadeh

Tôi có thể đặt cái này trong một tập tin docker không? Tôi nghĩ rằng nó nên ăn được cho docker.
qubsup

201

Bạn cũng có thể sử dụng chpasswd :

echo username:new_password | chpasswd

như vậy, bạn thay đổi mật khẩu cho người sử dụng usernameđể new_password.


5
+1, Đây là công cụ phù hợp cho công việc: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K

Điều này cũng hoạt động với busybox, trong khi passwdkhông (không có --stdintùy chọn).
Timmmm

83

Tôi đã tự hỏi mình điều tương tự và không muốn dựa vào tập lệnh Python.

Đây là dòng để thêm người dùng có mật khẩu được xác định trong một dòng bash:

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

25
useradd -p $(openssl passwd -1 $PASS) $USERlà hiện đại hơn, vì back-tick bị phản đối và $()được khuyến khích.
Bryson

Một vấn đề tôi gặp phải với điều này: Tôi đã tạo người dùng của mình bằng shell zsh, không nhận ra rằng tại thời điểm đó zsh chưa được cài đặt. Đăng nhập mật khẩu sẽ thất bại nếu bạn làm điều này, vì vậy trước khi bạn cho rằng điều này không hoạt động (chắc chắn nó sẽ hoạt động trên Arch ngày nay và trên Debian 7), bạn có thể kiểm tra xem trên bản cài đặt hoàn toàn mới.
Bryson

2
useradd -m -p <password> -s /bin/bash <user>, -m thư mục nhà Crates, -s chỉ định người dùng xác định shell, thay thế passwordusercho nhu cầu của bạn.
ThorSummoner

2
Bạn cũng có thể muối mật khẩu : useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). Tôi nghĩ rằng điều này là bắt buộc trên các Ubuntu sau này.
craigmj

55

Mã dưới đây hoạt động trong Ubuntu 14.04. Hãy thử trước khi bạn sử dụng nó trong các phiên bản / biến thể linux khác.

# 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
tôi không hiểu--gecos
Alban

11
vi.wikipedia.org/wiki/Gecos_field Trường gecos hoặc trường GECOS là một mục trong tệp / etc / passwd trên Unix và các hệ điều hành tương tự. Nó thường được sử dụng để ghi thông tin chung về tài khoản hoặc (các) người dùng của tài khoản, chẳng hạn như tên thật và số điện thoại của họ. GECOS có nghĩa là Hệ điều hành toàn diện điện chung, đã được đổi tên thành GCOS khi bộ phận hệ thống lớn của GE được bán cho Honeywell.
Ying

Đây là câu trả lời đúng cho tôi trên Debian 8, hoạt động như một cơ duyên trên tập lệnh bash thiết lập Máy chủ của tôi!
levelzwo

Trường GECOS về cơ bản là trường mô tả người dùng. Viết bất cứ điều gì bạn muốn xuống đó.
Toàn cảnh

30

Tôi thích cách tiếp cận của Tralemonkey echo thePassword | passwd theUsername --stdin mặc dù nó không hoàn toàn phù hợp với tôi như đã viết. Điều này tuy nhiên làm việc cho tôi.

echo -e "$password\n$password\n" | sudo passwd $user

-e là để nhận ra \n là dòng mới.

sudo là quyền truy cập root cho Ubuntu.

Các trích dẫn kép là để nhận ra $ và mở rộng các biến.

Lệnh trên chuyển mật khẩu và một dòng mới, hai lần, để passwd , đó là những gìpasswd yêu cầu.

Nếu không sử dụng biến, tôi nghĩ rằng điều này có thể hoạt động.

echo -e 'password\npassword\n' | sudo passwd username

Báo giá duy nhất nên đủ ở đây.


2
Hoạt động đẹp trong bash. Tuy nhiên, nếu chạy trong sh, thì tùy chọn -e không hoạt động. Tôi phát hiện ra một cách khó khăn mà nó thực sự tạo ra "-e". May mắn thay, tùy chọn -e là không cần thiết trong sh, thoát là mặc định ở đó. Phiên bản di động là sử dụng printf "password \ npassword \ n" | ... thay thế.
Dan Bergh Johnsson

Câu trả lời hoàn hảo cho Ubuntu.
Mashpy Rahman

23

Các công việc sau đây cho tôi và đã thử nghiệm trên Ubuntu 14.04. Nó là một lớp lót không yêu cầu bất kỳ đầu vào của người dùng.

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

Lấy từ @Tralemonkey


13

Bạn có thể sử dụng tùy chọn -p.

useradd -p encrypted_password newuser

Thật không may, điều này không yêu cầu bạn tự băm mật khẩu (trong đó passwd làm điều đó cho bạn). Thật không may, dường như không có một tiện ích tiêu chuẩn để băm một số dữ liệu nên bạn sẽ phải tự viết nó.

Đây là một đoạn mã Python nhỏ mà tôi đã đánh dấu để thực hiện mã hóa cho bạn. Giả sử bạn gọi nó là pcrypt, sau đó bạn sẽ viết dòng lệnh trên của mình thành:

useradd -p $(pcrypt ${passwd}) newuser

Một vài cảnh báo cần lưu ý.

  1. Trong khi pcrypt đang chạy, bản rõ sẽ hiển thị cho bất kỳ người dùng nào thông qua lệnh ps.
  2. pcrypt sử dụng chức năng mã hóa kiểu cũ - nếu bạn đang sử dụng thứ gì đó hiện đại hơn như băm MD5, bạn sẽ cần thay đổi pcrypt.

và đây là 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),))

Cảm ơn R Klatchko, Điều đó sẽ làm việc. Tôi không thể tin rằng tôi đã không biết về tùy chọn -p. Tôi có thể tự chăm sóc bản thân mình băm :)
ModernCarpentry

5
perl -e 'in mật mã ($ ARGV [0], "mật khẩu")' 'mypassword'
mikewaters

Bạn có thể giải thích một chút, làm thế nào tôi có thể sử dụng mật khẩu và không phải mật khẩu băm sau này?
answerSeeker

12

Đơn lót để tạo một người dùng sudo với thư mục nhà và mật khẩu.

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

Tuyệt vời. Hoạt động tốt trong tập lệnh triển khai
TheRealChx101

7

--stdinkhông hoạt động trên Debian. Nó nói rằng:

`passwd: unrecognized option '--stdin'`

Điều này làm việc cho tôi:

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

Ở đây chúng ta có thể tìm thấy một số cách tốt khác:


Đây là cách thích hợp để làm điều đó và là cách duy nhất chính thức được hỗ trợ bởi những người duy trì bộ bóng. Xem báo cáo lỗi này .
yardena

6

Bạn có thể sử dụng mong đợi trong tập lệnh bash của bạn.

Từ 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

Tôi biết rằng tôi sẽ đến vào những năm sau này, nhưng tôi không thể tin rằng không ai đề nghị sử dụng.

usermod --password `perl -e "print crypt('password','sa');"` root

Chết tiệt, chỉ trong trường hợp ai đó muốn làm điều này trên một HPUX cũ hơn bạn có thể sử dụng usermod.sam.

/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username

-F chỉ cần thiết nếu người thực thi tập lệnh là người dùng hiện tại. Tất nhiên bạn không cần sử dụng Perl để tạo hàm băm. Bạn có thể sử dụng openssl hoặc nhiều lệnh khác ở vị trí của nó.


3

Đây là một kịch bản sẽ làm điều đó cho bạn .....

Bạn có thể thêm danh sách người dùng (hoặc chỉ một người dùng) nếu bạn muốn, tất cả trong một lần và mỗi người sẽ có một mật khẩu khác nhau. Là một phần thưởng bạn được trình bày ở phần cuối của tập lệnh với một danh sách mỗi mật khẩu người dùng. .... Nếu bạn muốn, bạn có thể thêm một số tùy chọn bảo trì người dùng

giống:

chage -m 18 $user
chage -M 28 $user

đến tập lệnh sẽ đặt tuổi mật khẩu, v.v.

=======

#!/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

===========

Hi vọng điêu nay co ich.

Chúc mừng, Carel


2

Tôi đã thử nghiệm trong kịch bản shell của riêng tôi.

  • $new_username nghĩa là người dùng mới được tạo
  • $new_password có nghĩa là mật khẩu mới

Đối với CentOS

echo "$new_password" | passwd --stdin "$new_username"

Dành cho Debian / Ubuntu

echo "$new_username:$new_password" | chpasswd

Dành cho OpenSUSE

echo -e "$new_password\n$new_password" | passwd "$new_username"

1

Giải pháp của Tralemonkey gần như cũng có tác dụng với tôi ... nhưng không hoàn toàn. Tôi cuối cùng đã làm theo cách này:

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

2 chi tiết chính mà giải pháp của anh không bao gồm, -ntiếng vang không cho thêm \nmật khẩu đang được mã hóa và các trích dẫn duy nhất bảo vệ nội dung khỏi bị giải thích bởi shell (bash) trong trường hợp của tôi.

BTW Tôi đã chạy lệnh này với quyền root trên hệ thống CentOS 5.6 trong trường hợp có ai thắc mắc.


nắm bắt tốt, không chắc chắn làm thế nào những người khác quản lý để làm cho nó hoạt động với dòng mới.
M03

1

Giải pháp hoạt động trên cả Debian và Red Hat. Phụ thuộc vào perl, sử dụng băm 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

Sử dụng:

userpassadd jim jimslongpassword

Nó thực sự có thể được sử dụng như một lớp lót, nhưng bạn sẽ phải chỉ định mật khẩu, muối và tên người dùng ở đúng nơi:

useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username


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

Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây.
Werner

0

Đối với RedHat / CentOS, đây là mã tạo người dùng, thêm mật khẩu và khiến người dùng trở thành 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

sử dụng: ./my_add_user.sh USER PASSWD

mã:

#!/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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.