Bagaimana cara memeriksa apakah saya memiliki akses sudo?

104

Saya baru-baru mendapat masalah karena ini.

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

Apakah ada cara untuk memeriksa apakah saya memiliki akses sudo atau tidak?

Bruce
sumber
Tanyakan administrator sistem Anda?
mdpc
1
@ mdpc: Apakah ada cara lain selain itu?
Bruce
Anda belum menyebutkan apakah Anda bisa mendapatkan akses root atau tidak.
mdpc
46
Ini harus menjadi contoh pertama melihat seseorang menindaklanjuti "Kejadian ini akan dilaporkan" .
slhck

Jawaban:

121

Lari sudo -v. Ini biasanya digunakan untuk memperpanjang batas waktu kata sandi sudo Anda, tetapi dapat digunakan untuk menentukan apakah Anda memiliki sudohak istimewa.

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

Kutipan halaman manual:

Jika diberi opsi -v (validasi), sudo akan memperbarui cap waktu pengguna, meminta kata sandi pengguna jika perlu. Ini memperpanjang batas waktu sudo selama 5 menit (atau apa pun batas waktu itu diatur dalam sudoers) tetapi tidak menjalankan perintah.

Jika pengguna Anda hanya diizinkan untuk menjalankan perintah tertentu , perintah ini akan berfungsi, yang menunjukkan bahwa Anda diizinkan untuk menjalankan sesuatu dengan hak istimewa yang berbeda. Meskipun pesan terlihat berbeda ketika mencoba menjalankan perintah yang tidak diizinkan dalam kasus ini (dan tidak ada email yang dikirim ke root ), masih mungkin Anda akan mendapat masalah jika admin membaca /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Untuk mengetahui apa yang diizinkan untuk Anda jalankan dengan berbagai hak istimewa, Anda dapat menggunakannya sudo -l. Perhatikan bahwa perintah ini mengharuskan Anda memasukkan kata sandi.

Daniel Beck
sumber
2
Terima kasih. sudo -v bekerja untuk saya. Halaman manual mengatakan saya bisa menjalankan sudo-l juga tetapi meminta kata sandi. Mengapa demikian?
Bruce
2
@ Bruce Saya menduga di sini, tetapi jika tidak, seseorang (atau program yang Anda jalankan) dapat mengetahui program apa yang dapat dijalankan (mungkin tanpa memasukkan kata sandi) oleh pengguna Anda saat ini dan mencoba menggunakan informasi itu dengan jahat.
Daniel Beck
Menurut Anda apa artinya ketika saya mendapatkan ini kembali patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>:? Saya memasukkan kata sandi dan tidak mendapatkan apa pun tentang yang tidak sah. Saya tahu saya telah sudoberhasil menjalankan perintah lain, tetapi unable to resolve hostpesan itu membuat saya khawatir sesuatu yang lain mungkin funky pada host.
Patrick M
@ Patrickrick Sepertinya ada masalah dengan sudoersfile. Di sana Anda dapat menentukan host mana yang diizinkan pengguna untuk menjalankan perintah tertentu (ini berguna saat menggunakan sudoersfile yang sama di beberapa mesin). Mungkin nama host yang ditentukan dalam file itu tidak dapat diatasi. Coba periksa dengan hostperintah misalnya.
Ale
Tidak berfungsi untuk saya di RHEL 6, sudo -vmemberi "xx tidak ada dalam file sudoers. Insiden ini akan dilaporkan."
79E09796
43

Ini sangat sederhana. Lari sudo -l. Ini akan mencantumkan hak istimewa sudo yang Anda miliki.

Brad Dausses
sumber
1
Mungkin kalah karena mengulangi apa yang dikatakan Daniel Beck hampir dua tahun lalu.
G-Man
1
Atau jelaskan apa yang terjadi, ini adalah komentar, paling-paling
Ramhound
2
@ Jonathan: jika kamu mau skrip di ubuntu rigt sekarang, sudo -lminta kata sandi apakah kamu bisa sudo atau tidak. sudo -vhanya bertanya jika Anda bisa, dan "$(whoami)" != "root"tidak akan pernah bertanya apa pun di linux apa pun.
bksunday
@ bksunday Anda benar. Saya menguji sekarang pada Debian Jessy yang bersih dan mengkonfirmasi hasil Anda. Komentar saya sebelumnya (dihapus sekarang) mungkin merupakan hasil pengujian pada mesin yang saya miliki beberapa sudoprivs.
Jonathan Ben-Avraham
@ G-Man tetapi jawaban sederhana ini membantu saya lebih dari jawaban Daniel yang mungkin lebih tepat, di mana perintah ini adalah yang paling disayangkan ...
Betlista
11

Berikut ini adalah versi script-friendly:

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

karena itu tidak akan macet pada input kata sandi jika Anda tidak memiliki sudoakses.

Anda juga dapat mengaturnya dalam variabel seperti:

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

Catatan: Di macOS, Anda perlu menginstal coreutils, mis brew install coreutils.

kenorb
sumber
Adakah alternatif untuk tempat timeoutyang tidak tersedia secara default, mis. Pada OS X?
Harry
1
Anda perlu menginstal coreutils, mis brew install coreutils.
kenorb
2
Ini tidak berfungsi untuk saya dalam skrip. Untuk alasan yang tidak dapat dijelaskan, skrip hang sampai saya membunuhnya.
beruic
7

Jawaban Gerald Schade di sini , masih bisa ditingkatkan!

Menggunakan

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

Berikut adalah contoh lengkap penggunaan dalam skrip :

#!/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
ajneu
sumber
2

Bagi saya, ' sudo -v' dan ' sudo -l' tidak berfungsi dalam skrip karena terkadang interaktif (meminta saya untuk kata sandi, seperti yang disebutkan di atas). ' sudo -n -l' Tidak juga berfungsi, itu memberi kode keluar '1' meskipun saya memiliki izin sudo, karena kata sandi yang hilang. Tetapi memperluas perintah ke:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

berhasil bagi saya untuk skrip. Ungkapan ini memberi 0jika pengguna saat ini dapat memanggil 'sudo' dan 1jika tidak.

Penjelasan:
Parameter tambahan -nuntuk sudomencegah interaktivitas.
Output $Adari perintah ' sudo -n -v 2>&1' mungkin:
- kosong (dalam hal ini, sudo dapat dipanggil oleh pengguna saat ini), atau:
- catatan bahwa pengguna saat ini tidak diotorisasi untuk sudo, atau:
- teks pertanyaan untuk kata sandi (dalam hal ini, pengguna diotorisasi).
("asswor" akan cocok untuk "kata sandi" bahasa Inggris serta untuk "Passwort" Jerman).

Gerald Schade
sumber
2

Saya mendapat peringkat rendah untuk memilih dan berkomentar, tetapi saya ingin meningkatkan jawaban Gerald Schade, karena saya telah menemukan bahwa satu-satunya cara sebelumnya, dan berpikir bahwa tidak ada orang lain yang tahu - sampai sekarang: D

btw solusi saya:

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

(dari akhir 2015 mwhahaaa)

pengguna629901
sumber
1
Baca "Mengapa saya perlu 50 reputasi untuk berkomentar" untuk memastikan Anda memahami bagaimana Anda dapat mulai berkomentar.
Pimp Juice,
1

"Akses Sudo" datang dalam rasa. Dua rasa utama: Pertama, Anda, atau grup yang menjadi anggota, perlu diatur untuk akses sudo di file / etc / sudoers.

Kedua Anda perlu mengetahui kata sandi Anda, atau Anda harus melakukan perintah sudo baru-baru ini. Baru-baru ini cukup bahwa batas waktu belum berakhir. (Fakta menyenangkan: Anda dapat membuat waktu sangat lama di file sudoer Anda.)

Saya sering ingin menguji jenis akses kedua dalam prolog skrip yang perlu beberapa langkah. Ketika pemeriksaan ini gagal, saya dapat menyarankan pengguna untuk mengaktifkan jenis akses ke-2 sebelum menjalankan skrip.

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 memberitahu sudo untuk membaca kata sandi dari stdin. -P mengatur prompt kosong. -K menghapus akses kedua kalinya.

Karena ia mengirim stderr ke / dev / null, ia juga akan memeriksa apakah pengguna memiliki jenis akses sudo pertama.

Ben Hyde
sumber
-4

Ikuti langkah - langkah ini untuk melihat file sudoers. Jika Anda di sana, Anda memiliki sudo. Jika tidak, Anda bisa menambahkan sendiri.

  1. su
  2. visudo
  3. Di bawah file, masukkan your_username_here ALL=(ALL) ALL
  4. Hit ESCdan ketik:wq
  5. Tipe exit
  6. Jalankan kembali perintah Anda yang dibutuhkan sudo
  7. Masukkan kata sandi Anda (bukan kata sandi root)
Kruug
sumber
11
OP "mendapat kesulitan" untuk menjalankan sudo, jadi dia mungkin bukan yang administrator sistem, atau bahkan salah satu administrator sistem elit. Dia mungkin hanya pengguna yang berpikir dia mungkin telah diberikan sejumlah kekuatan terbatas. Apa yang membuat Anda curiga dia bisa pergi su?
Scott