Gần đây tôi đã gặp rắc rối vì điều này.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Có cách nào để kiểm tra xem tôi có quyền truy cập sudo hay không?
Gần đây tôi đã gặp rắc rối vì điều này.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Có cách nào để kiểm tra xem tôi có quyền truy cập sudo hay không?
Câu trả lời:
Chạy đi sudo -v
. Nó thường được sử dụng để kéo dài thời gian chờ mật khẩu sudo của bạn, nhưng có thể được sử dụng để xác định xem bạn có bất kỳ sudo
đặc quyền nào không .
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
Đoạn trích trang Man:
Nếu được cung cấp tùy chọn -v (xác thực), sudo sẽ cập nhật dấu thời gian của người dùng, nhắc nhập mật khẩu của người dùng nếu cần. Điều này kéo dài thời gian chờ sudo thêm 5 phút nữa (hoặc bất cứ thời gian chờ nào được đặt thành sudoers) nhưng không chạy lệnh.
Nếu người dùng của bạn chỉ được phép chạy các lệnh cụ thể , lệnh này sẽ hoạt động, cho biết bạn được phép chạy một cái gì đó với các đặc quyền khác nhau. Mặc dù thông báo trông khác khi cố gắng thực thi lệnh mà bạn không được phép trong trường hợp này (và không có thư nào được gửi đến root ), nhưng vẫn có thể bạn sẽ gặp rắc rối nếu quản trị viên đọc /var/log/secure
.
$ sudo ls
[sudo] password for [username]:
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].
Để tìm hiểu những gì bạn được phép chạy với các đặc quyền khác nhau, bạn có thể sử dụng sudo -l
. Lưu ý rằng lệnh này yêu cầu bạn nhập mật khẩu của bạn.
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
? Tôi đã nhập mật khẩu của mình và không nhận được bất cứ điều gì về trái phép. Tôi biết tôi đã sudo
chạy thành công các lệnh khác, nhưng unable to resolve host
thông báo đó khiến tôi lo ngại một số thứ khác có thể gây cười trên máy chủ.
sudoers
tập tin. Ở đó, bạn có thể chỉ định máy chủ nào được phép sử dụng để chạy một lệnh cụ thể (điều này hữu ích khi sử dụng cùng một sudoers
tệp trên nhiều máy). Có thể tên máy chủ được chỉ định trong tệp đó không thể được giải quyết. Hãy thử kiểm tra nó bằng host
lệnh chẳng hạn.
sudo -v
đã cho "xx không có trong tệp sudoers. Sự cố này sẽ được báo cáo."
Điều này rất đơn giản. Chạy đi sudo -l
. Điều này sẽ liệt kê bất kỳ đặc quyền sudo bạn có.
sudo -l
hỏi mật khẩu nếu bạn có thể sudo hay không. sudo -v
chỉ hỏi nếu bạn có thể, và "$(whoami)" != "root"
sẽ không bao giờ hỏi bất cứ điều gì trong bất kỳ linux nào.
sudo
.
Đây là phiên bản thân thiện với kịch bản:
timeout 2 sudo id && echo Access granted || echo Access denied
vì nó sẽ không bị kẹt khi nhập mật khẩu nếu bạn không có sudo
quyền truy cập.
Bạn cũng có thể đặt nó trong một biến như:
timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"
Lưu ý: Trên macOS, bạn cần cài đặt coreutils
, vd brew install coreutils
.
timeout
không có sẵn theo mặc định, ví dụ như trên OS X?
coreutils
, ví dụ brew install coreutils
.
Câu trả lời của Gerald Schade ở đây , vẫn có thể được cải thiện!
Sử dụng
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
Đây là một ví dụ đầy đủ về việc sử dụng trong một tập lệnh :
#!/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
Đối với tôi, ' sudo -v
' và ' sudo -l
' không hoạt động trong một tập lệnh vì đôi khi tương tác (hỏi tôi mật khẩu, như đã đề cập ở trên). ' sudo -n -l
' cũng không hoạt động, nó đã cho mã thoát '1' mặc dù tôi có quyền sudo, vì mật khẩu bị thiếu. Nhưng mở rộng lệnh tới:
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
đã thành công cho tôi cho kịch bản. Biểu thức này đưa ra 0
nếu người dùng hiện tại có thể gọi 'sudo' và 1
nếu không.
Giải thích:
Tham số bổ sung -n
để sudo
ngăn chặn tính tương tác.
Đầu ra $A
của lệnh ' sudo -n -v 2>&1
' có thể là:
- trống (trong trường hợp này, sudo có thể được gọi bởi người dùng hiện tại) hoặc:
- một lưu ý rằng người dùng hiện tại không được ủy quyền cho sudo hoặc:
- một văn bản câu hỏi cho mật khẩu (trong trường hợp này, người dùng được ủy quyền).
("Asswor" sẽ phù hợp với "mật khẩu" tiếng Anh cũng như "Passwort" của Đức).
Tôi đã có thứ hạng thấp để bình chọn và bình luận, nhưng tôi muốn nâng cao câu trả lời của Gerald Schade, vì tôi đã thấy rằng cách duy nhất trước đây và nghĩ rằng no1 khác biết điều đó - cho đến bây giờ: D
btw giải pháp của tôi:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(từ cuối năm 2015 mwhahaaa)
"Truy cập Sudo" có hương vị. Hai hương vị chính: Đầu tiên bạn hoặc một nhóm thành viên của bạn cần được thiết lập để truy cập sudo trong tệp / etc / sudoers.
Thứ hai, bạn cần biết mật khẩu của mình, hoặc bạn cần thực hiện một lệnh sudo gần đây. Gần đây, thời gian chờ đã hết hạn. (Sự thật thú vị: bạn có thể rút ngắn thời gian trong tệp sudoer của mình.)
Tôi thường muốn kiểm tra loại quyền truy cập thứ hai trong phần mở đầu của tập lệnh sẽ cần phải thực hiện một số bước. Khi kiểm tra này thất bại tôi có thể thông báo cho người dùng anh ta cần kích hoạt loại truy cập thứ 2 trước khi chạy tập lệnh.
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 bảo sudo đọc mật khẩu từ stdin. -P đặt dấu nhắc trống. -K xóa lần truy cập thứ hai.
Vì nó gửi stderr tới / dev / null, nên nó cũng sẽ kiểm tra xem người dùng có loại truy cập sudo đầu tiên hay không.
Thực hiện theo các bước sau để xem tệp sudoers. Nếu bạn đang ở đó, bạn có sudo. Nếu không, bạn có thể thêm chính mình.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
, vì vậy anh ta có thể không phải là quản trị viên hệ thống, thậm chí không phải là một trong những quản trị viên hệ thống ưu tú. Có lẽ anh ta chỉ là một người dùng nghĩ rằng anh ta có thể đã được cấp một số quyền hạn. Điều gì khiến bạn nghi ngờ rằng anh ấy có thể đi su
?