Sudo - có một lệnh để kiểm tra xem tôi có sudo không và / hoặc còn bao nhiêu thời gian?


27

(Nguyên đăng trên Stack Overflow Họ đề nghị tôi thử ở đây thay vì Dưới đây là các bài bản gốc:.. Https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-and-or-how-much-time-is-left )

Xem tiêu đề. Tôi muốn một lệnh cho phép tôi truy vấn sudo. Lý tưởng nhất là nó sẽ trở lại thành công nếu tôi vẫn còn sudo và false nếu sudo đã hết hạn. Dành thời gian còn lại cũng có thể hữu ích (mặc dù nếu tôi lo lắng tôi chỉ có thể thực hiện sudo -v để xác nhận lại.) Ồ và nó không cần phải hỏi mật khẩu.

Thứ gần nhất tôi tìm thấy là "sudo -n true", nhưng tùy chọn -n chỉ có trên máy Centos 5 của tôi khi làm việc. -n thất bại nếu nó phải yêu cầu mật khẩu. Có cách nào khác để có được chức năng này? Giả sử tôi không thực sự có root trên tất cả các máy tôi làm việc cùng, vì vậy tôi không thể cài đặt các phiên bản sudo mới theo ý thích của mình.

Đối với những gì đáng giá tôi đang làm điều này để tôi có thể nhận được lời nhắc của mình để chỉ trạng thái sudo. Tôi muốn biết thiết bị đầu cuối nào đang tích cực sudo. Tôi cũng có một lời nhắc thay đổi màu sắc khi tôi root, nhưng tôi không sử dụng root thường xuyên vì vậy đó là hạn chế sử dụng.

Câu trả lời:


10

Các -ntùy chọn có sẵn trong các phiên bản mới hơn của sudo, nhưng như bạn nói đó không phải là một lựa chọn. Không có cách nào thực sự để làm những gì bạn đang tìm kiếm, chỉ cần thử sudo và xem liệu nó có quay lại với lời nhắc nhập mật khẩu không. Nếu mối quan tâm của bạn là bạn muốn có một chỉ dẫn trực quan, tại sao không bắt đầu làm sudo / bin / bash để bắt đầu một phiên bash gốc? Lưu ý rằng điều này không an toàn, nhưng cũng có phần không an toàn nếu ai đó nhận ra lời nhắc của bạn thay đổi trên sudo.


1
+1 cho các phân nhánh bảo mật của một chỉ báo trực quan!
Tạm dừng cho đến khi có thông báo mới.

Phần đó đã không xảy ra với tôi. Điều tôi hy vọng chỉ báo thực hiện là nhắc nhở tôi chạy sudo -K, thay vì quên tôi đã để sudo hoạt động và để một số thiết bị đầu cuối nguy hiểm tiềm tàng mở. Không phải là tôi thường quên khóa màn hình, nhưng tôi thích bảo hiểm bổ sung.
valadil

Hiện tại tôi đang nghiêng về việc kiểm tra sudo -V, và nếu nó đủ mới để có -n, hãy kiểm tra -n để nhận thông báo. Có vẻ như nó không nên phá vỡ bất cứ nơi nào.
valadil

@valadil: Theo tôi, một chỉ số tinh tế sẽ không gây ra quá nhiều rủi ro bảo mật. Bật gạch chân cho tên người dùng trong lời nhắc, ví dụ.
Tạm dừng cho đến khi có thông báo mới.

@Dennis: Chính xác. Tôi sẽ không thay đổi lời nhắc của mình thành "OMG_YOU_HAVE_SUDO_NOW! _User @ host" hoặc đại loại như thế. Có lẽ tôi chỉ cần thay đổi màu sắc một chút. Tôi không mong đợi bất cứ ai biết điều đó có nghĩa là gì trừ khi họ ngồi xuống và thân mật với .bashrc của tôi.
valadil

29

Tôi biết đây là một câu hỏi thực sự cũ nhưng đây là một kịch bản ngày hôm nay:

CAN_I_RUN_SUDO = $ (sudo -n thời gian hoạt động 2> & 1 | grep "tải" | wc -l)
nếu [$ {CAN_I_RUN_SUDO} -gt 0]
sau đó
    echo "Tôi có thể chạy lệnh sudo"
khác
    echo "Tôi không thể chạy lệnh Sudo"
fi

1

Lệnh dưới đây sẽ hiển thị một dấu hiệu màu mà bạn đã cấp sudo, vì vậy bạn nhớ thực hiện sudo -ktrước khi rời khỏi máy. Nó cũng hữu ích trên các thiết bị đầu cuối không màu.

Vì chúng ta có thể có sudo hoạt động và không hoạt động trên các phiên cuối khác nhau, tôi đã tạo cái này mà bạn có thể đặt ở cuối ~ / .bashrc của bạn

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

Tại loại thiết bị đầu cuối bashđể kiểm tra nó. Nó cũng sẽ thêm toàn bộ một dòng mỗi khi bạn thực hiện một lệnh, có thông tin về thời gian lệnh cuối cùng kết thúc, vì vậy bạn có thể đi ăn trưa và biết khi nào lệnh cuối cùng kết thúc :).

Bạn có thể chơi với mã này để phù hợp với nhu cầu của bạn. Ngoài ra còn có biến PS1 (đó là dòng đơn nhắc nhỏ thực tế), nhưng tôi nghĩ tốt hơn là không gây rối với nó.

PS.: Cho OS-X, hãy tìm bình luận bên dưới của @nwinkler.


Kiểm tra mã thoát của sudo -ndường như không hoạt động trên OS X. Xem câu hỏi của tôi tại đây: superuser.com/questions/902826/
ám

tốt, thử nghiệm tôi đề xuất là sudo -n, bạn có tin rằng có thể có bất kỳ thử nghiệm nào khác có thể được sử dụng để xác định xem người dùng có truy cập sudo không? hoặc có thể OS-X yêu cầu một số cập nhật? Tôi chưa bao giờ sử dụng OS-X btw.
Sức mạnh Bảo Bình

2
Tôi đang sử dụng phiên bản OS X mới nhất. Có thể sudo -ntrên BSD (OS X dựa trên) có hành vi khác với phiên bản GNU. Tôi vừa thêm nhận xét của mình để cho mọi người biết rằng phiên bản kiểm tra này dường như không hoạt động trên OS X. Tôi đã sử dụng một kiểm tra từ một câu trả lời khác ( sudo -n uptime 2>&1|grep "load"|wc -l) và điều này dường như hoạt động tốt trên OS X. Nó không thanh lịch, nhưng nó đã có tác dụng.
nwinkler

1
@nwinkler oh, vậy nó thực sự phụ thuộc vào đầu ra mà nó tạo ra (không phải giá trị trả về), cách giải quyết thú vị
Sức mạnh của Bảo Bình

@nwinkler nhưng nó càng gần càng tốt. Hoặc thậm chí tốt hơn vì sudo -ntrở thành lỗi trong sudo -V 1.7.9
Marco M. von Hagen

1

Để đơn giản hóa câu trả lời được đưa ra bởi @ wags007

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

Tuy nhiên, nếu trong https://www.sudo.ws/man/1.8.15/sudoers.man.html cấu hình của bạn defaults mail_badpass, sẽ có một thư được gửi cho mỗi bài kiểm tra dẫn đến sai (sẽ được nhắc). Để tránh phiền toái như vậy, hãy thay đổi một phần tệp sudoers của bạn thành

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Kết quả là các thư cảnh báo bảo mật được gửi cho tất cả các lệnh ngoại trừ / bin / true. Vâng, bây giờ ai đó có thể cố gắng tạo ra một mật khẩu bằng cách gọi sudo truekhông giới hạn số lần mà không có bất kỳ thư cảnh báo bảo mật nào được gửi.

Lưu ý: Luôn sử dụng visudothay vì trình chỉnh sửa yêu thích của bạn để chỉnh sửa tệp sudoers. Không làm như vậy bạn có nguy cơ bị khóa.


0

Theo hướng dẫn sử dụng sudo, phiên sudo được xác định theo tệp tem thời gian ( /usr/lib/sudo/<username>), do đó bạn có thể tìm ra thời gian còn lại bằng cách kiểm tra ngày / giờ của tệp tem thời gian. Tuy nhiên, trong hệ thống của tôi, tệp dấu thời gian trên thực tế là một thư mục và có ba tệp có nội dung khó hiểu trong đó (và cũng có một số dấu thời gian kỳ lạ, nhưng /usr/lib/sudo/<username>dường như có dấu thời gian trùng với thời gian tôi đưa mật khẩu Tôi nghĩ /usr/lib/sudo/<username>/0có dấu ấn thời gian của sudovụ hành quyết gần đây nhất .


1
Trên hệ thống của tôi, các tệp dấu thời gian nằm trong một thư mục không thể đọc được mà không sử dụng sudo, nó sẽ nhắc mật khẩu và do đó sẽ không hoạt động cho nhu cầu của OP.
Tạm dừng cho đến khi có thông báo mới.

Điểm tốt. Tôi đã không kiểm tra quyền sở hữu của các tập tin này. Bạn nói đúng, nó sẽ vô dụng.
Dysaster


0

Ít nhất là trên sudo 1.8,21p2, phương pháp này hoạt động tốt:

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

0

Đây có thể là quá mức cần thiết theo tiêu chuẩn của hầu hết mọi người, nhưng đây là chức năng (chính xác hoàn toàn) tôi sử dụng để kiểm tra xem có sudođược mở khóa không (chức năng sẽ không lãng phí thời gian nếu người dùng đang chạy nó root, vì không cần phải mở khóa 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

câu trả lời đơn giản ...

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

Điều này sẽ nhắc nhập mật khẩu, nếu người dùng chưa có phiên sudo hoạt động
Slizzered

-2

Làm thế nào về trang người đàn ông

man sudo

Liệt kê các lệnh có sẵn của bạn:

sudo -l

sudo tự nó không có giới hạn thời gian hoặc ngày ... xem:

man sudo
man sudoers

sudo -l cho tôi một dấu nhắc mật khẩu. Tôi cần nó để nói với tôi rằng tôi không có phiên sudo hoạt động.
valadil

trạng thái sudo hết thời gian, nhưng bạn đúng nếu bạn muốn nó không có tính năng lịch trình.
Tạm dừng cho đến khi có thông báo mới.

Có - hết giờ - nhưng không có lịch trình.
Andreas Rehm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.