كيفية تمرير كلمة السر لسو / سودو / سه دون تجاوز TTY؟

StackOverflow https://stackoverflow.com/questions/233217

سؤال

وأنا أكتب برنامج C شل التي سيتم القيام su أو sudo أو ssh. انهم يريدون كل كلمات المرور الخاصة بهم في إدخال وحدة التحكم (على TTY) بدلا من ستدين أو سطر الأوامر.

هل أحد يعرف الحل؟

إعداد كلمة مرور أقل 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

وأما بالنسبة سه، لقد جعلت العديد من المحاولات لأتمتة / النصي استخدام انها من دون نجاح. لا يبدو أن هناك أي طريقة البناء في لتمرير كلمة السر في الأمر دون المطالبة. كما ذكر آخرون، و" نتوقع " يبدو فائدة مثل أنه يهدف إلى معالجة هذه المعضلة ولكن في النهاية ، ووضع الصحيح إذن خاص مفتاح هو الطريق الصحيح للذهاب عند محاولة لأتمتة هذه.

نصائح أخرى

وكتبت بعض ابليسكريبت التي يطالب كلمة المرور عن طريق مربع الحوار ثم يبني أمر باش مخصصة، مثل هذا:

echo <password> | sudo -S <command>

ولست متأكدا إذا كان هذا يساعد.

وسيكون لطيفا اذا قبلت سودو كلمة مرور مشفرة مسبقا، حتى أتمكن من تشفير في غضون مخطوطتي ولا تقلق بشأن مرددا كلمات السر نص واضح حولها. ولكن هذا يعمل بالنسبة لي وضعي.

لssh يمكنك استخدام sshpass: sshpass -p yourpassphrase ssh user@host

وتحتاج فقط لتحميل sshpass أولا:)

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

ولقد حصلت على:

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

ويعمل بالنسبة لي.

ويمكن أن يتم ذلك عن طريق إنشاء الجمهور / مفاتيح خاصة على المضيفين الهدف الذي سيتم الاتصال به. فإن الخطوة الأولى هي إنشاء مفتاح سه للمستخدم تشغيل البرنامج النصي على المضيف المحلي، من خلال تنفيذ:

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

وثم إدخال كلمة مرور فارغة. بعد ذلك، قم بنسخ مفتاح سه الخاصة بك على المضيف الهدف الذي سوف يتم الاتصال به.

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

وبعد تسجيل مفاتيح سه، هل سيكون قادرا على إجراء ssh remote_user@other_host الصمت منك المضيف المحلي.

والحل المعتاد لهذه المشكلة هو setuiding التطبيق المساعد الذي ينفذ مهمة تتطلب الوصول الخارق: http://en.wikipedia.org/wiki/Setuid

وليس المقصود

سودو ليتم استخدامها حاليا.

وفي وقت لاحق تحرير: SSH يمكن استخدامها مع مصادقة المفتاح الخاص والعام. إذا لم يكن لديك المفتاح الخاص عبارة مرور، سه يمكن استخدامها دون المطالبة بكلمة مرور.

لسودو يمكنك أن تفعل ذلك أيضا:

sudo -S <<< "password" command

وعندما يكون هناك أي خيار أفضل (كما اقترح من قبل الآخرين)، ثم رجل socat يمكن أن تساعد:

   (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.

وكل من بي تي واي، setsid، ctty التعقيد هو ضروري و، في حين قد لا تحتاج إلى النوم دام، وسوف تحتاج إلى النوم. صدى = 0 الخيار يستحق نظرة جدا، كما هو تمرير الأمر البعيد على سطر الأوامر سه ل.

وربما يمكنك استخدام أمر expect

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

وهذا الأمر يعطي كلمة السر تلقائيا.

ونلقي نظرة على فائدة expect لينكس.

وانها تسمح لك لإرسال الإخراج إلى stdio بناء على نمط بسيط مطابقة على ستدين.

وتعيين SSH تصل للمصادقة المفاتيح العامة، مع عدم وجود pasphrase على مفتاح. الكثير من الأدلة على الشبكة. لن تحتاج كلمة مرور للدخول ذلك الحين. ثم يمكنك تقييد اتصالات للحصول على مفتاح القائمة على المضيف العميل. يوفر الأمن معقول وتعتبر كبيرة بالنسبة لتسجيل الدخول الآلي.

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

وكان لي نفس المشكلة. السيناريو الحوار لخلق دليل على الكمبيوتر عن بعد. الحوار مع سه أمرا سهلا. يمكنني استخدام 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

وتحيات من ألمانيا

وتيتوس

استخدم:

echo password | sudo command

مثال:

echo password | sudo apt-get update; whoami

ونأمل أن يساعد ..

وبناء على @ الجواب جاهد، وهذا عمل بالنسبة لي على ماك 10.13:

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

ويمكنك تقديم كلمة المرور كمعلمة أن نتوقع النصي.

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

وهذا هو العمل.

وHardcoding كلمة مرور في نتوقع السيناريو هو نفس وجود سودو passwordless ما هو أسوأ في الواقع، منذ سودو بتسجيل ما لا يقل عن أوامره.

وطريقة واحدة سيكون لاستخدام الخيار قراءة -s .. بهذه الطريقة لا يتم ردد أحرف كلمة المرور إلى الشاشة. كتبت نصي صغير لبعض حالات الاستخدام ويمكنك أن ترى ذلك في بلدي بلوق: http://www.datauniv.com/ بلوق / 2013/02/21 / على بعد سريعة قليلا، نتوقع النصي /

su -c "Command" < "Password"

آمل أن يكون مفيدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top