ระบบปฏิบัติการ: เซนโตส 5.2
คำอธิบายฉาก:
เรามีโปรเจ็กต์ WEB ที่ลูกค้าต้องการให้เรียกใช้ในฐานะผู้ใช้ทั่วไป (เช่น chb) จากนั้นจะมีปุ่มบนเพจที่สามารถปิดได้หลังจากคลิก
วิธีการดำเนินการ:
1. รหัสจาวา:
คัดลอกรหัสรหัส ดังต่อไปนี้:
สาธารณะปิดบูลีนคงที่ปิดForLinux () {
พยายาม {
Runtime.getRuntime().exec("sudo /sbin/poweroff");
} จับ (IOException จ) {
กลับเท็จ;
-
กลับเป็นจริง;
-
2. แก้ไข /etc/sudoers และเพิ่มข้อมูลต่อไปนี้ในตอนท้าย:
chb ทั้งหมด=NOPASSWD:/sbin/รีบูต/sbin/poweroff
3. ตั้งค่าให้เริ่ม Tomcat โดยอัตโนมัติเมื่อบู๊ต แก้ไข /etc/rc.d/rc.local และเพิ่มสิ่งต่อไปนี้ที่ส่วนท้าย:
su chb -c "/opt/tomcat/bin/startup.sh"
คำอธิบายปัญหา:
สำหรับกระบวนการ Java ที่เริ่มต้นโดยอัตโนมัติทุกครั้งที่เปิดคอมพิวเตอร์ ปุ่มปิดระบบบนเพจจะไม่สามารถใช้ฟังก์ชันการปิดระบบได้ อย่างไรก็ตาม หากคุณเข้าสู่ระบบเซิร์ฟเวอร์ผ่าน ssh ด้วยบัญชี chb ในขณะนี้ ให้ฆ่า Tomcat ด้วยตนเอง ดำเนินการแล้วรีสตาร์ท Tomcat ซึ่งเป็นปุ่มปิดเครื่องบนเพจ มันใช้งานได้ คุณรู้ไหมว่าทำไมถึงเป็นเช่นนี้? มันเกี่ยวข้องกับลำดับการโหลด sudo หรือไม่? หรือเกี่ยวข้องกับสภาพแวดล้อมเชลล์ผู้ใช้ chb?
การวิเคราะห์ปัญหา:
จากการวิเคราะห์กระบวนการ JAVA ที่เริ่มต้นเมื่อบูตและกระบวนการ JAVA เริ่มต้นด้วยตนเอง เราพบว่า tty นั้นแตกต่างออกไป จากนั้นเราค้นหาความสัมพันธ์ระหว่าง sudo และ tty และพบว่า sudo ต้องการ tty เป็นค่าเริ่มต้น เมื่อระบบเริ่มทำงาน จะไม่มี tty และเราใช้ไคลเอ็นต์ ssh ลงชื่อเข้าใช้เซิร์ฟเวอร์ ฆ่า Tomcat จากนั้นรีสตาร์ท Tomcat ในเวลานี้ คุณสามารถรับ tty เป็น pts เพื่อให้คุณสามารถใช้คำสั่ง sudo ได้
สารละลาย:
โดยการแก้ไขไฟล์ /etc/sudoers ให้เปลี่ยนแปลง
ความต้องการเริ่มต้น
เพียงแค่แสดงความเห็นออกมา