ฉันสงสัยว่าจะเรียกใช้คำสั่งในฐานะผู้ใช้อื่นจากสคริปต์ได้อย่างไร
ฉันมีเจ้าของสคริปต์ตั้งค่าเป็นรูท ฉันยังมีคำสั่งต่อไปนี้ถูกเรียกใช้ภายในสคริปต์เพื่อเรียกใช้คำสั่งเป็นผู้ใช้ฮัดสัน:
su -c command hudsonนี่เป็นไวยากรณ์ที่ถูกต้องหรือไม่
ฉันสงสัยว่าจะเรียกใช้คำสั่งในฐานะผู้ใช้อื่นจากสคริปต์ได้อย่างไร
ฉันมีเจ้าของสคริปต์ตั้งค่าเป็นรูท ฉันยังมีคำสั่งต่อไปนี้ถูกเรียกใช้ภายในสคริปต์เพื่อเรียกใช้คำสั่งเป็นผู้ใช้ฮัดสัน:
su -c command hudsonนี่เป็นไวยากรณ์ที่ถูกต้องหรือไม่
คำตอบ:
ใช่. นี่คือ--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: -
หมายเหตุ: "ฉันมีเจ้าของสคริปต์ตั้งค่าเป็นรูท" ไม่ได้ทำอะไรเลย แม้ว่าคุณจะมี setuid bit แต่ก็ยังใช้งานไม่ได้
สมมติว่าคุณกำลังเรียกใช้สคริปต์ในฐานะรูทอย่างไรก็ตามคุณสามารถใช้งานsudoได้ suมีไว้สำหรับเปลี่ยนผู้ใช้เป็นหลักในขณะที่sudoสำหรับการดำเนินการคำสั่งเป็นผู้ใช้อื่น การ-uตั้งค่าสถานะช่วยให้คุณระบุผู้ใช้ที่จะดำเนินการคำสั่งเป็น:
sudo -u hudson commandsudo root is not in the sudoers fileซึ่งทำให้su - <username> -c "command to run"ตัวเลือกเท่านั้น
                    sudo -u kilgore mv this that)
                    
sudo cat /etc/passwd | grep user-abcคุณสามารถเรียกใช้ หากคุณเห็นสิ่งนี้:user-abc:x:994:994::/home/user-abc:/bin/falseมันจะไม่ทำงาน นั่นเป็นเพราะส่วนสุดท้าย "/bin/false" หมายความว่าไม่มีเปลือกสำหรับผู้ใช้รายนั้น