Sudo - มีคำสั่งให้ตรวจสอบว่าฉันมี sudo และ / หรือเหลือเวลาเท่าไร?


27

(โพสต์ครั้งแรกใน Stack Overflow พวกเขาแนะนำให้ฉันลองที่นี่แทนนี่คือโพสต์ดั้งเดิม: https://stackoverflow.com/questions/3858208/sudo-is-there-there-a-command-to-check-if-i-have -sudo-and-or-how-time-left ( )

ดูชื่อ ฉันต้องการคำสั่งที่ให้ฉันค้นหา sudo เป็นการดีที่มันจะกลับมาประสบความสำเร็จถ้าฉันยังมี sudo และ false ถ้า sudo หมดอายุ การได้รับเวลาที่เหลืออาจมีประโยชน์ (แม้ว่าฉันจะเป็นกังวลฉันก็สามารถทำ sudo -v เพื่อตรวจสอบความถูกต้องได้อีกครั้ง) โอ้และไม่ควรขอรหัสผ่าน

สิ่งที่ใกล้เคียงที่สุดที่ฉันพบคือ "sudo -n true" แต่ตัวเลือก -n มีอยู่ในเครื่อง Centos 5 ของฉันในที่ทำงานเท่านั้น -n ล้มเหลวหากต้องขอรหัสผ่าน มีวิธีอื่นในการรับฟังก์ชั่นนี้หรือไม่? สมมติว่าฉันไม่มีรูทบนเครื่องทั้งหมดที่ฉันทำงานด้วยดังนั้นฉันจึงไม่สามารถติดตั้ง sudo เวอร์ชันใหม่ตามที่ฉันต้องการได้

สำหรับสิ่งที่คุ้มค่าฉันกำลังทำสิ่งนี้อยู่เพื่อที่ฉันจะได้รับพรอมต์เพื่อระบุสถานะ sudo ฉันชอบที่จะรู้ว่าเทอร์มินัลใดที่ sudo สามารถใช้งานได้ ฉันยังมีพรอมต์ที่เปลี่ยนสีเมื่อฉันรูท แต่ฉันไม่ได้ใช้รูทบ่อยนักดังนั้นมันจึงมีข้อ จำกัด ในการใช้งาน

คำตอบ:


10

-nตัวเลือกที่มีอยู่ในรุ่นใหม่ของ sudo แต่อย่างที่คุณกล่าวว่าไม่ได้เป็นตัวเลือก ไม่มีวิธีการทำสิ่งที่คุณกำลังมองหาเพียงแค่ลอง sudo และดูว่ามันกลับมาพร้อมกับรหัสผ่าน หากความกังวลของคุณคือคุณต้องการตัวบ่งชี้ภาพทำไมไม่เริ่ม sudo / bin / bash เพื่อเริ่มเซสชันการทุบตีรูต? โปรดทราบว่านี่ไม่ปลอดภัย แต่ก็ค่อนข้างไม่ปลอดภัยหากมีคนรู้ว่าการเปลี่ยนแปลงที่รวดเร็วของคุณใน sudo


1
+1 สำหรับการแบ่งย่อยความปลอดภัยของตัวบ่งชี้ที่มองเห็นได้!
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ส่วนนั้นไม่ได้เกิดขึ้นกับฉัน สิ่งที่ฉันหวังว่าตัวบ่งชี้จะเตือนฉันให้เรียกใช้ sudo -K แทนที่จะลืมว่าฉันปล่อยให้ sudo แอ็คทีฟและเปิดเทอร์มินัลอันตรายที่อาจเปิดอยู่ ไม่ใช่ว่าฉันมักจะลืมที่จะล็อคหน้าจอของฉัน แต่ฉันชอบประกันพิเศษ
valadil

ในขณะที่ฉันกำลังโน้มตัวไปตรวจสอบ sudo -V และถ้ามันใหม่พอที่จะมี -n ได้ให้ตรวจสอบ -n เพื่อรับการแจ้งเตือน ดูเหมือนว่ามันไม่ควรทำลายอะไรทุกที่
valadil

@valadil: มันเกิดขึ้นกับฉันว่าตัวบ่งชี้ที่บอบบางจะไม่ทำให้เกิดความเสี่ยงด้านความปลอดภัยมากเกินไป เปิดการขีดเส้นใต้ชื่อผู้ใช้ในพรอมต์ตัวอย่างเช่น
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Dennis: แน่นอน ฉันจะไม่เปลี่ยนพรอมต์เป็น "OMG_YOU_HAVE_SUDO_NOW! _user @ host" หรืออะไรทำนองนั้น ฉันอาจจะเปลี่ยนสีเล็กน้อย ฉันไม่คาดหวังว่าจะมีใครรู้ว่านั่นหมายความว่าอะไรนอกจากพวกเขาจะนั่งลงและสนิทสนมกับ. bashrc ของฉัน
valadil

29

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่วันนี้ฉันทำในสคริปต์:

CAN_I_RUN_SUDO = $ (sudo -n สถานะการออนไลน์ 2> & 1 | grep "load" | wc -l)
ถ้า [$ {CAN_I_RUN_SUDO} -gt 0]
แล้วก็
    echo "ฉันสามารถเรียกใช้คำสั่ง sudo"
อื่น
    echo "ฉันไม่สามารถรันคำสั่ง Sudo"
Fi

1

คำสั่งด้านล่างจะแสดงข้อบ่งชี้สีที่คุณได้รับ sudo ดังนั้นคุณอย่าลืมทำsudo -kก่อนที่จะออกไปจากเครื่อง มันมีประโยชน์เช่นกันบนเทอร์มินัลที่ไม่มีสี

เนื่องจากเราสามารถมี sudo แอ็คทีฟและไม่แอ็คทีฟในเซสชันเทอร์มินัลต่าง ๆ ฉันได้สร้างสิ่งนี้ซึ่งคุณสามารถใส่ท้าย ~ / .bashrc ของคุณได้

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

ที่ terminal type bashเพื่อทำการทดสอบ มันจะเพิ่มทั้งบรรทัดในแต่ละครั้งที่คุณเรียกใช้งานคำสั่งซึ่งมีข้อมูลของเวลาที่คำสั่งสุดท้ายสิ้นสุดลงดังนั้นคุณสามารถไปทานอาหารกลางวันและรู้ว่าเมื่อคำสั่งสุดท้ายสิ้นสุดลง :)

คุณสามารถเล่นกับรหัสนี้เพื่อให้เหมาะกับความต้องการของคุณ มีตัวแปร PS1 ด้วย (นั่นคือเส้นพรอมต์เดี่ยวขนาดเล็กที่เกิดขึ้นจริง) แต่ฉันคิดว่ามันจะดีกว่าถ้าไม่ยุ่งกับมัน

PS .: สำหรับ OS-X ค้นหาความคิดเห็นด้านล่างโดย @nwinkler


การตรวจสอบรหัสออกของsudo -nดูเหมือนว่าจะไม่ทำงานบน OS X ดูคำถามของฉันที่นี่: superuser.com/questions/902826/ …
nwinkler

การทดสอบที่ฉันเสนอคือsudo -nคุณเชื่อหรือไม่ว่าอาจมีการทดสอบอื่น ๆ ที่สามารถใช้ในการพิจารณาว่าผู้ใช้มีการเข้าถึง sudo หรือไม่ หรือบางที OS-X ต้องมีการอัพเดทบ้าง? ฉันไม่เคยใช้ OS-X btw
กุมภ์อำนาจ

2
ฉันใช้ OS X เวอร์ชั่นล่าสุดเป็นไปได้ว่าsudo -nบน BSD (ซึ่งใช้ OS X เป็นพื้นฐาน) มีพฤติกรรมแตกต่างจากรุ่น GNU ฉันเพิ่งเพิ่มความคิดเห็นเพื่อให้คนอื่นทราบว่าการตรวจสอบเวอร์ชันนี้ดูเหมือนจะไม่ทำงานบน OS X ฉันใช้การตรวจสอบจากคำตอบอื่น ( sudo -n uptime 2>&1|grep "load"|wc -l) และดูเหมือนว่าจะทำงานได้ดีบน OS X มันไม่หรูหรา แต่มันได้ผล
nwinkler

1
@ninkler โอ้จริง ๆ แล้วมันขึ้นอยู่กับผลลัพธ์ที่สร้างขึ้น (ไม่ใช่ค่าที่ส่งคืน) วิธีแก้ปัญหาที่น่าสนใจ
Aquarius Power

@ninkler แต่มันใกล้เคียงที่สุด หรือดียิ่งขึ้นเพราะsudo -nกลายเป็นบั๊กกี้ใน sudo -V 1.7.9
Marco M. von Hagen

1

เพื่อทำให้คำตอบง่ายขึ้นโดย @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

อย่างไรก็ตามหากในhttps://www.sudo.ws/man/1.8.15/sudoers.man.htmlการกำหนดค่าของคุณคุณdefaults mail_badpassจะมีอีเมลที่ส่งสำหรับการทดสอบทุกครั้งที่ส่งผลให้เป็นเท็จ (จะได้รับแจ้ง) เพื่อหลีกเลี่ยงการเปลี่ยนแปลงที่สร้างความรำคาญให้กับไฟล์ sudoers ของคุณ

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

ในฐานะที่เป็นอีเมลแจ้งเตือนความปลอดภัยผลลัพธ์จะถูกส่งสำหรับคำสั่งทั้งหมดยกเว้น / bin / true ใช่แล้วตอนนี้มีคนพยายามใส่รหัสผ่านโดยการโทรsudo trueไม่ จำกัด จำนวนครั้งโดยไม่ต้องส่งจดหมายเตือนความปลอดภัย

หมายเหตุ: ใช้visudoแทนเครื่องมือแก้ไขรายการโปรดของคุณเพื่อแก้ไขไฟล์ sudoers เสมอ ไม่สามารถทำเช่นนั้นคุณเสี่ยงต่อการถูกล็อค


0

ตามคู่มือ sudo เซสชัน sudo จะถูกกำหนดตามไฟล์การประทับเวลา ( /usr/lib/sudo/<username>) ดังนั้นคุณอาจจะสามารถคิดได้ว่าจะเหลือเวลาอีกเท่าไรโดยการตรวจสอบวันที่ / เวลาของไฟล์การประทับเวลา อย่างไรก็ตามในระบบของฉันไฟล์การประทับเวลาในความเป็นจริงไดเรกทอรีและมีสามไฟล์ที่มีเนื้อหาที่เป็นความลับในพวกเขา (และยังมีการประทับเวลาแปลก ๆ แต่/usr/lib/sudo/<username>ดูเหมือนว่าจะมีการประทับเวลาที่ใกล้เคียงกับเวลาที่ฉันให้ sudo รหัสผ่านของฉัน ฉันคิดว่า/usr/lib/sudo/<username>/0มีการประทับเวลาของการsudoดำเนินการล่าสุด


1
ในระบบของฉันไฟล์ประทับเวลาอยู่ในไดเรกทอรีที่ไม่สามารถอ่านได้โดยไม่ใช้ sudo ซึ่งจะขอรหัสผ่านและจะไม่สามารถใช้งานได้ตามความต้องการของ OP
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

จุดดี. ฉันไม่ได้ตรวจสอบความเป็นเจ้าของไฟล์เหล่านี้ คุณพูดถูกมันคงไร้ประโยชน์
Dysaster


0

อย่างน้อยใน sudo 1.8.21p2 วิธีนี้ใช้ได้ดี:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

นี่อาจเป็น overkill ที่รุนแรงตามมาตรฐานของคนส่วนใหญ่ แต่นี่คือฟังก์ชั่น (ถูกต้องถูกต้อง) ที่ฉันใช้เพื่อตรวจสอบว่าsudoปลดล็อคหรือไม่ (ฟังก์ชั่นจะไม่เสียเวลาหากผู้ใช้เรียกใช้เพราะrootไม่จำเป็นต้องปลดล็อกsudo)

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

คำตอบง่ายๆ ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

จะแจ้งให้คุณใส่รหัสผ่านหากผู้ใช้ยังไม่มีเซสชัน sudo ที่ใช้งานอยู่
Slizzered

-2

วิธีการเกี่ยวกับหน้าคน

man sudo

รายการคำสั่งที่มีอยู่ของคุณ:

sudo -l

sudo ไม่มีการ จำกัด เวลาหรือวันที่ ... ดู:

man sudo
man sudoers

sudo -l แจ้งรหัสผ่านให้ฉัน ฉันต้องการมันเพื่อบอกฉันว่าฉันไม่มีเซสชัน sudo ที่ใช้งานอยู่
valadil

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

ใช่ - หมดเวลา - แต่ไม่มีกำหนด
Andreas Rehm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.