แจ้งให้ผู้ใช้ล็อกอินเป็นรูทเมื่อรันเชลล์สคริปต์


17

ปัญหาที่ฉันได้รับคือเมื่อฉันป้อนคำสั่ง

su - root

ที่จุดเริ่มต้นของไฟล์เชลล์สคริปต์ของฉันจะแจ้งให้ผู้ใช้ป้อนรหัสผ่านและจากนั้นจะไม่ดำเนินการกับสคริปต์เชลล์ส่วนที่เหลือต่อไป ฉันต้องค้นหาด้วยตนเองและเรียกใช้เชลล์สคริปต์ผ่านเทอร์มินัล ฉันต้องการสคริปต์เพื่อให้แน่ใจว่าผู้ใช้เข้าสู่ระบบในฐานะ root แล้วดำเนินการต่อกับส่วนที่เหลือของสคริปต์เชลล์

กล่าวอีกนัยหนึ่งฉันต้องการเรียกใช้สคริปต์ในฐานะผู้ใช้ใด ๆ แต่ทันทีที่สคริปต์เริ่มดำเนินการผู้ใช้จะต้องเปลี่ยนเป็นรูทแล้วดำเนินการต่อโดยใช้สคริปต์ที่เหลือเป็นรูทจนกว่าจะเสร็จ สามารถทำได้หรือไม่

คำตอบ:


34

นี่เป็นเรื่องง่ายที่จะทำให้สำเร็จ:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

เมื่อผู้ใช้ปัจจุบันไม่รูทให้สั่งรันสคริปต์sudoอีกครั้ง

หมายเหตุว่าฉันใช้ที่นี่แทนsudo suนี่เป็นเพราะช่วยให้คุณสามารถรักษาข้อโต้แย้ง หากคุณใช้suคำสั่งของคุณจะต้องเป็นsu -c "$0 $@"สิ่งที่จะทำให้ข้อโต้แย้งของคุณยุ่งเหยิงหากมีช่องว่างหรืออักขระเชลล์พิเศษ

หากเชลล์ของคุณทุบตีคุณสามารถหลีกเลี่ยงการเรียกภายนอกไปที่whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"

ขออภัยฉันทำข้อผิดพลาดในคำอธิบายเพื่อให้เข้าใจผิด นี่คือคำอธิบายที่ชัดเจนยิ่งขึ้น ขอบคุณสำหรับความช่วยเหลือ!
Redson

@ user68857 คำถามของคุณชัดเจน คำตอบนี้ทำสิ่งที่คุณต้องการ
Patrick

ฉันได้รับข้อผิดพลาดนี้ต่อไป: sudo: ต้อง setuid root
Redson

ฉันต้องการเรียกใช้สคริปต์ในฐานะผู้ใช้ทั่วไปผ่านทางเทอร์มินัล แต่สคริปต์ควรเปลี่ยนผู้ใช้เป็นรูทจนกว่าจะสิ้นสุดสคริปต์
Redson

@Nosscire ถ้าคุณได้รับsudo: must be setuid rootแล้วมีบางอย่างเกิดขึ้นกับ sudo ของคุณ chmod u+s $(which sudo)ที่จะแก้ไขได้: และใช่ฉันรู้ดีว่าคุณกำลังพยายามทำอะไรฉันทำแบบเดียวกันตลอดเวลาในสคริปต์ของฉัน
Patrick


5

คุณสามารถเรียกใช้สคริปต์ของตัวเองและตรวจสอบ:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...

0

ที่จุดที่คุณต้องการเข้าสู่ระบบเพียงเพิ่มคำสั่งต่อไปนี้

sudo su

มันทำงานได้อย่างสมบูรณ์กับรหัสของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.