ฉันเพิ่งมีปัญหาเพราะสิ่งนี้
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
มีวิธีการตรวจสอบว่าฉันมีการเข้าถึง sudo หรือไม่?
ฉันเพิ่งมีปัญหาเพราะสิ่งนี้
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
มีวิธีการตรวจสอบว่าฉันมีการเข้าถึง sudo หรือไม่?
คำตอบ:
sudo -v
วิ่ง โดยปกติจะใช้เพื่อขยายการหมดเวลารหัสผ่าน sudo ของคุณ แต่สามารถใช้ในการพิจารณาว่าคุณมีsudo
สิทธิ์ใด ๆ
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
ตัดตอนมาหน้าชาย:
หากได้รับตัวเลือก -v (ตรวจสอบ) sudo จะอัปเดตการประทับเวลาของผู้ใช้พร้อมท์ให้ใส่รหัสผ่านของผู้ใช้หากจำเป็น สิ่งนี้จะเพิ่มการหมดเวลาของ sudo อีก 5 นาที (หรือการตั้งค่าใดก็ตามที่หมดเวลาเป็น sudoers) แต่ไม่ได้รันคำสั่ง
หากผู้ใช้ของคุณได้รับอนุญาตให้เรียกใช้คำสั่งเฉพาะคำสั่งนี้จะทำงานเพื่อระบุว่าคุณได้รับอนุญาตให้เรียกใช้บางสิ่งที่มีสิทธิ์แตกต่างกัน ในขณะที่ข้อความที่มีลักษณะที่แตกต่างกันเมื่อพยายามที่จะดำเนินการคำสั่งคุณไม่ได้รับอนุญาตให้อยู่ในกรณีนี้ (และไม่มีการส่งจดหมายไปยังราก ) /var/log/secure
ก็ยังคงเป็นไปได้ที่คุณจะได้รับเป็นปัญหาถ้าผู้ดูแลระบบอ่าน
$ sudo ls
[sudo] password for [username]:
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].
เพื่อหาสิ่งที่sudo -l
คุณได้รับอนุญาตให้ทำงานกับสิทธิพิเศษที่แตกต่างกันคุณสามารถใช้ โปรดทราบว่าคำสั่งนี้คุณจะต้องป้อนรหัสผ่านของคุณ
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
? ฉันป้อนรหัสผ่านและไม่ได้รับอนุญาตใด ๆ ฉันรู้ว่าฉันsudo
ประสบความสำเร็จในการรันคำสั่งอื่น ๆ แต่unable to resolve host
ข้อความนั้นทำให้ฉันกังวลว่าอาจมีบางอย่างที่ขี้ขลาดในโฮสต์
sudoers
ไฟล์ ในนั้นคุณสามารถระบุว่าโฮสต์ใดที่ผู้ใช้ได้รับอนุญาตให้เรียกใช้คำสั่งเฉพาะ (ซึ่งมีประโยชน์เมื่อใช้sudoers
ไฟล์เดียวกันในหลายเครื่อง) อาจเป็นไปได้ว่าชื่อโฮสต์ที่ระบุในไฟล์นั้นไม่สามารถแก้ไขได้ ลองตรวจสอบด้วยhost
คำสั่งตัวอย่างเช่น
sudo -v
ได้ให้ "xx ไม่ได้อยู่ในไฟล์ sudoers เหตุการณ์นี้จะถูกรายงาน"
ง่ายมาก sudo -l
วิ่ง นี่จะแสดงรายการสิทธิ์ sudo ใด ๆ ที่คุณมี
sudo -l
ขอรหัสผ่านถ้าคุณสามารถ sudo หรือไม่ sudo -v
ถามเฉพาะถ้าคุณทำได้และ"$(whoami)" != "root"
จะไม่ถามอะไรใน linux ใด ๆ
sudo
privs
นี่คือเวอร์ชันที่เหมาะกับสคริปต์:
timeout 2 sudo id && echo Access granted || echo Access denied
เนื่องจากมันจะไม่ติดอยู่ในการป้อนรหัสผ่านหากคุณไม่มีsudo
สิทธิ์เข้าถึง
คุณยังสามารถตั้งค่าในตัวแปรเช่น:
timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"
หมายเหตุ: ใน MacOS คุณจำเป็นต้องติดตั้งเช่นcoreutils
brew install coreutils
timeout
ค่าเริ่มต้นที่ไม่มีให้บริการเช่นใน OS X
coreutils
brew install coreutils
คำตอบของ Gerald Schade ที่นี่ยังสามารถปรับปรุงได้!
ใช้
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
# exit code of sudo-command is 0
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
นี่คือตัวอย่างการใช้งานที่สมบูรณ์ในสคริปต์ :
#!/usr/bin/env bash
is_root () {
return $(id -u)
}
has_sudo() {
local prompt
prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
}
elevate_cmd () {
local cmd=$@
HAS_SUDO=$(has_sudo)
case "$HAS_SUDO" in
has_sudo__pass_set)
sudo $cmd
;;
has_sudo__needs_pass)
echo "Please supply sudo password for the following command: sudo $cmd"
sudo $cmd
;;
*)
echo "Please supply root password for the following command: su -c \"$cmd\""
su -c "$cmd"
;;
esac
}
if is_root; then
echo "Error: need to call this script as a normal user, not as root!"
exit 1
fi
elevate_cmd which adduser
สำหรับฉัน ' sudo -v
' และ ' sudo -l
' ไม่ได้ทำงานในสคริปต์เพราะบางครั้งมีการโต้ตอบ (ขอรหัสผ่านฉันเช่นที่กล่าวถึงข้างต้น) ' sudo -n -l
' ไม่ทำงานมันให้รหัสทางออก '1' ถึงแม้ว่าฉันจะมีสิทธิ์ sudo เพราะรหัสผ่านหายไป แต่ขยายคำสั่งไปที่:
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
ประสบความสำเร็จสำหรับฉันสำหรับสคริปต์ การแสดงออกนี้ให้0
ถ้าผู้ใช้ปัจจุบันสามารถเรียก 'sudo' และ1
ถ้าไม่
คำอธิบาย:
พารามิเตอร์เพิ่มเติม-n
เพื่อsudo
ป้องกันการโต้ตอบ
ผลลัพธ์$A
ของคำสั่ง ' sudo -n -v 2>&1
' อาจเป็น:
- ว่างเปล่า (ในกรณีนี้ sudo สามารถเรียกได้โดยผู้ใช้ปัจจุบัน) หรือ:
- โปรดทราบว่าผู้ใช้ปัจจุบันไม่ได้รับอนุญาตสำหรับ sudo หรือ:
- ข้อความคำถามสำหรับ รหัสผ่าน (ในกรณีนี้ผู้ใช้จะได้รับอนุญาต)
("asswor" จะเหมาะกับภาษาอังกฤษ "รหัสผ่าน" เช่นเดียวกับภาษาเยอรมัน "Passwort")
ฉันมีคะแนนต่ำและแสดงความคิดเห็น แต่ฉันต้องการถอนคำตอบของ Gerald Schade เนื่องจากฉันได้พบวิธีเดียวก่อนหน้านี้และคิดว่าไม่มีใครรู้เลย - ตอนนี้: D
btw โซลูชันของฉัน:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(จากสิ้นปี 2015 mwhahaaa)
"การเข้าถึง Sudo" มาในรสชาติ สองรสชาติหลัก: ก่อนอื่นคุณหรือกลุ่มของสมาชิกของคุณจะต้องตั้งค่าสำหรับการเข้าถึง sudo ในไฟล์ / etc / sudoers
ประการที่สองคุณต้องรู้รหัสผ่านของคุณหรือคุณต้องทำคำสั่ง sudo เมื่อเร็ว ๆ นี้ เมื่อเร็ว ๆ นี้เพียงพอที่การหมดเวลายังไม่หมดอายุ (ความจริงสนุก: คุณสามารถทำให้เวลาในไฟล์ sudoer ของคุณยาวมาก)
ฉันมักจะต้องการทดสอบการเข้าถึงประเภทที่สองในบทนำของสคริปต์ที่จะต้องทำขั้นตอนบางอย่าง เมื่อการตรวจสอบนี้ล้มเหลวฉันสามารถแนะนำผู้ใช้ว่าเขาต้องการเปิดใช้งานการเข้าถึงชนิดที่ 2 ก่อนที่จะเรียกใช้สคริปต์
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled
-S บอก sudo ให้อ่านรหัสผ่านจาก stdin -p ตั้งค่าพรอมต์ว่างเปล่า -K จะล้างการเข้าถึงครั้งที่สอง
เนื่องจากมันส่ง stderr ไปยัง / dev / null มันจะตรวจสอบว่าผู้ใช้มีการเข้าถึง sudo ประเภทแรกหรือไม่
ทำตามขั้นตอนเหล่านี้เพื่อดูไฟล์ sudoers หากคุณอยู่ที่นั่นคุณมี sudo ถ้าไม่คุณสามารถเพิ่มตัวเอง
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
เพื่อให้เขาอาจจะไม่ผู้ดูแลระบบหรือแม้แต่หนึ่งในผู้ดูแลระบบชนชั้น เขาอาจเป็นแค่ผู้ใช้ที่คิดว่าเขาอาจได้รับพลัง จำกัด บางอย่าง สิ่งที่ทำให้คุณสงสัยว่าเขาสามารถไป? su