ฉันจะตรวจสอบว่าฉันมีการเข้าถึง sudo ได้อย่างไร?


104

ฉันเพิ่งมีปัญหาเพราะสิ่งนี้

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

มีวิธีการตรวจสอบว่าฉันมีการเข้าถึง sudo หรือไม่?


ถามผู้ดูแลระบบของคุณ?
mdpc

1
@mdpc: มีวิธีอื่นอีกไหม?
บรูซ

คุณยังไม่ได้กล่าวถึงหากคุณสามารถเข้าถึงรูทได้หรือไม่
mdpc

45
นี้จะต้องมีตัวอย่างแรกของการเห็นคนติดตาม "เหตุการณ์ที่เกิดขึ้นนี้จะมีการรายงาน"
slhck

คำตอบ:


121

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คุณได้รับอนุญาตให้ทำงานกับสิทธิพิเศษที่แตกต่างกันคุณสามารถใช้ โปรดทราบว่าคำสั่งนี้คุณจะต้องป้อนรหัสผ่านของคุณ


2
ขอบคุณ sudo -v ใช้งานได้สำหรับฉัน หน้าคนบอกว่าฉันสามารถเรียกใช้ sudo -l เช่นกัน แต่ขอรหัสผ่าน ทำไมถึงเป็นอย่างนั้น?
Bruce

2
@Bruce ฉันคาดเดาได้ที่นี่ แต่อย่างใดบางคน (หรือโปรแกรมที่คุณเรียกใช้) สามารถค้นหาว่าโปรแกรมใดบ้างที่สามารถดำเนินการได้ (โดยไม่ต้องป้อนรหัสผ่าน) โดยผู้ใช้ปัจจุบันของคุณและพยายามใช้ข้อมูลนั้น
Daniel Beck

อะไรที่คุณคิดว่ามันหมายความว่าเมื่อผมได้รับกลับมานี้patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? ฉันป้อนรหัสผ่านและไม่ได้รับอนุญาตใด ๆ ฉันรู้ว่าฉันsudoประสบความสำเร็จในการรันคำสั่งอื่น ๆ แต่unable to resolve hostข้อความนั้นทำให้ฉันกังวลว่าอาจมีบางอย่างที่ขี้ขลาดในโฮสต์
Patrick M

@PatrickM ดูเหมือนว่ามีปัญหากับsudoersไฟล์ ในนั้นคุณสามารถระบุว่าโฮสต์ใดที่ผู้ใช้ได้รับอนุญาตให้เรียกใช้คำสั่งเฉพาะ (ซึ่งมีประโยชน์เมื่อใช้sudoersไฟล์เดียวกันในหลายเครื่อง) อาจเป็นไปได้ว่าชื่อโฮสต์ที่ระบุในไฟล์นั้นไม่สามารถแก้ไขได้ ลองตรวจสอบด้วยhostคำสั่งตัวอย่างเช่น
Ale

ไม่ทำงานสำหรับฉันใน RHEL 6 sudo -vได้ให้ "xx ไม่ได้อยู่ในไฟล์ sudoers เหตุการณ์นี้จะถูกรายงาน"
79E09796

43

ง่ายมาก sudo -lวิ่ง นี่จะแสดงรายการสิทธิ์ sudo ใด ๆ ที่คุณมี


1
อาจลดลงเพราะมันซ้ำกับสิ่งที่ Daniel Beck พูดเมื่อสองปีก่อน
G-Man

1
หรืออธิบายสิ่งที่เกิดขึ้นมันเป็นความเห็นที่ดีที่สุด
Ramhound

2
@ โจนาธาน: ถ้าคุณจะสคริปต์ในอูบุนตู rigt ตอนนี้sudo -lขอรหัสผ่านถ้าคุณสามารถ sudo หรือไม่ sudo -vถามเฉพาะถ้าคุณทำได้และ"$(whoami)" != "root"จะไม่ถามอะไรใน linux ใด ๆ
bksunday

@bksunday คุณถูกต้อง ฉันทดสอบบน Debian Jessy ที่สะอาดและยืนยันผลลัพธ์ของคุณแล้ว ฉันก่อนหน้า (ลบตอนนี้) แสดงความคิดเห็นอาจจะเป็นผลมาจากการทดสอบบนเครื่องที่ผมมีบางsudoprivs
Jonathan Ben-Avraham

@ G-Man แต่คำตอบง่ายๆนี้ช่วยฉันได้มากกว่าคำตอบของ Daniel ที่แม่นยำกว่าซึ่งคำสั่งนี้เป็นคำที่โชคร้ายที่สุด ...
Betlista

11

นี่คือเวอร์ชันที่เหมาะกับสคริปต์:

timeout 2 sudo id && echo Access granted || echo Access denied

เนื่องจากมันจะไม่ติดอยู่ในการป้อนรหัสผ่านหากคุณไม่มีsudoสิทธิ์เข้าถึง

คุณยังสามารถตั้งค่าในตัวแปรเช่น:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

หมายเหตุ: ใน MacOS คุณจำเป็นต้องติดตั้งเช่นcoreutilsbrew install coreutils


ทางเลือกใด ๆ สำหรับtimeoutค่าเริ่มต้นที่ไม่มีให้บริการเช่นใน OS X
Harry

1
คุณต้องติดตั้งเช่นcoreutils brew install coreutils
kenorb

2
สิ่งนี้ไม่ได้ผลสำหรับฉันในสคริปต์ ด้วยเหตุผลที่ไม่ได้อธิบายสคริปต์จะหยุดทำงานจนกว่าฉันจะฆ่ามัน
beruic

7

คำตอบของ 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

2

สำหรับฉัน ' 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")


2

ฉันมีคะแนนต่ำและแสดงความคิดเห็น แต่ฉันต้องการถอนคำตอบของ Gerald Schade เนื่องจากฉันได้พบวิธีเดียวก่อนหน้านี้และคิดว่าไม่มีใครรู้เลย - ตอนนี้: D

btw โซลูชันของฉัน:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(จากสิ้นปี 2015 mwhahaaa)


1
อ่าน"ทำไมฉันต้องมี 50 ชื่อเสียงในการแสดงความคิดเห็น"เพื่อให้แน่ใจว่าคุณเข้าใจว่าคุณสามารถเริ่มแสดงความคิดเห็นได้อย่างไร
Pimp Juice IT

1

"การเข้าถึง 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 ประเภทแรกหรือไม่


-4

ทำตามขั้นตอนเหล่านี้เพื่อดูไฟล์ sudoers หากคุณอยู่ที่นั่นคุณมี sudo ถ้าไม่คุณสามารถเพิ่มตัวเอง

  1. su
  2. visudo
  3. ด้านล่างของไฟล์ป้อน your_username_here ALL=(ALL) ALL
  4. กดESCและพิมพ์:wq
  5. ชนิด exit
  6. รันคำสั่งของคุณอีกครั้งที่จำเป็น sudo
  7. ป้อนรหัสผ่านของคุณ (ไม่ใช่รหัสผ่านของรูท)

11
สหกรณ์ "มีปัญหา" สำหรับการทำงานsudoเพื่อให้เขาอาจจะไม่ผู้ดูแลระบบหรือแม้แต่หนึ่งในผู้ดูแลระบบชนชั้น เขาอาจเป็นแค่ผู้ใช้ที่คิดว่าเขาอาจได้รับพลัง จำกัด บางอย่าง สิ่งที่ทำให้คุณสงสัยว่าเขาสามารถไป? su
Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.