Bagaimana cara menambahkan akun pengguna DAN kata sandi secara otomatis dengan skrip Bash?

200

Saya harus memiliki kemampuan untuk membuat akun pengguna di Linux saya (Fedora 10) dan secara otomatis menetapkan kata sandi melalui skrip bash (atau sebaliknya, jika perlu).

Sangat mudah untuk membuat pengguna melalui Bash misalnya:

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

Apakah mungkin untuk menetapkan kata sandi di Bash, sesuatu yang secara fungsional mirip dengan ini, tetapi secara otomatis:

[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[whoever@server ]#
ModernCarpentry
sumber
11
Mengapa ini offtopic?
OrangeTux
16
Saya pikir pertanyaan ini ada pada topik. Salah satu tren terkuat sekarang adalah sikap DevOps dari "konfigurasi sebagai kode", yaitu bahwa platform dibuat oleh "pemrograman" urutan langkah-langkah admin yang bootstrap platform. Untuk melakukan manajemen pengguna dalam mode skrip jelas merupakan bagian dari pemrograman ini.
Dan Bergh Johnsson
2
Sebagai seorang DevOps, saya pikir ini adalah pertanyaan yang berguna (dengan jawaban yang berguna) tapi itu dengan topi SysAdmin saya. Mungkin lebih masuk akal untuk memindahkan ini ke SuperUser.
Anthony Geoghegan
1
Pertanyaan serupa: askubuntu.com/q/94060/250556
ThorSummoner
Ini juga bisa diselesaikan dengan expectskrip.
Yaron

Jawaban:

122

Anda dapat menjalankan perintah passwd dan mengirimkannya input yang disalurkan. Jadi, lakukan sesuatu seperti:

echo thePassword | passwd theUsername --stdin
Tralemonkey
sumber
3
Bonus dari metode itu adalah aman (diasumsikan echoadalah builtin di shell yang digunakan, yang biasanya), setidaknya memprihatinkan /proc/.
Marian
8
Saya harus melakukan echo -e "password\npassword\n" | passwdpada 13,04
d0c_s4vage
31
--stdin telah ditinggalkan dalam sistem Linux yang lebih baru. Silakan gunakan chpasswd sebagai gantinya.
wuxb
16
@MarkusOrreilly berfungsi, tetapi tidak ketika menggunakan alat bawaan seperti Ansible. Seperti @Nybble menyatakan, Anda harus menggunakan chpasswd. Jadi di sini adalah apa yang bekerja: echo 'myuser:mypass' | chpasswd. Semoga itu bisa membantu.
Amir Rustamzadeh
dapatkah saya menaruh ini di file buruh pelabuhan? Saya pikir itu harus dimakan untuk buruh pelabuhan.
qubsup
201

Anda juga bisa menggunakan chpasswd :

echo username:new_password | chpasswd

jadi, Anda mengubah password untuk pengguna usernameuntuk new_password.

SilverDaemon
sumber
5
+1, Ini adalah alat yang tepat untuk pekerjaan itu: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K
Ini juga berfungsi dengan baik busybox, sedangkan passwdtidak (tidak ada --stdinpilihan).
Timmmm
83

Saya bertanya pada diri sendiri hal yang sama, dan tidak ingin mengandalkan skrip Python.

Ini adalah baris untuk menambahkan pengguna dengan kata sandi yang ditentukan dalam satu baris bash:

useradd -p $(openssl passwd -1 $PASS) $USER
Damien
sumber
25
useradd -p $(openssl passwd -1 $PASS) $USERlebih modern, karena back-ticks sudah tidak digunakan lagi dan $()direkomendasikan.
Bryson
Masalah yang saya alami dengan ini: Saya telah membuat pengguna saya dengan shell zsh, tidak menyadari bahwa pada saat itu zsh belum diinstal. Login kata sandi akan gagal jika Anda melakukan ini, jadi sebelum Anda menganggap ini tidak berfungsi (itu pasti akan berfungsi pada Arch hari ini dan pada Debian 7) Anda mungkin memeriksa itu pada instalasi baru.
Bryson
2
useradd -m -p <password> -s /bin/bash <user>, -m direktori home Crates, -s menetapkan pengguna defualt shell, pengganti passworddan useruntuk kebutuhan Anda.
ThorSummoner
2
Anda juga dapat garam password: useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). Saya pikir ini diperlukan pada Ubuntu nanti.
craigmj
55

Kode di bawah ini berfungsi di Ubuntu 14.04. Coba sebelum Anda menggunakannya di varian versi / linux lainnya.

# 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
Ying
sumber
3
saya tidak mengerti--gecos
Alban
11
en.wikipedia.org/wiki/Gecos_field Bidang gecos, atau bidang GECOS adalah entri dalam file / etc / passwd di Unix, dan sistem operasi serupa. Biasanya digunakan untuk mencatat informasi umum tentang akun atau penggunanya seperti nama asli dan nomor telepon mereka. GECOS berarti Sistem Operasi Komprehensif Umum Listrik, yang telah diubah namanya menjadi GCOS ketika divisi sistem GE yang besar dijual ke Honeywell.
Ying
Ini adalah jawaban yang tepat untuk saya di Debian 8, bekerja seperti pesona pada skrip bash pengaturan Server saya!
levelzwo
Bidang GECOS pada dasarnya adalah bidang deskripsi pengguna. Tulis apa pun yang Anda inginkan di sana.
Константин Ван
30

Saya menyukai pendekatan Tralemonkey echo thePassword | passwd theUsername --stdinmeskipun itu tidak berhasil bagi saya seperti yang tertulis. Namun ini berhasil untuk saya.

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

-eadalah untuk mengenali \nsebagai baris baru.

sudo adalah akses root untuk Ubuntu.

Kutipan ganda adalah untuk mengenali $dan memperluas variabel.

Perintah di atas melewati kata sandi dan baris baru, dua kali, untuk passwd, yang passwddiperlukan.

Jika tidak menggunakan variabel, saya pikir ini mungkin berhasil.

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

Kutipan tunggal harus mencukupi di sini.

Paul S
sumber
2
Bekerja dengan indah di bash. Namun, jika berjalan di sh, maka opsi -e tidak berfungsi. Saya menemukan cara sulit yang sebenarnya menghasilkan "-e". Untungnya, opsi -e tidak diperlukan di sh, melarikan diri adalah default di sana. Versi portabelnya menggunakan printf "password \ npassword \ n" | ... sebagai gantinya.
Dan Bergh Johnsson
Jawaban sempurna untuk ubuntu.
Mashpy Rahman
23

Berikut ini berfungsi untuk saya dan diuji pada Ubuntu 14.04. Ini adalah liner satu yang tidak memerlukan input pengguna apa pun.

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

Diambil dari @Tralemonkey

cevaris
sumber
13

Anda dapat menggunakan opsi -p.

useradd -p encrypted_password newuser

Sayangnya, ini mengharuskan Anda untuk hash kata sandi sendiri (di mana passwd melakukan itu untuk Anda). Sayangnya, sepertinya tidak ada utilitas standar untuk hash beberapa data sehingga Anda harus menulis sendiri.

Berikut ini adalah skrip Python kecil yang saya siapkan untuk melakukan enkripsi untuk Anda. Dengan asumsi Anda menyebutnya pcrypt, Anda kemudian akan menulis baris perintah di atas untuk:

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

Beberapa peringatan yang harus diperhatikan.

  1. Saat pcrypt sedang berjalan, plaintext akan terlihat oleh semua pengguna melalui perintah ps.
  2. pcrypt menggunakan fungsi crypt gaya lama - jika Anda menggunakan sesuatu yang lebih modern seperti hash MD5, Anda harus mengubah pcrypt.

dan inilah 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 Samuel Klatchko
sumber
Terima kasih R Klatchko, Itu seharusnya berhasil. Saya tidak percaya saya tidak tahu tentang opsi -p. Saya dapat mengurus hashing sendiri :)
ModernCarpentry
5
perl -e 'print crypt ($ ARGV [0], "password")' 'mypassword'
mikewaters
Bisakah Anda jelaskan sedikit, bagaimana saya bisa menggunakan kata sandi dan bukan kata sandi hash nanti?
answerSeeker
12

Single liner untuk membuat pengguna sudo dengan direktori home dan kata sandi.

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}
Sandeep
sumber
Luar biasa. Berfungsi dengan baik dalam skrip penerapan
TheRealChx101
7

--stdintidak berfungsi pada Debian. Ia mengatakan:

`passwd: unrecognized option '--stdin'`

Ini bekerja untuk saya:

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

Di sini kita dapat menemukan beberapa cara bagus lainnya:

Roger
sumber
Ini adalah cara yang tepat untuk melakukannya, dan satu-satunya cara yang secara resmi didukung oleh pengelola shadow suite. Lihat laporan bug ini .
yardena
6

Anda dapat menggunakan harapkan dalam skrip bash Anda.

Dari 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"
Carlos Tasada
sumber
5

Saya tahu saya akan datang pada tahun ini kemudian, tetapi saya tidak percaya tidak ada yang menyarankan usermod.

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

Sial, siapa tahu ada yang mau melakukan ini pada HPUX lama yang bisa Anda gunakan usermod.sam.

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

-F hanya diperlukan jika orang yang mengeksekusi skrip adalah pengguna saat ini. Tentu saja Anda tidak perlu menggunakan Perl untuk membuat hash. Anda dapat menggunakan openssl atau banyak perintah lain sebagai gantinya.

Jeight
sumber
3

Ini adalah skrip yang akan melakukannya untuk Anda .....

Anda dapat menambahkan daftar pengguna (atau hanya satu pengguna) jika Anda mau, semuanya dalam sekali jalan dan masing-masing akan memiliki kata sandi yang berbeda. Sebagai bonus Anda disajikan di akhir skrip dengan daftar kata sandi setiap pengguna. .... Jika mau, Anda dapat menambahkan beberapa opsi perawatan pengguna

Suka:

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

ke skrip yang akan mengatur usia kata sandi dan sebagainya.

=======

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

===========

Semoga ini membantu.

Ceria, Carel

Carel Lubbe
sumber
2

Saya sudah menguji skrip shell saya sendiri.

  • $new_username berarti pengguna yang baru dibuat
  • $new_password berarti kata sandi baru

Untuk CentOS

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

Untuk Debian / Ubuntu

echo "$new_username:$new_password" | chpasswd

Untuk OpenSUSE

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

sumber
1

Solusi Tralemonkey hampir berhasil untuk saya juga ... tetapi tidak cukup. Saya akhirnya melakukannya dengan cara ini:

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

2 detail kunci solusinya tidak termasuk, -nterus gema dari menambahkan \nkata sandi yang semakin dienkripsi, dan tanda kutip tunggal melindungi konten dari ditafsirkan oleh shell (bash) dalam kasus saya.

BTW saya menjalankan perintah ini sebagai root pada sistem CentOS 5.6 kalau-kalau ada yang bertanya-tanya.

slm
sumber
tangkapan bagus, tidak yakin bagaimana orang lain berhasil membuatnya bekerja dengan baris baru thingy.
M03
1

Solusi yang bekerja pada Debian dan Red Hat. Tergantung pada perl, menggunakan hash 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

Pemakaian:

userpassadd jim jimslongpassword

Ini dapat digunakan secara efektif sebagai satu-liner, tetapi Anda harus menentukan sendiri kata sandi, garam, dan nama pengguna di tempat yang tepat:

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

Dari IBM ( https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm ):

Buat file teks, ucapkan text.txt dan isi dengan pengguna: pasangan kata sandi sebagai berikut:

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

Simpan file text.txt, dan jalankan

cat text.txt | chpassword

Itu dia. Solusinya adalah (a) dapat diskalakan dan (b) tidak melibatkan pencetakan kata sandi pada baris perintah.

Vietnhi Phuvan
sumber
0
{ echo $password; echo $password; } | passwd $username 
edacval
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini.
Werner
0

Untuk RedHat / CentOS inilah kode yang menciptakan pengguna, menambahkan kata sandi dan membuat pengguna menjadi 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
Lefty G Balogh
sumber
0

pemakaian: ./my_add_user.sh USER PASSWD

kode:

#!/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;
hustljian
sumber