تشغيل البرنامج النصي التفاعلي shell باسم المستخدم الآخر

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

  •  26-09-2019
  •  | 
  •  

سؤال

في البرنامج النصي الخاص بي (باش) أريد أن أسمي البرامج النصية الأخرى للقذيفة.
أقوم بتشغيل البرنامج النصي الخاص بي كـ user_a. واحد من هذه البرامج النصية يحتاج إلى معالجة خاصة:

  1. يجب تشغيله كمستخدم مختلف (user_b). كلمة المرور المطلوبة هنا.
  2. إنه تفاعلي ، ولكن ليس فقط يسأل أسئلة ولكنه يدير برنامج نصي آخر باسم مستخدم آخر (user_c) باستخدام SU. لا بد لي من إدخال كلمة مرور هنا أيضًا.

يمكنني استخدام SU استدعاء هذا البرنامج النصي ولكن يجب الإجابة على أسئلته بطريقة أو بأخرى. لا يمكنني إدخال أي شيء لأنه يطبع لكل Questons "Stty :: ليس آلة كاتبة"

أنا أتصل بالسيناريو الخاص بهذه الطريقة

su user_B << ABC
...
special_script
...
ABC
هل كانت مفيدة؟

المحلول

#!/bin/bash

main_for_root(){
    :
}
# ------------------------------------------------------------------------------
abs_path="$(readlink -f `dirname $0`)/$(basename $0)"

# if [ `id -u` != 0 ] ; then
if [ `whoami` != 'root' ] ; then
    echo "[su -] run as root"
    su -c"/bin/bash $abs_path $@"
    exit 0
else
    main_for_root $@
fi

إنه يعمل لمستخدم واحد ، لذا أضف الآن "إذا ..." للمستخدم الثاني

نصائح أخرى

خيار آخر لتشغيل البرامج النصية كمستخدمين آخرين هو أمر "Sudo" ، فكر في الأمر على أنه "Superuser Do:" لأغراض قابلية القراءة. المعلمة -u تعطي معلومات اسم المستخدم. لذا:

sudo -u user_B special_script

سوف يطالب بكلمة المرور لـ user_b. لم أواجه مشكلة في تشغيل برامج تفاعلية باستخدامها. يمكنك إدارة من يمكنه sudo إلى من خلال أمر Visudo.

يمكنك استخدام Sudo وإنشاء ملف sudoers يسمح لـ user_a بتشغيل البرنامج النصي كـ user_b.

خط مثل:

user_A      ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC

سيسمح user_a بالقيام بشيء مثل

sudo -u user_B /usr/share/stuff/ABC

دون طلب كلمة مرور

su محاولات للحصول على كلمة مرور من المحطة وتحتاج إلى جهاز TTY حتى يتمكن من الاتصال ioctl لإيقاف صدى المفتاح. نظرًا لأن الإدخال القياسي يأتي من "مستند هنا" (ABC) ، فإن محاولة استدعاء IOCTL على واصف الملف 0 "لا تتيح".

إذا كان يجب عليك استخدام مستند هنا بدلاً من حسن النية السيناريو ، افعل:

cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$

قد ترغب في استخدام expect. مصمم للتفاعل النصية.

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