تشغيل البرنامج النصي التفاعلي shell باسم المستخدم الآخر
سؤال
في البرنامج النصي الخاص بي (باش) أريد أن أسمي البرامج النصية الأخرى للقذيفة.
أقوم بتشغيل البرنامج النصي الخاص بي كـ user_a. واحد من هذه البرامج النصية يحتاج إلى معالجة خاصة:
- يجب تشغيله كمستخدم مختلف (user_b). كلمة المرور المطلوبة هنا.
- إنه تفاعلي ، ولكن ليس فقط يسأل أسئلة ولكنه يدير برنامج نصي آخر باسم مستخدم آخر (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
. مصمم للتفاعل النصية.