2009-04-03 14 views
43

मैं स्वचालित रूप से एक नया उपयोगकर्ता जोड़ने और अपना पासवर्ड अपडेट करने के लिए एक खोल स्क्रिप्ट लिख रहा हूं। मुझे नहीं पता कि नए पासवर्ड के लिए मुझे इंटरैक्टिव रूप से प्रेरित करने के बजाय शेल स्क्रिप्ट से पढ़ने के लिए पासवाड कैसे प्राप्त करें। मेरा कोड नीचे है।एक शेल स्क्रिप्ट के भीतर passwd कमांड का उपयोग

adduser $1 
passwd $1 
$2 
$2
+0

इसी प्रकार प्रश्न: http://askubuntu.com/questions/94060/run-adduser-non-interactively/667842#667842 – ThorSummoner

उत्तर

71
" man 1 passwd" से

:

--stdin 
      This option is used to indicate that passwd should read the new 
      password from standard input, which can be a pipe. 
अपने मामले में

तो

adduser "$1" 
echo "$2" | passwd "$1" --stdin 

[अद्यतन] कुछ मुद्दों टिप्पणियों में लाया गया:

आपका passwd कमांड मेंनहीं हो सकता हैविकल्प: ashawley द्वारा सुझाए गए अनुसार, chpasswd उपयोगिता का उपयोग करें।

यदि आप बैश के अलावा किसी अन्य शैल का उपयोग करते हैं, तो "echo" एक अंतर्निहित कमांड नहीं हो सकता है, और खोल /bin/echo पर कॉल करेगा। यह असुरक्षित है क्योंकि पासवर्ड प्रक्रिया तालिका में दिखाई देगा और ps जैसे टूल के साथ देखा जा सकता है।

इस मामले में, आपको एक और स्क्रिप्टिंग भाषा का उपयोग करना चाहिए।

#!/usr/bin/perl -w 
open my $pipe, '|chpasswd' or die "can't open pipe: $!"; 
print {$pipe} "$username:$password"; 
close $pipe 
+0

आपको अपने पैरामीटर विस्तार उद्धृत करना चाहिए। इसके अलावा, यह किसी भी तरह से आकार या रूप पोर्टेबल या यहां तक ​​कि थोड़ी सी भी सिफारिश की है। विषय पर कुछ और जानकारी के लिए मेरा जवाब देखें। – lhunath

+1

कृपया गूंज का उपयोग न करें ... | पारण शब्द! तब पासवर्ड पीएस चलाने वाले किसी अन्य उपयोगकर्ता को दिखाई देगा। और जितने अधिक स्थान आप पासवर्ड पास करते हैं (विभिन्न कार्यक्रम, फाइलें, पाइप इत्यादि), उतना अधिक संभावना है कि यह कहीं बाहर निकल जाएगा। –

+0

@ लुननाथ: आप उद्धरण के बारे में सही हैं, मैं इसे ठीक कर दूंगा। @ ब्रायन: "इको" एक बैश बिल्टिन है, यह * पीएस 'आउटपुट में दिखाई नहीं देगा (कम से कम बाश में, sh के बारे में निश्चित नहीं है) – 8jean

0

आप adduser की -p विकल्प को देखा है (जो AFAIK useradd के लिए सिर्फ एक और नाम है): यहाँ पर्ल में एक उदाहरण है? आप -Pluseradd के विकल्प को भी देखना चाहते हैं जो एक सादे टेक्स्ट पासवर्ड लेता है, लेकिन मुझे नहीं पता कि luseradd एक मानक कमांड है (यह एसई लिनक्स का हिस्सा हो सकता है या शायद फेडोरा की एक विषमता हो सकती है)।

1

इसने इस तरह की चीज़ के लिए एक सेंटोस वीएमवेयर छवि पर इसका परीक्षण किया। ध्यान दें कि आप शायद पासवर्ड को कमांड लाइन तर्क के रूप में डालने से बचना चाहते हैं, क्योंकि पूरी मशीन पर कोई भी उन्हें 'ps -ef' से बाहर पढ़ सकता है।

कहा कि, इस काम करेगा:

user="$1" 
password="$2" 
adduser $user 
echo $password | passwd --stdin $user 
24

से पढ़ें बुद्धिमान शब्द:

मैं बोली:

कुछ भी नहीं y कहां बाश में कर सकते हैं संभवतः काम कर सकते हैं। passwd (1) मानक इनपुट से नहीं पढ़ता है। यह जानबूझकर है। यह आपकी सुरक्षा के लिए है। पासवर्ड कभी कार्यक्रमों में शामिल नहीं किया गया था, या कार्यक्रमों द्वारा उत्पन्न किया गया था। वे केवल एक वास्तविक इंसान की उंगलियों द्वारा एक कार्यात्मक मस्तिष्क के साथ प्रवेश करने का इरादा रखते थे, और कभी भी कभी भी कभी भी लिखे गए नहीं थे।

फिर भी, हम उपयोगकर्ताओं की भीड़ प्राप्त करते हैं कि वे यूनिक्स सुरक्षा के 35 वर्षों को कैसे रोक सकते हैं।

यह पर चला जाता है समझाने के लिए कि कैसे आप अपने shadow(5) पासवर्ड ठीक से सेट कर सकते हैं, और आप GNU- से पता चलता मैं-केवल देखभाल के बारे में-सुरक्षा-अगर यह नहीं करता-कर मुझे-लगता है -टू -0-passwd(1) का दुरुपयोग करने का तरीका।

अंत में, यदि आप मूर्खतापूर्ण जीएनयू पासवर्ड (1) विस्तार --stdin उपयोग करने के लिए जा रहे हैं, पासवर्ड कमांड लाइन पर डालने से पारित नहीं है।

echo $mypassword | passwd --stdin # Eternal Sin. 
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE. 
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though. 
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure. 

पिछले सबसे अच्छा आप जीएनयू passwd के साथ कर सकते है। हालांकि मैं अभी भी इसकी सिफारिश नहीं करता।

कमांड लाइन पर पासवर्ड डालने का मतलब है कि बॉक्स में पहुंच के दूरस्थ रिमोट वाले किसी भी व्यक्ति को ps या ऐसे पासवर्ड की निगरानी हो सकती है। भले ही आपको लगता है कि आपका बॉक्स सुरक्षित है; यह कुछ है जो आपको वास्तव में हर कीमत से परहेज करने की आदत में मिलता है (हाँ, यहां तक ​​कि नौकरी पाने में थोड़ा और परेशानी करने की लागत)।

+1

क्या मैं पूछ सकता हूं कि यह अभी भी 'असुरक्षित' क्यों है? $ passwd --stdin <<< $ (कुछहोस्ट/कुछ उपयोगकर्ता पास करें) –

+1

@ जैकटैंग आपको अपने पैरामीटर विस्तार पर उद्धरण की आवश्यकता है। कारण <<< से कम सुरक्षित है <ऐसी फ़ाइल के साथ जिसमें अच्छी अनुमति है क्योंकि <<< बाहरी रूप से एक अस्थायी फ़ाइल बना सकता है जो बाहरी लोगों द्वारा पठनीय है। – lhunath

0

आप टीटी से पढ़े गए सभी कार्यक्रमों को चलाने के लिए the expect utility का उपयोग कर सकते हैं (जैसा कि stdin के विपरीत है, जो पासवर्ड करता है)। पासवाड एंट्री जैसे इंटरैक्टिव समस्याओं के सभी प्रकार के उदाहरणों के उदाहरण के लिए उम्मीद के साथ आता है।

40

एकमात्र समाधान Ubuntu 12.04 पर काम करता है:

echo -e "new_password\nnew_password" | (passwd user) 

लेकिन दूसरा विकल्प ही काम करता है जब मैं से बदलने के लिए:

echo "password:name" | chpasswd 

करने के लिए:

echo "user:password" | chpasswd 

मूल में स्पष्टीकरण देखें पोस्ट: Changing password via a script

+0

'echo 'उपयोगकर्ता: newpassword' | सूडो chpasswd', या बिना सूडो के रूट के रूप में। – ThorSummoner

+1

स्क्रिप्ट से कॉल करते समय सुडो का उपयोग एक अच्छा विचार नहीं है ... –

+0

क्या होगा यदि पासवर्ड में पहले मामले में "\ n" है? इसे संभालने का एक तरीका है? जैसे कि 'my @ secret \ npasword123' –

17

आजकल इस्तेमाल कर सकते हैं:

echo "user:pass" | chpasswd

+3

किसी कारण से मुझे आपके आदेश का प्रयास करते समय निम्न त्रुटि मिली: "प्रमाणीकरण टोकन मैनिपुलेशन त्रुटि"। Chpasswd से पहले सुडो जोड़ना मेरे लिए यह तय किया। –

0

कभी कभी यह एक पासवर्ड जो कोई नहीं जानता स्थापित करने के लिए उपयोगी है। यह काम करने के लिए लगता है:

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user 
+2

यह एक अज्ञात पासवर्ड देने के बजाय खाता खोलना/इसके लॉगिन को अक्षम करना बेहतर है, लेकिन इसके लॉगिन को सक्रिय करना छोड़ना बेहतर है। – DanFromGermany

+1

passwd --delete या --lock – temoto

0

मैं एक ही समस्या पर और किसी कारण "--stdin" विकल्प passwd के संस्करण मैं उपयोग कर रहा था (एक Ubuntu 14.04 पर भेज दिया) पर उपलब्ध नहीं था के लिए ठोकर खाई।

आप में से किसी एक ही प्रयोग करने के लिए होता है, तो आप इसे चारों ओर काम कर सकते हैं के रूप में मैंने किया था: इस तरह chpasswd कमांड का उपयोग करके:

echo "<user>:<password>" | chpasswd

0

यह एक Teradata नोड व्यवस्थापक के लिए निश्चित जवाब है

1: अपने/etc/hosts फ़ाइल गोटो और एक पाठ फ़ाइल

में आईपी के या नोड नामों की एक सूची बनाने ------------------ सी के लिए विन्यास फाइल RVers शुरू ------------
SMP007-1
SMP007-2
SMP007-3
------ अंत फ़ाइल cfg फ़ाइल से इन टिप्पणियों के बाहर छोड़ ---

अब स्क्रिप्ट


printf "प्रयोक्ता आईडी:" सभी नोड्स भर में एक पासवर्ड सेट
पढ़ MYUSERID
printf "नया पासवर्ड:"
` बिल्ली में पढ़ा MYPASS

मैं के लिए /usr/bin/setpwd.srvrs `

$ i
ssh जड़ पर पासवर्ड बदलने @ $ मैं sudo गूंज गूंज करना "$ MYUSERID": "$ MYPASS" | chpasswd
गूंज पासवर्ड $ i
किया पर बदल

ठीक है मैं जानता हूँ कि मैं ssh और जड़ साथ एक प्रमुख सुरक्षा नियम तोड़े हैं लेकिन मैं आपको इसके साथ सुरक्षा लोगों सौदा दूँगा

_________________________________
अपने setpwd.srvrs कॉन्फ़िग फ़ाइल के साथ अपने/usr/bin subdir में रखते

जब आप आदेश यह आपको उपयोगकर्ता आईडी
के लिए एक बार संकेत देता है चलानेफिर पासवर्ड के लिए एक बार। तब स्क्रिप्ट सभी nodes
setpwd.srvrs फ़ाइल में प्रत्येक नोड
पर पासवर्ड रहित एसएसएच करता है, फिर उपयोगकर्ता के संपर्क या माध्यमिक
पासवर्ड सत्यापन के बिना पासवर्ड सेट करता है। अब आप कितनी बार यह
करना चाहते थे लेकिन यह नहीं पता था कि कैसे? बड़ी ज़रूरत के साथ, महान नवाचार आता है।

सोचें कि सर्वर की सैकड़ों
के साथ व्यवस्थापक के लिए यह कितना उपयोगी है।

0

जो लोग दूर से एक स्क्रिप्ट के माध्यम से करने के लिए 'रूट के रूप में चलाने के' की जरूरत है sudoers फाइल में एक उपयोगकर्ता खाते में प्रवेश के लिए, मैं एक बुराई भयानक हैक पाया गया कि इसमें कोई शक नहीं बहुत असुरक्षित है:

sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH 
sudo -S su - << RROOT 
userpass 
echo "" 
echo "*** Got Root ***" 
echo "" 
#[root commands go here] 
useradd -m newuser 
echo "newuser:newpass" | chpasswd 
RROOT 
EOSSH 
संबंधित मुद्दे