बैश स्क्रिप्ट के साथ उपयोगकर्ता खाता और पासवर्ड को स्वचालित रूप से कैसे जोड़ें?


200

मुझे अपने लिनक्स (फेडोरा 10) पर उपयोगकर्ता खाते बनाने और स्वचालित रूप से एक बैश स्क्रिप्ट के माध्यम से एक पासवर्ड असाइन करने की आवश्यकता है (या अन्यथा, यदि आवश्यक हो)।

बश के माध्यम से उपयोगकर्ता बनाना आसान है जैसे:

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

क्या बैश में पासवर्ड असाइन करना संभव है, इसके लिए कुछ कार्यात्मक रूप से, लेकिन स्वचालित रूप से:

[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
यह ऑफटॉपिक क्यों है?
ऑरेंजटैक्स

16
मुझे लगता है कि यह सवाल विषय पर है। अब सबसे मजबूत रुझानों में से एक "कोड के रूप में कॉन्फ़िगरेशन" का DevOps रवैया है, यानी कि मंच को "प्रोग्रामिंग" द्वारा बनाया गया है, जो कि मंच को बूटस्ट्रैप करता है। स्क्रिप्ट मोड में उपयोगकर्ता प्रबंधन करना निश्चित रूप से इस प्रोग्रामिंग का हिस्सा है।
डैन बरग जॉनसन

2
एक DevOps के रूप में, मुझे लगता है कि यह एक उपयोगी प्रश्न है (उपयोगी उत्तरों के साथ) लेकिन यह मेरे SysAdmin टोपी पर है। इसे SuperUser में स्थानांतरित करने के लिए अधिक समझदारी हो सकती है।
एंथोनी गोगेगन

1
इसी तरह के सवाल: askubuntu.com/q/94060/250556
ThorSummoner

यह भी एक expectस्क्रिप्ट के साथ हल किया जा सकता है ।
यार्न

जवाबों:


122

आप पासवार्ड कमांड चला सकते हैं और इसे पाइप किए गए इनपुट भेज सकते हैं। तो, कुछ इस तरह से करें:

echo thePassword | passwd theUsername --stdin

3
उस पद्धति का बोनस यह है कि यह सुरक्षित है (यह माना जाता echoहै कि इस्तेमाल किए गए शेल में एक बिलिन है, जो कि यह आमतौर पर है), कम से कम विषय में /proc/
मैरियन

8
मुझे echo -e "password\npassword\n" | passwd13.04
d0c_s4vage

31
-स्टीन को नए लिनक्स सिस्टम में अपदस्थ किया गया है। कृपया इसके बजाय chpasswd का उपयोग करें।
wuxb

16
@MarkusOrreilly काम करता है, लेकिन जब एंसीबल जैसे प्रावधान उपकरण का उपयोग नहीं किया जाता है। जैसा कि @Nybble ने कहा, आपको chpasswd का उपयोग करना चाहिए। तो यहाँ क्या काम करता है: echo 'myuser:mypass' | chpasswd। उम्मीद है की वो मदद करदे।
अमीर रुस्तमजादेह

क्या मैं इसे डॉक फ़ाइल में डाल सकता हूँ? मुझे लगता है कि यह डॉकटर के लिए खाद्य होना चाहिए।
qubsup

201

तुम भी chpasswd का उपयोग कर सकते हैं :

echo username:new_password | chpasswd

इसलिए, आप उपयोगकर्ता के usernameलिए पासवर्ड बदलते हैं new_password


5
+1, यह नौकरी के लिए सही उपकरण है: $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
स्टीवन के

यह भी साथ काम करता है busybox, जबकि passwdऐसा नहीं है (कोई --stdinविकल्प नहीं है)।
टिम्म्म

83

मैं खुद से वही बात पूछ रहा था, और पायथन स्क्रिप्ट पर भरोसा नहीं करना चाहता था।

यह एक बैश लाइन में परिभाषित पासवर्ड के साथ एक उपयोगकर्ता को जोड़ने की रेखा है:

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

25
useradd -p $(openssl passwd -1 $PASS) $USERअधिक आधुनिक है, क्योंकि बैक-टिक्स को हटा दिया गया है और $()इसकी सिफारिश की गई है।
ब्रायसन

एक मुद्दा जो मेरे पास था: मैंने अपने उपयोगकर्ता को zsh के खोल के साथ बनाया था, यह एहसास नहीं था कि उस बिंदु पर zsh स्थापित नहीं था। यदि आप ऐसा करते हैं, तो पासवर्ड लॉगिन विफल हो जाएगा, इसलिए यह मानने से पहले कि यह काम नहीं कर रहा है (यह निश्चित रूप से आज के आर्क पर और डेबियन 7 पर काम करेगा) आप एक नए इंस्टॉलेशन पर जांच कर सकते हैं।
ब्रायनसन

2
useradd -m -p <password> -s /bin/bash <user>, -m क्रेट होम डाइरेक्टरी, -s यूज़र्स को डिफॉल्ट शेल, विकल्प passwordऔर userआपकी आवश्यकताओं के लिए निर्दिष्ट करता है ।
थोरसुमोनर

2
आप पासवर्ड को भी नमक कर सकते हैं useradd -m -p $(openssl passwd -1 -salt $SALT $PASS):। मुझे लगता है कि बाद में उबंटू की आवश्यकता है।
क्रेग्मज

55

नीचे दिए गए कोड Ubuntu 14.04 में काम किया। इससे पहले कि आप इसे अन्य संस्करणों / लिनक्स वेरिएंट में उपयोग करने का प्रयास करें।

# 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
एल्बन

11
en.wikipedia.org/wiki/Gecos_field Gecos फ़ील्ड, या GECOS फ़ील्ड Unix पर / etc / passwd फ़ाइल और इसी तरह के ऑपरेटिंग सिस्टम में एक प्रविष्टि है। यह आमतौर पर खाते या उसके उपयोगकर्ता (जैसे) के बारे में सामान्य जानकारी रिकॉर्ड करने के लिए उपयोग किया जाता है जैसे कि उनका वास्तविक नाम और फोन नंबर। जीईसीओएस का अर्थ है जनरल इलेक्ट्रिक कॉम्प्रिहेंसिव ऑपरेटिंग सिस्टम, जिसका नाम बदलकर GCOS कर दिया गया है जब GE के बड़े सिस्टम डिवीजन को हनीवेल को बेच दिया गया था।
यिंग

यह डेबियन 8 पर मेरे लिए सही उत्तर था, मेरे सर्वर सेटअप बैश स्क्रिप्ट पर एक आकर्षण की तरह काम किया!
लेवलज़्वो

GECOS फ़ील्ड मूल रूप से एक उपयोगकर्ता विवरण फ़ील्ड है। जो कुछ भी आप चाहते हैं, वहां लिखें।
Константин Ван

30

मुझे त्रैलोमनीके का दृष्टिकोण पसंद आया, echo thePassword | passwd theUsername --stdinहालांकि यह मेरे लिए काफी काम नहीं आया। हालांकि इसने मेरे लिए काम किया।

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

-e\nनई लाइन के रूप में पहचान करना है ।

sudo उबंटू के लिए रूट एक्सेस है।

दोहरे उद्धरण चिह्नों को पहचानने $और विस्तार करने के लिए हैं।

उपरोक्त कमांड पासवर्ड और एक नई लाइन, दो बार, को पास करता है passwd, जो कि passwdआवश्यक है।

यदि चर का उपयोग नहीं कर रहा है, मुझे लगता है कि यह शायद काम करता है।

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

एकल उद्धरण यहाँ पर्याप्त होना चाहिए।


2
खूबसूरती से काम करता है। हालांकि, यदि श में चल रहा है, तो -e विकल्प काम नहीं करता है। मुझे पता चला कि यह वास्तव में "-ई" का कठिन तरीका है। सौभाग्य से, श में ई-विकल्प आवश्यक नहीं है, पलायन वहां डिफ़ॉल्ट है। पोर्टेबल संस्करण प्रिंटफ का उपयोग करना है "पासवर्ड \ npassword \ n" | ... बजाय।
डैन बर्ग जॉन्सन

Ubuntu के लिए एकदम सही जवाब।
मशीह रहमान

23

निम्नलिखित मेरे लिए काम करता है और Ubuntu 14.04 पर परीक्षण किया गया। यह एक लाइनर है जिसे किसी भी उपयोगकर्ता इनपुट की आवश्यकता नहीं है।

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

@Tralemonkey से लिया गया


13

-P विकल्प का उपयोग कर सकते हैं।

useradd -p encrypted_password newuser

दुर्भाग्य से, इसके लिए आपको पासवर्ड को स्वयं हैश करना होगा (जहां पासवार्ड आपके लिए करता है)। दुर्भाग्य से, कुछ डेटा हैश करने के लिए एक मानक उपयोगिता प्रतीत नहीं होती है इसलिए आपको यह लिखना होगा कि आप स्वयं।

यहाँ एक छोटी सी स्क्रिप्ट है जिसे मैंने आपके लिए एन्क्रिप्शन करने के लिए व्हिप किया था। यदि आप इसे PCrypt कहते हैं, तो आप फिर अपनी उपरोक्त कमांड लाइन को लिखेंगे:

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

चेतावनी के एक जोड़े के बारे में पता करने के लिए।

  1. जब पीसीक्रिप्ट चल रही है, तो प्लेसेक्स्ट पीएस कमांड के माध्यम से किसी भी उपयोगकर्ता को दिखाई देगा।
  2. pcrypt पुराने शैली के क्रिप्ट फ़ंक्शन का उपयोग करता है - यदि आप MD5 हैश की तरह कुछ और आधुनिक उपयोग कर रहे हैं, तो आपको 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),))

धन्यवाद आर क्लाचको, यह काम करना चाहिए। मैं विश्वास नहीं कर सकता कि मैं -p विकल्प के बारे में नहीं जानता था। मैं खुद हैशिंग की देखभाल कर सकता हूँ :)
आधुनिक करैरी

5
perl -e 'प्रिंट क्रिप्ट ($ ARGV [0], "पासवर्ड")' 'mypassword'
mikewaters

क्या आप थोड़ा सा समझा सकते हैं, कि मैं पासवर्ड का उपयोग कैसे कर पाऊंगा और बाद में हैशेड पासवर्ड का उपयोग नहीं कर पाऊंगा?
जवाबशीकर

12

घर निर्देशिका और पासवर्ड के साथ एक sudo उपयोगकर्ता बनाने के लिए एकल लाइनर।

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

बहुत बढ़िया। तैनाती स्क्रिप्ट में अच्छी तरह से काम करता है
TheRealChx101

7

--stdinडेबियन पर काम नहीं करता है। इसे कहते हैं:

`passwd: unrecognized option '--stdin'`

यह मेरे लिए काम किया:

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

यहां हम कुछ अन्य अच्छे तरीके खोज सकते हैं:


यह इसे करने का उचित तरीका है, और एकमात्र तरीका है जो आधिकारिक तौर पर छाया सूट के रखवाले द्वारा समर्थित है। इस बग रिपोर्ट देखें ।
19 फरवरी को यार्डेन

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 की जरूरत तभी पड़ती है जब स्क्रिप्ट निष्पादित करने वाला व्यक्ति वर्तमान उपयोगकर्ता होता है। बेशक हैश बनाने के लिए आपको पर्ल का उपयोग करने की आवश्यकता नहीं है। आप इसके स्थान पर ओपनसेल या कई अन्य कमांड का उपयोग कर सकते हैं।


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

===========

उम्मीद है की यह मदद करेगा।

चीयर्स, केयरल


2

मैंने अपनी शेल स्क्रिप्ट में परीक्षण किया है।

  • $new_username नव निर्मित उपयोगकर्ता का मतलब है
  • $new_password मतलब नया पासवर्ड

CentOS के लिए

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

डेबियन / उबंटू के लिए

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 सिस्टम पर चला रहा था जब कोई भी सोच रहा हो।


अच्छी पकड़, निश्चित नहीं कि अन्य लोग इसे नईलाइन के साथ काम करने में कैसे कामयाब हुए।
M03

1

समाधान जो डेबियन और रेड हैट दोनों पर काम करता है। पर्ल पर निर्भर करता है, 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

बस। समाधान (ए) स्केलेबल और (बी) कमांड लाइन पर प्रिंटिंग पासवर्ड शामिल नहीं है।



0

RedHat / CentOS के लिए यहां एक कोड है जो एक उपयोगकर्ता बनाता है, पासवर्ड जोड़ता है और उपयोगकर्ता को सुडोल बनाता है:

#!/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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.