نظام التشغيل: سنتوس 5.2
وصف المشهد:
لدينا مشروع WEB يطلب العميل تشغيله كمستخدم عادي (مثل chb)، ثم يوجد زر في الصفحة يمكن إغلاقه بعد النقر عليه.
طريقة التنفيذ:
1. كود جافا:
انسخ رمز الكود كما يلي:
إيقاف منطقي عام ثابتForLinux() {
يحاول {
Runtime.getRuntime().exec("sudo /sbin/poweroff");
} قبض (IOException ه) {
عودة كاذبة.
}
عودة صحيحة؛
}
2. قم بتعديل /etc/sudoers وأضف المعلومات التالية في النهاية:
chb ALL=NOPASSWD:/sbin/reboot,/sbin/poweroff
3. اضبط لبدء تشغيل Tomcat تلقائيًا عند التمهيد، وقم بتعديل /etc/rc.d/rc.local، وأضف ما يلي في النهاية:
su chb -c "/opt/tomcat/bin/startup.sh"
وصف المشكلة:
بالنسبة لعملية Java التي تبدأ تلقائيًا في كل مرة يتم فيها تشغيل الكمبيوتر، لا يمكن لزر إيقاف التشغيل الموجود على الصفحة تنفيذ وظيفة إيقاف التشغيل، ومع ذلك، إذا قمت بتسجيل الدخول إلى الخادم عبر ssh باستخدام حساب chb في هذا الوقت، فاقتل Tomcat يدويًا. العملية، ثم أعد تشغيل Tomcat، زر إيقاف التشغيل الموجود على الصفحة يعمل. هل تعرف لماذا هذا؟ هل يتعلق الأمر بأمر تحميل Sudo؟ أم أنها مرتبطة ببيئة Shell الخاصة بمستخدم chb؟
تحليل المشكلة:
من خلال تحليل عملية JAVA التي بدأت عند التمهيد وبدأت عملية JAVA يدويًا، وجدنا أن tty مختلفة، ثم بحثنا في Google عن العلاقة بين Sudo وtty ووجدنا أن Sudo يتطلب tty بشكل افتراضي ، ونستخدم عميل ssh لتسجيل الدخول إلى الخادم، وقتل Tomcat، ثم إعادة تشغيل Tomcat، في هذا الوقت، يمكنك الحصول على tty كنقاط، حتى تتمكن من استخدام الأمر Sudo.
حل:
عن طريق تعديل الملف /etc/sudoers، قم بتغيير
متطلبات الافتراضات
مجرد التعليق عليه