ตัวเลือก su - ใช้คำสั่งเป็นผู้ใช้อื่น


75

ฉันสงสัยว่าจะเรียกใช้คำสั่งในฐานะผู้ใช้อื่นจากสคริปต์ได้อย่างไร

ฉันมีเจ้าของสคริปต์ตั้งค่าเป็นรูท ฉันยังมีคำสั่งต่อไปนี้ถูกเรียกใช้ภายในสคริปต์เพื่อเรียกใช้คำสั่งเป็นผู้ใช้ฮัดสัน:

su -c command hudson

นี่เป็นไวยากรณ์ที่ถูกต้องหรือไม่


สำหรับ googler อื่น ๆ : ผู้ใช้บางคนอาจปิดการใช้งานความสามารถนี้ตามวัตถุประสงค์ sudo cat /etc/passwd | grep user-abcคุณสามารถเรียกใช้ หากคุณเห็นสิ่งนี้: user-abc:x:994:994::/home/user-abc:/bin/falseมันจะไม่ทำงาน นั่นเป็นเพราะส่วนสุดท้าย " /bin/false" หมายความว่าไม่มีเปลือกสำหรับผู้ใช้รายนั้น
Alexander Bird

คำตอบ:


78

ใช่. นี่คือ--help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

และการทดสอบบางอย่าง (ฉันใช้sudoเพราะฉันไม่ทราบรหัสผ่านสำหรับnobodyบัญชี)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

เมื่อคำสั่งของคุณใช้อาร์กิวเมนต์คุณต้องอ้างมัน หากคุณไม่ทำสิ่งแปลก ๆ จะเกิดขึ้น ฉันอยู่ที่นี่ - ในฐานะ root - พยายามสร้างไดเรกทอรีใน / home / oli (เหมือน oli) โดยไม่ต้องระบุคำสั่งทั้งหมด:

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

อ่านได้เพียงmkdirค่าของ-cแฟล็กและพยายามใช้/home/oli/javaเป็นชื่อผู้ใช้ ถ้าเราพูดมันก็ใช้งานได้:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -

52

หมายเหตุ: "ฉันมีเจ้าของสคริปต์ตั้งค่าเป็นรูท" ไม่ได้ทำอะไรเลย แม้ว่าคุณจะมี setuid bit แต่ก็ยังใช้งานไม่ได้


สมมติว่าคุณกำลังเรียกใช้สคริปต์ในฐานะรูทอย่างไรก็ตามคุณสามารถใช้งานsudoได้ suมีไว้สำหรับเปลี่ยนผู้ใช้เป็นหลักในขณะที่sudoสำหรับการดำเนินการคำสั่งเป็นผู้ใช้อื่น การ-uตั้งค่าสถานะช่วยให้คุณระบุผู้ใช้ที่จะดำเนินการคำสั่งเป็น:

sudo -u hudson command

1
หลายครั้งที่ผมต้องเผชิญหน้ากับ (ในระบบที่ sudoers เป็นอย่างดียา) ที่พยายามที่จะใช้คุณก็สามารถได้รับนี้sudo root is not in the sudoers fileซึ่งทำให้su - <username> -c "command to run"ตัวเลือกเท่านั้น
RAM237

ไม่จำเป็นต้องใส่เครื่องหมายคำพูดเมื่อดำเนินการคำสั่งที่ไม่สำคัญ (เช่นsudo -u kilgore mv this that)
toraritte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.