วิธีเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่นใน Linux Scripts
เผยแพร่แล้ว: 2022-07-13โดยปกติ เมื่อคุณเรียกใช้คำสั่งหรือสคริปต์ ระบบจะเรียกใช้งานเป็นกระบวนการที่คุณเปิดตัว แต่คุณสามารถเรียกใช้คำสั่งและสคริปต์ในฐานะผู้ใช้รายอื่นได้
กระบวนการมีเจ้าของ
เมื่อรันโปรแกรมหรือสคริปต์ Linux จะสร้างกระบวนการ กระบวนการนั้นมีเจ้าของ เจ้าของเป็นกระบวนการอื่นหรือชื่อบัญชีผู้ใช้หากมีผู้เปิดใช้งาน
ความเป็นเจ้าของกระบวนการกำหนดความสามารถบางอย่างและสภาพแวดล้อมของกระบวนการ ขึ้นอยู่กับวิธีการเริ่มกระบวนการ กระบวนการนี้สืบทอดคุณลักษณะบางอย่างของกระบวนการหลักหรือผู้ใช้ หรือเข้มงวดกว่านั้นคือกระบวนการที่ผู้ใช้ใช้ในการเปิดโปรแกรมซึ่งมักจะเป็นเชลล์
การรันคำสั่งหรือสคริปต์ในฐานะผู้ใช้อื่นอาจมีประโยชน์ เนื่องจากความเป็นเจ้าของไฟล์ใดๆ ที่สร้างขึ้นโดยกระบวนการจะเป็นของผู้ใช้ที่เหมาะสม
ทุกครั้งที่เราใช้ sudo
เราจะเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่น บัญชีผู้ใช้เริ่มต้นที่ใช้โดย sudo
คือผู้ใช้ root หรือ 'super' ด้วยเหตุนี้ sudo
จึงมักเข้าใจผิดคิดว่าเป็น super user do แต่นั่นเป็นเพียงศัพท์แสงที่หย่อนคล้อย อันที่จริงมันย่อมาจาก ผู้ใช้ทดแทน do
ด้วย sudo
คุณสามารถรันคำสั่งเหมือนผู้ใช้คนอื่น ๆ ไม่ใช่แค่รูท แดกดันคุณต้องมีสิทธิ์รูทเพื่อทำเช่นนั้น แต่การเรียกใช้โปรแกรมหรือสคริปต์ที่เป็นของผู้ใช้รายอื่นนั้นไม่เหมือนกับการเรียกใช้กระบวนการนั้น เหมือนกับ ผู้ใช้รายอื่น คุณจะยังคงใช้งานเป็นรูท
ต่อไปนี้คือวิธีเรียกใช้กระบวนการจริงในฐานะผู้ใช้รายอื่น และวิธีเรียกใช้คำสั่งจากภายในสคริปต์ราวกับว่าถูกเรียกใช้โดยผู้ใช้รายอื่น
เรียกใช้สคริปต์ในฐานะผู้ใช้อื่น
เรากำลังใช้คอมพิวเตอร์ที่มีผู้ใช้หลายคนที่กำหนดค่าไว้ คนหนึ่งคือแมรี่ ที่มีชื่อผู้ใช้ maryq และอีกคนคือเดฟที่มีชื่อผู้ใช้ว่าเดฟ
Mary มีสคริปต์ชื่อ “other-user.sh” ในโฮมไดเร็กตอรี่ของเธอ นี่คือข้อความของสคริปต์
#!/bin/bash echo "ชื่อสคริปต์:" $0 echo "ไดเร็กทอรีการทำงาน:" $(pwd) echo "สคริปต์ทำงานในฐานะผู้ใช้:" $(whoami)
มันพิมพ์ชื่อสคริปต์ ซึ่งอยู่ในตัวแปรสภาพแวดล้อม $0
จากนั้นใช้ pwd
เพื่อพิมพ์ไดเร็กทอรีการทำงาน สุดท้าย ใช้คำสั่ง whoami
เพื่อพิมพ์ชื่อของผู้ใช้ที่เรียกใช้สคริปต์ หรือใครเป็น คน เปิดตัวสคริปต์
คัดลอกข้อความจากสคริปต์ไปยังโปรแกรมแก้ไขและบันทึกเป็น “other-user.sh” ในโฮมไดเร็กทอรีของบัญชีผู้ใช้อื่น
เราจะต้องทำให้สคริปต์ทำงานได้ เราจะใช้คำสั่ง chmod
และใช้ตัวเลือก +x
(ดำเนินการ) และตัวเลือก -u
(ผู้ใช้) เพื่อตั้งค่าสถานะการดำเนินการสำหรับเจ้าของเท่านั้น นั่นหมายความว่ามีเพียงแมรี่เท่านั้นที่สามารถเรียกใช้สคริปต์ได้ เราจะตรวจสอบการอนุญาตไฟล์ด้วย ls
chmod u+x other-user.sh
ลส
จากซ้ายไปขวา สิทธิ์อ่าน:
- เจ้าของสามารถอ่าน เขียน และรันไฟล์ได้
- สมาชิกกลุ่มสามารถอ่านและเขียนไฟล์ได้
- คนอื่นสามารถอ่านไฟล์ได้เท่านั้น
ดังนั้นผู้ใช้ที่สามารถเรียกใช้สคริปต์ได้เท่านั้นคือ Mary และ root นี่คือสิ่งที่เกิดขึ้นเมื่อ Mary รันสคริปต์:
./other-user.sh
เราได้รับแจ้งว่าไดเร็กทอรีการทำงานปัจจุบันของสคริปต์คือโฮมไดเร็กทอรีของ Mary และเจ้าของสคริปต์คือบัญชีผู้ใช้ maryq
ตามที่คาดไว้ Dave ไม่สามารถเรียกใช้สคริปต์ได้
/home/maryq/other-user.sh
หาก Dave มีสิทธิ์ผู้ใช้ root เขาสามารถลองเรียกใช้สคริปต์ในฐานะ root โดยใช้ sudo
sudo /home/maryq/other-user.sh
นี่คือความสำเร็จบางส่วน สคริปต์ทำงาน แต่เจ้าของสคริปต์คือรูท ไม่ใช่ maryq
เคล็ดลับที่เราต้องใช้คือตัวเลือก sudo -u
(ผู้ใช้) ซึ่งช่วยให้คุณระบุผู้ใช้ที่คุณต้องการเรียกใช้คำสั่งเป็น หากคุณไม่ได้ใช้ตัวเลือก -u
sudo
จะใช้ค่าเริ่มต้นเป็นรูท หากเราต้องการรันคำสั่งในชื่อ Mary เราจำเป็นต้องส่งชื่อบัญชีผู้ใช้ของพวกเขาไปยังคำสั่ง sudo
sudo -u maryq /home/maryq/other-user.sh
คราวนี้สคริปต์รายงานว่าเจ้าของกระบวนการคือ maryq
มาเพิ่มบรรทัดในสคริปต์ “other-user.sh” เราจะ echo
ข้อความบางส่วนและเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ชื่อ “mary.txt”
#!/bin/bash echo "ชื่อสคริปต์:" $0 echo "ไดเร็กทอรีการทำงาน:" $(pwd) echo "สคริปต์ทำงานในฐานะผู้ใช้:" $(whoami) echo "กำลังเข้าสู่ไฟล์ใน /home/maryq/" > /home/maryq/mary.txt
เรากำลังสร้างไฟล์ใหม่ในโฮมไดเร็กทอรีของ Mary นี่เป็นเรื่องปกติเพราะเรากำลังเรียกใช้สคริปต์ในฐานะแมรี่
./other-user.sh
หากเราตรวจสอบในโฮมไดเร็กทอรีของ Mary เราจะเห็นว่าไฟล์นั้นถูกสร้างขึ้น และความเป็นเจ้าของไฟล์นั้นเป็นของบัญชีผู้ใช้ maryq
ls -hl mary.txt
นี่เป็นพฤติกรรมเดียวกับที่เราจะได้เห็นหากแมรี่เปิดตัวสคริปต์เองจริงๆ
ที่เกี่ยวข้อง: วิธีใช้คำสั่ง chmod บน Linux
คำสั่ง runuser
คุณสามารถใช้คำสั่ง sudo -u
ที่เราเคยใช้มาจนถึงตอนนี้ในสคริปต์ แต่มีคำสั่งอื่น runuser
ที่ออกแบบมาเพื่อเรียกใช้กระบวนการในฐานะผู้ใช้อื่นจากสคริปต์ภายใน มีการจัดการโค้ดส่งคืนจากกระบวนการที่เปิดตัวได้ดีกว่า และมีค่าใช้จ่ายน้อยกว่า sudo
คำสั่ง runuser
ต้องรันโดย root แต่ทำได้โดยการรันสคริปต์ทั้งหมดเป็น root คุณไม่จำเป็นต้องใช้ sudo
ภายในสคริปต์ คำสั่ง runuser
สามารถใช้บนบรรทัดคำสั่งได้เช่นกัน ดังนั้นจึงไม่จำกัดการใช้สคริปต์ แม้ว่าจะเป็นวิธีที่แนะนำสำหรับสคริปต์ก็ตาม
Dave ไม่สามารถแสดงรายการไฟล์ “mary.txt” ได้ เนื่องจากไฟล์นั้นอยู่ในโฮมไดเร็กทอรีของ Mary และเขาไม่มีสิทธิ์เข้าถึง
cat /home/maryq/mary.txt
เราสามารถมองเข้าไปในไฟล์โดยใช้ runuser
อย่างไรก็ตาม ตัวเลือก -
(เข้าสู่ระบบ) จะเปิดเชลล์ใหม่โดยมีสภาพแวดล้อมใกล้เคียงกับสภาพแวดล้อมของเชลล์ที่ Mary จะมีหากพวกเขาเข้าสู่ระบบจริง ตัวเลือก -c
(คำสั่ง) ตามด้วยคำสั่งที่เราต้องการเรียกใช้
sudo runuser - maryq -c 'cat mary.txt'
โปรดทราบว่าคำสั่งไม่ต้องการพาธแบบเต็มไปยังไฟล์ เราสามารถอ้างอิงไฟล์ในลักษณะเดียวกับที่ Mary จะอ้างอิงกับโฮมไดเร็กทอรีของเธอ
ในฐานะผู้ใช้ Dave เราจะสร้างสคริปต์ชื่อ “run-maryq.sh” โดยมีข้อความนี้อยู่ในนั้น:
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
เราจะทำให้มันใช้งานได้:
chmod +x run-maryq.sh
มาดูกันว่าจะเกิดอะไรขึ้นเมื่อเราลองรันมัน
./run-maryq.sh
คำสั่ง runuser
บ่นเพราะถูกเรียกใช้งานโดยผู้ใช้ทั่วไป เรียกใช้อีกครั้งด้วย sudo
sudo ./run-maryq.sh
ใช้งานได้ตามที่เราต้องการ และเหมือนกับว่าแมรี่เปิดตัวบทเอง
อันไหนที่จะใช้?
บนบรรทัดคำสั่ง ไม่มีอะไรให้เลือกมากนัก แต่เนื่องจากคุณต้องใช้ sudo
กับ runuser
อยู่แล้ว คุณอาจใช้ sudo
ด้วยตัวเองได้เช่นกัน
แต่ในสคริปต์ runuser
เป็นคำสั่งที่ต้องการ
ที่เกี่ยวข้อง: 10 คำสั่ง Linux พื้นฐานสำหรับผู้เริ่มต้น