Sudo - apakah ada perintah untuk memeriksa apakah saya memiliki sudo dan / atau berapa banyak waktu yang tersisa?


27

(Awalnya diposting di Stack Overflow. Mereka menyarankan saya mencoba di sini sebagai gantinya. Berikut posting asli: /programming/3858208/sudo-is-ther-a-command-to-check-if-i-have -sudo-dan-atau-berapa banyak waktu yang tersisa )

Lihat judul. Saya ingin perintah yang memungkinkan saya permintaan sudo. Idealnya itu akan mengembalikan kesuksesan jika saya masih memiliki sudo dan false jika sudo telah kedaluwarsa. Menghabiskan waktu juga mungkin berguna (walaupun jika saya khawatir saya bisa melakukan sudo -v untuk memvalidasi ulang.) Oh dan seharusnya tidak perlu meminta kata sandi.

Hal terdekat yang saya temukan adalah "sudo -n true", tetapi opsi -n hanya hadir pada mesin Centos 5 saya di tempat kerja. -n gagal jika harus meminta kata sandi. Apakah ada cara lain untuk mendapatkan fungsi ini? Asumsikan saya sebenarnya tidak memiliki root pada semua mesin yang bekerja dengan saya, jadi saya tidak dapat menginstal versi baru sudo sesuai dengan keinginan saya.

Untuk apa itu layak saya lakukan ini sehingga saya bisa mendapatkan prompt saya untuk menunjukkan status sudo. Saya suka mengetahui terminal mana yang bisa digunakan secara aktif. Saya juga memiliki prompt yang mengubah warna ketika saya root, tapi saya tidak terlalu sering menggunakan root sehingga itu penggunaan terbatas.

Jawaban:


10

The -npilihan tersedia dalam versi yang lebih baru dari sudo, tetapi karena Anda menyatakan bahwa bukan pilihan. Tidak ada cara nyata untuk melakukan apa yang Anda cari hanya dengan mencoba sudo dan melihat apakah itu kembali dengan prompt untuk kata sandi. Jika kekhawatiran Anda adalah Anda menginginkan indikasi visual, mengapa tidak mulai melakukan sudo / bin / bash untuk memulai sesi root bash? Perhatikan bahwa ini tidak aman, tetapi juga agak tidak aman jika seseorang menyadari perubahan prompt Anda pada sudo.


1
+1 untuk percabangan keamanan indikator visual!
Dijeda sampai pemberitahuan lebih lanjut.

Bagian itu tidak terpikir olehku. Apa yang saya harap indikator lakukan adalah mengingatkan saya untuk menjalankan sudo -K, daripada lupa saya membiarkan sudo aktif dan membiarkan beberapa terminal yang berpotensi berbahaya terbuka. Bukannya saya sering lupa mengunci layar saya, tapi saya suka asuransi tambahan.
valadil

Saat ini saya cenderung memeriksa sudo -V, dan jika cukup baru untuk memiliki -n, centang -n untuk mendapatkan notifikasi. Sepertinya itu tidak boleh merusak apa pun di mana pun.
valadil

@valadil: Terlintas pada saya bahwa indikator yang halus tidak akan terlalu banyak menimbulkan risiko keamanan. Aktifkan garis bawah untuk nama pengguna di prompt, misalnya.
Dijeda sampai pemberitahuan lebih lanjut.

@ Dennis: Tepat. Saya tidak akan mengubah prompt saya menjadi "OMG_YOU_HAVE_SUDO_NOW! _User @ host" atau yang seperti itu. Saya mungkin hanya mengubah warna sedikit. Saya tidak berharap ada yang tahu apa artinya kecuali mereka duduk dan akrab dengan .bashrc saya.
valadil

29

Saya tahu ini adalah pertanyaan yang sangat lama tapi di sini saya lakukan dalam skrip hari ini:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
jika [$ {CAN_I_RUN_SUDO} -gt 0]
kemudian
    gema "Saya bisa menjalankan perintah sudo"
lain
    gema "Saya tidak bisa menjalankan perintah Sudo"
fi

1

Perintah di bawah ini akan menunjukkan indikasi berwarna bahwa Anda telah memberikan sudo, jadi Anda ingat untuk melakukan sudo -ksebelum pergi dari mesin. Ini berguna juga pada terminal yang tidak berwarna.

Karena kita dapat membuat sudo aktif dan tidak aktif pada sesi terminal yang berbeda, saya membuat ini yang dapat Anda letakkan di akhir ~ / .bashrc Anda

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

Pada tipe terminal bashuntuk mengujinya. Ini juga akan menambahkan seluruh baris setiap kali Anda menjalankan perintah, yang memiliki informasi waktu perintah terakhir berakhir, sehingga Anda dapat pergi makan siang dan tahu kapan perintah terakhir berakhir :).

Anda dapat bermain dengan kode ini sesuai dengan kebutuhan Anda. Ada variabel PS1 juga (itu adalah baris tunggal prompt kecil yang sebenarnya), tapi saya pikir lebih baik untuk tidak mengacaukannya.

PS .: untuk OS-X, cari komentar di bawah ini oleh @nwinkler.


Memeriksa kode keluar sudo -nsepertinya tidak berfungsi di OS X. Lihat pertanyaan saya di sini: superuser.com/questions/902826/…
nwinkler

baik, tes yang saya usulkan adalah sudo -n, apakah Anda percaya ada tes lain yang dapat digunakan untuk menentukan apakah pengguna memiliki akses sudo aktif? atau mungkin OS-X memerlukan pembaruan? Saya tidak pernah menggunakan OS-X btw.
Aquarius Power

2
Saya menggunakan versi terbaru dari OS X. Ada kemungkinan bahwa sudo -npada BSD (yang berbasis OS X) memiliki perilaku yang berbeda dari versi GNU. Saya baru saja menambahkan komentar saya untuk membuat orang tahu bahwa versi cek ini tampaknya tidak berfungsi pada OS X. Saya telah menggunakan cek dari jawaban lain ( sudo -n uptime 2>&1|grep "load"|wc -l), dan ini tampaknya berfungsi dengan baik pada OS X. Ini tidak elegan, tapi berhasil.
nwinkler

1
@nwinkler oh, jadi itu benar-benar tergantung pada output yang dihasilkannya (bukan nilai baliknya), solusi yang menarik
Aquarius Power

@nwinkler tetapi sedekat mungkin. Atau bahkan lebih baik karena sudo -nmenjadi buggy di sudo -V 1.7.9
Marco M. von Hagen

1

Untuk menyederhanakan jawaban yang diberikan oleh @ wags007

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

Namun, jika dalam konfigurasi https://www.sudo.ws/man/1.8.15/sudoers.man.html yang Anda miliki, defaults mail_badpassakan ada email yang dikirim untuk setiap tes yang menghasilkan false (akan diminta). Untuk menghindari gangguan seperti itu, ubah bagian file sudoers Anda ke

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Akibatnya surat peringatan keamanan dikirim untuk semua perintah kecuali / bin / true. Ya, seseorang sekarang dapat mencoba dengan paksa memaksakan kata sandi dengan menelepon sudo truejumlah yang tidak terbatas tanpa surat peringatan keamanan dikirim.

Catatan: Selalu gunakan visudoalih-alih editor favorit Anda untuk mengedit file sudoers. Gagal melakukannya Anda berisiko dikunci.


0

Menurut panduan sudo, sesi sudo ditentukan sesuai dengan file cap waktu ( /usr/lib/sudo/<username>), jadi Anda mungkin dapat mengetahui berapa banyak waktu yang tersisa dengan memeriksa tanggal / waktu file cap waktu. Namun, dalam sistem saya, file cap waktu sebenarnya adalah sebuah direktori, dan ada tiga file dengan konten samar di dalamnya (dan juga beberapa perangko waktu yang aneh, tetapi /usr/lib/sudo/<username>tampaknya memiliki cap waktu yang bertepatan dengan waktu saya memberikan sudo kata sandi saya Saya pikir /usr/lib/sudo/<username>/0memiliki stempel waktu sudoeksekusi terakhir .


1
Pada sistem saya, file timestamp berada dalam direktori yang tidak dapat dibaca tanpa menggunakan sudo, yang meminta kata sandi dan dengan demikian tidak akan berfungsi untuk kebutuhan OP.
Dijeda sampai pemberitahuan lebih lanjut.

Poin bagus. Saya tidak memeriksa kepemilikan file-file ini. Anda benar, itu akan sia-sia.
Dysaster


0

Setidaknya pada sudo 1.8.21p2, pendekatan ini berfungsi dengan baik:

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

0

Ini mungkin berlebihan berlebihan menurut standar kebanyakan orang, tetapi inilah fungsi (mungkin benar) yang saya gunakan untuk memeriksa apakah sudotidak terkunci (fungsi tidak akan membuang-buang waktu jika pengguna menjalankannya root, karena tidak perlu membuka kunci 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

jawaban sederhana ...

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

Ini akan meminta kata sandi, jika pengguna belum memiliki sesi sudo aktif
Slizzered

-2

Bagaimana dengan halaman manual

man sudo

Daftar perintah Anda yang tersedia:

sudo -l

sudo sendiri tidak memiliki batas waktu atau tanggal ... lihat:

man sudo
man sudoers

sudo-l memberi saya prompt kata sandi. Saya membutuhkannya untuk memberi tahu saya bahwa saya tidak memiliki sesi sudo aktif.
valadil

waktu sudo status habis, tetapi Anda benar jika Anda bermaksud bahwa itu tidak memiliki fitur jadwal.
Dijeda sampai pemberitahuan lebih lanjut.

Ya - waktu habis - tetapi tidak ada jadwal.
Andreas Rehm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.