วิธีเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่นใน Linux Scripts

เผยแพร่แล้ว: 2022-07-13
เทอร์มินัล Linux บนแล็ปท็อปบนพื้นหลังสีน้ำเงิน
fatmawati achmad zaenuri/Shutterstock.com

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

กระบวนการมีเจ้าของ

เมื่อรันโปรแกรมหรือสคริปต์ Linux จะสร้างกระบวนการ กระบวนการนั้นมีเจ้าของ เจ้าของเป็นกระบวนการอื่นหรือชื่อบัญชีผู้ใช้หากมีผู้เปิดใช้งาน

ความเป็นเจ้าของกระบวนการกำหนดความสามารถบางอย่างและสภาพแวดล้อมของกระบวนการ ขึ้นอยู่กับวิธีการเริ่มกระบวนการ กระบวนการนี้สืบทอดคุณลักษณะบางอย่างของกระบวนการหลักหรือผู้ใช้ หรือเข้มงวดกว่านั้นคือกระบวนการที่ผู้ใช้ใช้ในการเปิดโปรแกรมซึ่งมักจะเป็นเชลล์

วิธีจัดการกระบวนการจาก Linux Terminal: 10 คำสั่งที่คุณต้องรู้
ที่เกี่ยวข้อง วิธีจัดการกระบวนการจาก Linux Terminal: 10 คำสั่งที่คุณต้องรู้

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

ทุกครั้งที่เราใช้ 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 เท่านั้นที่สามารถเรียกใช้ได้

จากซ้ายไปขวา สิทธิ์อ่าน:

  • เจ้าของสามารถอ่าน เขียน และรันไฟล์ได้
  • สมาชิกกลุ่มสามารถอ่านและเขียนไฟล์ได้
  • คนอื่นสามารถอ่านไฟล์ได้เท่านั้น

ดังนั้นผู้ใช้ที่สามารถเรียกใช้สคริปต์ได้เท่านั้นคือ Mary และ root นี่คือสิ่งที่เกิดขึ้นเมื่อ Mary รันสคริปต์:

 ./other-user.sh 

ผลลัพธ์เมื่อแมรี่รันสคริปต์

เราได้รับแจ้งว่าไดเร็กทอรีการทำงานปัจจุบันของสคริปต์คือโฮมไดเร็กทอรีของ Mary และเจ้าของสคริปต์คือบัญชีผู้ใช้ maryq

ตามที่คาดไว้ Dave ไม่สามารถเรียกใช้สคริปต์ได้

 /home/maryq/other-user.sh 

ผู้ใช้ Dave ไม่สามารถเรียกใช้สคริปต์ได้ การอนุญาตถูกปฏิเสธ

หาก Dave มีสิทธิ์ผู้ใช้ root เขาสามารถลองเรียกใช้สคริปต์ในฐานะ root โดยใช้ sudo

 sudo /home/maryq/other-user.sh 

ผลลัพธ์เมื่อสคริปต์ถูกเรียกใช้โดย root

นี่คือความสำเร็จบางส่วน สคริปต์ทำงาน แต่เจ้าของสคริปต์คือรูท ไม่ใช่ maryq

เคล็ดลับที่เราต้องใช้คือตัวเลือก sudo -u (ผู้ใช้) ซึ่งช่วยให้คุณระบุผู้ใช้ที่คุณต้องการเรียกใช้คำสั่งเป็น หากคุณไม่ได้ใช้ตัวเลือก -u sudo จะใช้ค่าเริ่มต้นเป็นรูท หากเราต้องการรันคำสั่งในชื่อ Mary เราจำเป็นต้องส่งชื่อบัญชีผู้ใช้ของพวกเขาไปยังคำสั่ง sudo

sudo -u maryq /home/maryq/other-user.sh

การใช้ตัวเลือกผู้ใช้ -u พร้อมรูทเพื่อรันสคริปต์ในฐานะผู้ใช้ Mary

คราวนี้สคริปต์รายงานว่าเจ้าของกระบวนการคือ 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 

ผู้ใช้ Dave ไม่สามารถอ่านไฟล์ของ Mary การอนุญาตถูกปฏิเสธ

เราสามารถมองเข้าไปในไฟล์โดยใช้ runuser อย่างไรก็ตาม ตัวเลือก - (เข้าสู่ระบบ) จะเปิดเชลล์ใหม่โดยมีสภาพแวดล้อมใกล้เคียงกับสภาพแวดล้อมของเชลล์ที่ Mary จะมีหากพวกเขาเข้าสู่ระบบจริง ตัวเลือก -c (คำสั่ง) ตามด้วยคำสั่งที่เราต้องการเรียกใช้

 sudo runuser - maryq -c 'cat mary.txt' 

การอ่านไฟล์ของ Mary โดยใช้คำสั่ง runuser

โปรดทราบว่าคำสั่งไม่ต้องการพาธแบบเต็มไปยังไฟล์ เราสามารถอ้างอิงไฟล์ในลักษณะเดียวกับที่ Mary จะอ้างอิงกับโฮมไดเร็กทอรีของเธอ

ในฐานะผู้ใช้ Dave เราจะสร้างสคริปต์ชื่อ “run-maryq.sh” โดยมีข้อความนี้อยู่ในนั้น:

 #!/bin/bash

runuser -l maryq -c 'cat mary.txt'

เราจะทำให้มันใช้งานได้:

 chmod +x run-maryq.sh 

ทำให้สคริปต์สามารถเรียกใช้งานได้ด้วย chmod

มาดูกันว่าจะเกิดอะไรขึ้นเมื่อเราลองรันมัน

 ./run-maryq.sh 

รันสคริปต์ด้วย runuser ข้างในในฐานะผู้ใช้ทั่วไป

คำสั่ง runuser บ่นเพราะถูกเรียกใช้งานโดยผู้ใช้ทั่วไป เรียกใช้อีกครั้งด้วย sudo

 sudo ./run-maryq.sh 

เรียกใช้สคริปต์ด้วย runuser ข้างในเป็น root

ใช้งานได้ตามที่เราต้องการ และเหมือนกับว่าแมรี่เปิดตัวบทเอง

อันไหนที่จะใช้?

บนบรรทัดคำสั่ง ไม่มีอะไรให้เลือกมากนัก แต่เนื่องจากคุณต้องใช้ sudo กับ runuser อยู่แล้ว คุณอาจใช้ sudo ด้วยตัวเองได้เช่นกัน

แต่ในสคริปต์ runuser เป็นคำสั่งที่ต้องการ

ที่เกี่ยวข้อง: 10 คำสั่ง Linux พื้นฐานสำหรับผู้เริ่มต้น