มีวิธีใดที่จะระบุว่าฉันในฐานะผู้ใช้ทั่วไปมีสิทธิ์ออกคำสั่งหรือไม่
ตัวอย่างเช่น; ฉันต้องการตรวจสอบว่าฉันมีสิทธิ์ออกคำสั่งปิดเครื่องก่อนที่ฉันจะออกจริงหรือไม่
คล้ายคำสั่งต่อไปนี้
-> doIhaveRightToIssue shutdown
-> Yes/No
มีวิธีใดที่จะระบุว่าฉันในฐานะผู้ใช้ทั่วไปมีสิทธิ์ออกคำสั่งหรือไม่
ตัวอย่างเช่น; ฉันต้องการตรวจสอบว่าฉันมีสิทธิ์ออกคำสั่งปิดเครื่องก่อนที่ฉันจะออกจริงหรือไม่
คล้ายคำสั่งต่อไปนี้
-> doIhaveRightToIssue shutdown
-> Yes/No
คำตอบ:
gzip
กรณีที่ง่ายที่สุดคือที่ของเหมือนไบนารี ก่อนอื่นเราหาไฟล์ปฏิบัติการ:
$ which gzip
/bin/gzip
จากนั้นเราจะดูคุณสมบัติของไฟล์นี้:
$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27 2014 /bin/gzip
สามตัวนั้นบอกเราว่าไฟล์นั้นอาจถูกเรียกใช้โดยเจ้าของ (ตัวแรกroot
) หรือทุกคนในกลุ่มroot
(วินาทีroot
) และคนอื่น ๆ ตามลำดับ ดังนั้นผู้ใช้ของคุณได้รับอนุญาตให้รันโปรแกรม
อย่างไรก็ตามไฟล์ปฏิบัติการของคุณอาจเป็นไฟล์สคริปต์ที่เรียกใช้ไฟล์ปฏิบัติการอื่น ๆ ได้ คุณอาจสามารถเรียกใช้สคริปต์ได้ แต่ไม่ใช่โปรแกรมที่เรียกใช้ภายในสคริปต์ ไม่มีวิธีการตรวจสอบว่าผู้ใช้ของคุณได้รับอนุญาตให้ทำเช่นนั้นนอกเหนือจากการทดลองใช้จริง
จากนั้นมีกรณีพิเศษเช่นshutdown
- นี่คือการเชื่อมโยงสัญลักษณ์ไปยังยูทิลิตี้หลักที่เรียกว่าsystemctl
ซึ่งมีกลไกของตัวเองเพื่อตรวจสอบว่าคุณได้รับอนุญาตให้โทรหรือไม่และขอรหัสผ่าน sudo ของคุณหากไม่เช่นนั้น .
(เกี่ยวกับwhich
คำสั่ง: นี้ตั้งอยู่ executables ใน $ PATH ของคุณที่คุณได้รับอนุญาตให้ดำเนินการและบอกคุณว่าคุณใช้ที่ใดถ้าคุณมีมากกว่าหนึ่งที่มีชื่อเดียวกันใน $ PATH มันไม่ได้ค้นหาเพียงปฏิบัติการใด ๆ ฉัน ใช้ที่นี่เป็นตัวอย่างของตำแหน่งที่จะค้นหาการอนุญาตความจริงที่which
พบว่าการปฏิบัติการนั้นบ่งชี้ว่าคุณได้รับอนุญาตให้เรียกใช้งานมัน)
which
คำสั่งควรจะเพียงพอสำหรับไฟล์เหล่านั้นที่อยู่ในหนึ่งในไดเรกทอรีที่เพิ่มเข้าไปใน$PATH
ตัวแปร ตัวอย่างเช่นการทำsudo chmod 700 /bin/nano
หรือsudo chmod 744 nano
ทำให้which
ไม่มีผลลัพธ์ สำหรับสคริปต์ในเครื่องที่อยู่ที่อื่นนอกเหนือจากหนึ่งในPATH
ไดเรกทอรีls -l
หรือการstat
โทรจะทำการหลอกลวง คำตอบที่ดี แต่โปรดเพิ่มข้อมูลนี้ในโพสต์ของคุณ
stat -c '%a' /bin/gzip
ที่755
เป็นตัวอย่าง
ด้วยsudo
:
$ sudo -l shutdown
/sbin/shutdown
หากฉันไม่ได้รับอนุญาตsudo
จะบ่นแทนการแสดงคำสั่ง
ด้วย polkit คุณตรวจสอบการกระทำที่คุณต้องการเรียกใช้:
$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes
การค้นหาการกระทำที่เกี่ยวข้องเป็นคำถามที่แตกต่าง
sudo -l
แม้ว่าคุณจะไม่ใช่ sudoer - นั่นเป็นจุดรวมของ-l
- ที่จะบอกคุณว่าคุณสามารถเรียกใช้คำสั่งด้วย sudo ได้หรือไม่
คุณสามารถใช้ได้:
test -x $(command -v shutdown) && echo yes || echo no
command -v shutdown
ส่งคืนพา ธ ไปที่shutdown
คำสั่ง test -x
ตรวจสอบว่าเส้นทางนั้นสามารถทำงานได้กับคุณหรือไม่
โปรดทราบว่าแม้ว่าคุณอาจจะสามารถเรียกใช้งานคำสั่งได้ แต่คำสั่งอาจยังคงล้มเหลวเนื่องจากมีสิทธิ์ไม่เพียงพอในการทำงาน นี่เป็นกรณีทั่วไปของระบบ Unix ซึ่งแทนที่จะ จำกัด การเข้าถึงเพื่อรันคำสั่งแทนที่จะ จำกัด การเข้าถึงการดำเนินการที่โปรแกรมสามารถทำได้จริง ๆ
alias shutdown="shutdown now"
ไง
$(which shutdown)
$(shopt -u expand_aliases && command -v shutdown)
ปัญหานี้จะปรากฏขึ้นในโหมดโต้ตอบเท่านั้น
ในบางครั้งมันอาจจะยากสักหน่อย ...
ก่อนอื่นดูที่การอนุญาตด้วยls -l
...
คำสั่งกลุ่มผู้ใช้ owngrpotr -rwxr-xr-x root bin vim
หากแฝดสาม / สามมีx ("สามารถเรียกใช้งาน") ได้ผู้อื่น - และนั่นหมายความว่าคุณ - สามารถดำเนินการได้ ... หากเป็นเชลล์สคริปต์หรืออะไรทำนองนั้นผู้อื่นจะต้องr (" สามารถอ่าน ") ได้เช่นกัน
ถ้าคนอื่น ๆไม่ได้รับการดำเนินการอนุญาต แต่กลุ่ม (แฝดสอง) ไม่แล้วคุณสามารถดำเนินการได้ถ้าคุณเป็นสมาชิกของกลุ่ม - ในตัวอย่างมากกว่าถัง ตัวอย่างเช่นกลุ่มล้อ -มักจะใช้ในการ จำกัด ผู้ที่อาจทำงานsu
ดังนั้นผู้ใช้ที่อยู่ในกลุ่มนี้เท่านั้นที่สามารถดำเนินการได้เลย อีกตัวอย่างหนึ่งคือการสร้างกลุ่มเพื่อพัฒนา ers และ จำกัด การดำเนินการของคอมไพเลอร์ C และเครื่องมือดังกล่าวให้กับกลุ่มนี้
หากมีการต่อท้าย+หลังจากแฝดสุดท้ายนั่นหมายความว่ามีการใช้ AccessControllLists ซึ่งอาจเพิ่มสิทธิ์การดำเนินการให้กับผู้ใช้และกลุ่มเพิ่มเติม
+++
แม้ว่าคุณจะสามารถดำเนินการคำสั่งได้ แต่คำสั่งอาจขึ้นอยู่กับการเข้าถึงไฟล์ไดเรกทอรีและ / หรืออุปกรณ์ที่คุณไม่สามารถเข้าถึงได้ - สิ่งนี้อาจ จำกัด สิ่งที่คุณจะทำได้ (คุณอาจไม่สามารถทำได้ ทำอะไรก็ได้)
ในที่สุดแม้ว่าคุณอาจได้รับอนุญาตให้ดำเนินการคำสั่งคำสั่งนั้นอาจตรวจสอบตัวตนของคุณและปฏิเสธที่จะให้คุณใช้งานได้เว้นแต่คุณจะอยู่ในไฟล์ config หรือเป็นผู้ใช้บางคน (เช่นรูท ) ตัวอย่างเช่นmount
คำสั่งจะอนุญาตให้รูทเพื่อเมานต์อุปกรณ์ใด ๆ - ผู้ใช้ปกติจะได้รับอนุญาตเท่านั้นที่จะเมานต์อุปกรณ์ที่ระบุไว้ใน / etc / fstab ... ซึ่งอาจไม่มี หากคุณไม่รูทและพยายามเมานต์อะไรmount
ก็จะบ่นและปฏิเสธที่จะเมานต์อุปกรณ์ อีกตัวอย่างคือsudo
ซึ่งจะทำงานให้กับทุกคน แต่เฉพาะผู้ใช้ที่มีรายชื่ออยู่ใน / etc / sudoers เท่านั้นที่จะได้รับอนุญาตให้เรียกใช้สิ่งต่าง ๆ ในฐานะรูท
การใช้which
, type
, command
ฯลฯ เป็นวิธีการแก้ปัญหาในทางปฏิบัติที่จะทำงานใน 99% ของกรณี แต่จะเป็น 100% $PATH
ว่าคุณจะต้องตรวจสอบด้วยตนเองทุกไดเรกทอรีที่ปฏิบัติการได้ระบุไว้ในของคุณ เชลล์จำนวนมาก (รวมถึงbash
) จะนำหน้าคำสั่งของคุณด้วย entres จาก$PATH
และพยายามเรียกใช้ไฟล์เหล่านั้นซ้ำ ๆ จนกว่าจะสำเร็จ เนื่องจากwhich
ไม่สามารถดำเนินการคำสั่งได้จริงจึงเป็นไปไม่ได้ที่จะคาดเดาว่าไฟล์ใดที่เชลล์ของคุณจะเลือก
ตัวอย่างเช่นสมมติว่าฉันมีPATH=/opt/arm/bin:/bin
ทั้งไดเรกทอรีที่มีไฟล์ปฏิบัติการ แต่สำหรับสถาปัตยกรรมที่แตกต่างกัน วิ่งwhich dd
จะกลับมา/opt/arm/bin/dd
(สมมติว่าฉันมีสิทธิ์ในการดำเนินการ) เนื่องจากรายการนั้นมาก่อน อย่างไรก็ตามเมื่อฉันทำงานdd
ในเชลล์ของฉัน/bin/dd
จะถูกประหารชีวิตเพราะ/opt/arm/bin/dd
จะล้มเหลวในการทำงาน สถานการณ์เดียวกันอาจเกิดขึ้นในกรณีของไบนารีที่เสียหาย libs ที่ขาดหายไปเป็นต้นในตอนท้ายไม่มีวิธีที่แน่นอนที่จะทราบว่าคุณจะสามารถดำเนินการคำสั่งได้หรือไม่นอกเหนือจากการลอง
อีกแง่มุมหนึ่งคือสิ่งที่คุณพิจารณาว่า "มีสิทธิ์" ในฐานะผู้ใช้ผมไม่ได้รับอนุญาตให้ทำงานแต่ไม่rm ~/file
rm /root/file
อีกครั้งไม่มีวิธีทั่วไปที่จะรู้ว่าหากไม่มีการตรวจสอบด้วยตนเองหรือออกคำสั่งและสังเกตผลลัพธ์
sudo
) และค้นหา คำสั่งโหมดข้อความอาจต้องและคำสั่งกราฟิกอาจต้องsudo
นอกจากนี้คุณยังสามารถตรวจสอบที่คำสั่งจะถูกติดตั้งกับgksudo
which command
หากใน/sbin
หรือ/usr/sbin
- คุณสามารถคาดหวังว่าความต้องการของคำสั่งหรือsudo
gksudo