TTY ओवरराइड किए बिना su / sudo / ssh को पासवर्ड कैसे पास करें?


148

मैं एक सी शेल प्रोग्राम लिख रहा हूं जो कर रहा होगा suयाsudo या ssh। वे सभी अपने पासवर्ड को कंसोल में इनपुट (TTY) चाहते हैं बजाय स्टडिन या कमांड लाइन के।

किसी को भी एक समाधान पता है?

पासवर्ड-कम सेट करना sudoकोई विकल्प नहीं है।

एक विकल्प हो सकता है, लेकिन यह मेरे स्ट्रिप-डाउन सिस्टम पर मौजूद नहीं है।



जवाबों:


215

Sudo के लिए मानक इनपुट से पासवर्ड स्वीकार करने के लिए -S विकल्प है। यहाँ आदमी प्रवेश है:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

यह आपको कमांड चलाने की अनुमति देगा जैसे:

echo myPassword | sudo -S ls /tmp

Ssh के रूप में, मैंने बिना किसी सफलता के इसके उपयोग / स्क्रिप्ट को स्वचालित करने के लिए कई प्रयास किए हैं। बिना प्रॉम्प्ट के पासवर्ड को कमांड में पास करने का कोई तरीका नहीं है। जैसा कि दूसरों ने उल्लेख किया है, " उम्मीद " उपयोगिता ऐसा लगता है कि इसका उद्देश्य इस दुविधा को संबोधित करना है, लेकिन अंततः, सही निजी-कुंजी प्राधिकरण की स्थापना इस को स्वचालित करने का प्रयास करते समय जाने का सही तरीका है।


2
सौभाग्य से, रूबी में एक अंतर्निहित एसएसएच क्लाइंट है जो आपको पासवर्ड निर्दिष्ट करने की अनुमति देता है। आप रूबी-ई की कोशिश कर सकते हैं, इसके लिए 'नेट / ssh' की आवश्यकता होती है; नेट :: SSH.start ('example.com', 'test_user',: पासवर्ड => 'गुप्त') करते हैं। ssh | पुट 'सफलतापूर्वक लॉग इन' हो जाता है। जबकि cmd = मिलता है, ssh.exec डालता है! (cmd); अंतिम छोर "
user1158559

13
मुझे यहां एक पार्टी पॉपर होने से नफरत है, लेकिन ऐसा करने से आपका पासवर्ड एक प्रक्रिया सूची में दिखाई दे सकता है। मैं एक बेहतर तरीका निर्धारित करने की कोशिश कर रहा था और इस लेख के सामने आया और आश्चर्य हुआ कि किसी ने भी इसे इंगित नहीं किया था। महान समाधान, लेकिन जोखिमों से सावधान रहें।
मैट

Ssh के बारे में, क्या आपने कनेक्शन स्ट्रिंग में पासवर्ड पास करने की कोशिश की है? पसंद है nonroot:yourpassword@hostname.com? यदि आप मुख्य नियम और कुंजी प्रबंधक का उपयोग करते हैं तो बेशक चीजें बहुत आसान हैं।
किल्लाह

12
पासवर्ड को प्रोसेस लिस्ट में दिखाने से बचें या फाइल को फाइल में डालकर और कैट का इस्तेमाल करके लॉग इन करें; 'cat pw | sudo -S <command>, और बाद में rm pw
CAB

एक और तरीका है नेटकेट का उपयोग करना और एक सॉकेट पर पासवर्ड वितरित करना होगा - nc -l 12345 | sudo -S <command>। भेजने की तरफ; echo myPassord | nc <target> 12345। यह सिर्फ पासवर्ड हैंडलिंग की समस्या को हल करता है, लेकिन संभवतः एक मास्टर कंसोल पर है जहाँ आपके पास अधिक विकल्प हैं।
CAB

36

मैंने कुछ Applescript लिखा है जो एक संवाद बॉक्स के माध्यम से पासवर्ड के लिए संकेत देता है और फिर इस तरह एक कस्टम बैश कमांड बनाता है:

echo <password> | sudo -S <command>

मुझे यकीन नहीं है कि अगर यह मदद करता है।

यह अच्छा होगा यदि sudo एक पूर्व-एन्क्रिप्टेड पासवर्ड को स्वीकार करता है, इसलिए मैं इसे अपनी स्क्रिप्ट के भीतर एन्क्रिप्ट कर सकता हूं और आसपास के स्पष्ट टेक्स्ट पासवर्ड को गूंजने की चिंता नहीं करता। हालाँकि यह मेरे और मेरी स्थिति के लिए काम करता है।


27

के लिए sshआप उपयोग कर सकते हैं sshpass: sshpass -p yourpassphrase ssh user@host

आपको बस sshpass पहले डाउनलोड करना होगा :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

मुझे मिल गया है:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

मेरे लिये कार्य करता है।


मेरे लिए काम नहीं किया। अभी भी ssh पासवर्ड के लिए संकेत देता है।
एकेएस

उत्कृष्ट, अंत में कुछ मैं उपयोग कर सकते हैं! धन्यवाद। मैं इसे एक bash स्क्रिप्ट के भीतर उपयोग करता हूं जो ssh सत्र शुरू करता है और ग्राहक को sudo कमांड देता है। मेरी स्क्रिप्ट में संकल्प है: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell


10

इस समस्या का सामान्य समाधान एक सहायक ऐप सेट करना है जो सुपरयूज़र एक्सेस की आवश्यकता वाले कार्य करता है: http://en.wikipedia.org/wiki/Setuid

सूडो का उपयोग ऑफ़लाइन होने के लिए नहीं है।

बाद में संपादित करें: SSH का उपयोग निजी-सार्वजनिक कुंजी प्रमाणीकरण के साथ किया जा सकता है। यदि निजी कुंजी में पासफ़्रेज़ नहीं है, तो पासवर्ड के लिए संकेत दिए बिना ssh का उपयोग किया जा सकता है।


10

यह आपके द्वारा कनेक्ट किए जा रहे लक्ष्य होस्ट पर सार्वजनिक / निजी कुंजी सेट करके किया जा सकता है। पहला कदम स्थानीय होस्ट पर स्क्रिप्ट चलाने वाले उपयोगकर्ता के लिए एक ssh कुंजी उत्पन्न करना होगा, जिसे निष्पादित करके:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

फिर एक खाली पासवर्ड डालें। उसके बाद, अपने ssh कुंजी को लक्ष्य होस्ट पर कॉपी करें जिसे आप कनेक्ट कर रहे हैं।

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Ssh कुंजियों को पंजीकृत करने के बाद, ssh remote_user@other_hostआप स्थानीय होस्ट से मौन प्रदर्शन कर सकेंगे ।


7

शायद आप एक expectकमांड का उपयोग कर सकते हैं ? "

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

वह कमांड अपने आप पासवर्ड देता है।


अच्छा लग रहा है, लेकिन मैं रूट अनुमति के बिना एक मस्कीन पर उम्मीद कमांड कैसे सक्षम कर सकता हूं?
Radon8472

1
यदि आपके पास इसे स्थापित करने की अनुमति नहीं है, तो @ Radon8472 एक निष्पादन योग्य ~ / बिन में जोड़ा जा सकता है। यदि आपका सिस्टम अपने PATH में स्वचालित रूप से ~ / बिन नहीं जोड़ता है, तो आप ऐसा मैन्युअल रूप से निर्यात PATH = "$ PATH: ~ / bin" के साथ कर सकते हैं या स्वचालित रूप से करने के लिए अपने प्रोफ़ाइल में उस आदेश को जोड़ सकते हैं। यदि आप अपना पथ बदलना नहीं चाहते हैं, तो आप इसके पूर्ण पथ का उपयोग करके कमांड निष्पादित कर सकते हैं: ~ / बिन / उम्मीद [तर्क] इसके निष्पादन योग्य बिट सेट करने के लिए याद रखना सुनिश्चित करें: chmod + x ~ / bin / उम्मीद
StarCashrr

6

जब कोई बेहतर विकल्प नहीं होता है (जैसा कि दूसरों द्वारा सुझाया गया है), तो आदमी समाज मदद कर सकता है:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

पीटी, सेटसाइड, शेट्टी जटिलता सभी आवश्यक है और, जब तक आपको सोने की आवश्यकता नहीं होगी, आपको सोने की आवश्यकता होगी। इको = 0 विकल्प भी देखने लायक है, क्योंकि ssh की कमांड लाइन पर रिमोट कमांड गुजर रही है।


1
यह वास्तव में भी काम करेगा susu-S (स्टडिन) विकल्प नहीं है।
गुदा

क्या सोने से बचना और इसके बजाय कुछ अधिक विश्वसनीय उपयोग करना संभव है?
माइकल पैंकोव

6

पर एक नज़र डालें expectलिनक्स उपयोगिता ।

यह आपको स्टड पर मिलान करने वाले सरल पैटर्न के आधार पर आउटपुट को स्टैडियो में भेजने की अनुमति देता है।


1

सार्वजनिक कुंजी प्रमाणीकरण के लिए SSH सेट करें, कुंजी पर कोई पस्फ़्रेज़ नहीं है। नेट पर गाइड के भार। इसके बाद आपको लॉगिन करने के लिए पासवर्ड की आवश्यकता नहीं होगी। फिर आप क्लाइंट होस्टनाम के आधार पर एक कुंजी के लिए कनेक्शन सीमित कर सकते हैं। उचित सुरक्षा प्रदान करता है और स्वचालित लॉगिन के लिए बहुत अच्छा है।


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

यदि आप ssh कुंजी के साथ उपयोगकर्ता के रूप में लॉग इन कर सकते हैं, तो sudo एक्सेस ठीक है: ssh -t user @ host "e my mypassword | sudo -S sudocommand"
Jack

0

मुझे भी यही समस्या थी। दूरस्थ पीसी पर निर्देशिका बनाने के लिए संवाद स्क्रिप्ट। ssh के साथ संवाद आसान है। मैं sshpass (पहले से स्थापित) का उपयोग करता हूं।

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

जर्मनी से शुभकामनायें

टाइटस


0

@ जाहिद के जवाब पर बिल्डिंग, इसने मेरे लिए macOS 10.13 पर काम किया:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

एक बेहतर sshpassविकल्प है:passh https://github.com/clarkwang/passh

रिमोट सर्वर पर लॉगिन करें

 $ passh -p password ssh user@host

रिमोट सर्वर पर एक कमांड चलाएँ

 $ passh -p password ssh user@host date

पासवर्ड पास करने के अन्य तरीके

पासवर्ड (डिफ़ॉल्ट: `पासवर्ड ')

-p env: env var से पासवर्ड पढ़ें

-p फाइल: फाइल से पासवर्ड पढ़ें

यहाँ मैंने बताया कि यह sshpass, और अन्य समाधानों से बेहतर क्यों है।


-1
echo <password> | su -c <command> <user> 

यह काम कर रहा है।


1
फेडोरा में मेरे लिए यह एकमात्र काम है। लोग जवाब सिर्फ इसलिए देते हैं क्योंकि वे अपनी स्थिति में काम नहीं करते हैं?
हैंगचेन यू

2
"सु: को एक टर्मिनल से चलाया जाना चाहिए" (RPi1B, रास्पबियन)
notme1560

दुर्भाग्य से यह हाल के संस्करणों में नहीं है su, जो इसके बजाय stdio से पासवर्ड पढ़ता है ।
मॉउटंजर

-1

किसी पासवर्ड को किसी उम्मीद की स्क्रिप्ट में हार्डकोड करना एक पासवर्डलेस sudo होने के समान है, वास्तव में इससे भी बदतर, क्योंकि sudo कम से कम अपने कमांड को लॉग करता है।


-1

एक तरीका यह होगा कि रीड-एस विकल्प का उपयोग किया जाए .. इस तरह से पासवर्ड वर्णों को स्क्रीन पर वापस इको नहीं किया जाता है। मैंने कुछ उपयोग मामलों के लिए एक छोटी स्क्रिप्ट लिखी है और आप इसे मेरे ब्लॉग में देख सकते हैं: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/


-1

उपयोग:

echo password | sudo command

उदाहरण:

echo password | sudo apt-get update; whoami

आशा करता हूँ की ये काम करेगा..


-2

स्क्रिप्ट की अपेक्षा करने के लिए आप पैरामीटर के रूप में पासवर्ड प्रदान कर सकते हैं।


-11
su -c "Command" < "Password"

आशा है कि यह मददगार है।


1
यह। "su: टर्मिनल से चलाया जाना चाहिए" इसका उत्तर है।
thelogix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.