Sudo erişimine sahip olup olmadığımı nasıl kontrol edebilirim?


97

Son zamanlarda bundan dolayı başım belaya girdi.

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

Sudo erişimine sahip olup olmadığımı kontrol etmenin bir yolu var mı?


Sistem yöneticinize sorunuz mu?
mdpc

1
@mdpc: Bundan başka bir yol var mı?
Bruce,

Root erişimi elde edip edemediğinizden bahsetmediniz.
mdpc

Yanıtlar:


116

Run sudo -v. Genellikle sudo şifrenizin zaman aşımını uzatmak için kullanılır, ancak sudoayrıcalıklarınızın olup olmadığını belirlemek için kullanılabilir .

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

Man sayfa alıntı:

-V (doğrula) seçeneği verilirse, sudo kullanıcının zaman damgasını günceller, gerekirse kullanıcı şifresini ister. Bu, sudo zaman aşımını 5 dakika daha uzatır (veya zaman aşımının sudoer'da ne olduğu). Ancak bir komut çalıştırmaz.

Kullanıcınızın yalnızca belirli komutları çalıştırmasına izin verilirse , bu komut farklı yetkilere sahip bir şeyi çalıştırmanıza izin verildiğini gösteren çalışır . Bu durumda izin verilmeyen bir komutu yerine getirmeye çalışırken mesaj farklı görünse de (ve hiçbir posta köke gönderilmediyse ), yöneticiler okursa başınız derde girebilir /var/log/secure.

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

Farklı ayrıcalıklarla neleri çalıştırmanıza izin verildiğini bulmak için kullanabilirsiniz sudo -l. Bu komutun şifrenizi girmenizi gerektirdiğini unutmayın.


2
Teşekkürler. sudo -v benim için çalışıyor. Man sayfası sudo -l'yi de çalıştırabileceğimi söylüyor ama bu bir şifre soruyor. Neden?
Bruce,

2
@Bruce Burada tahmin ediyorum, ancak aksi halde bir kullanıcı (veya çalıştırdığınız bir program) mevcut kullanıcınız tarafından hangi programların çalıştırılabileceğini (muhtemelen şifre girmeden) bulabilir ve bu bilgiyi kötü niyetli olarak kullanmaya çalışabilir.
Daniel Beck

Bunu geri gidince ne anlama geldiğini sence: patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? Şifremi girdim ve yetkisiz hiçbir şey almadım. sudoBaşarılı bir şekilde diğer komutları çalıştırmam gerektiğini biliyorum , ancak bu unable to resolve hostmesaj bana ana bilgisayarda korkak olabilecek başka bir şeyden endişe etti.
Patrick M,

@PatrickM Dosyayla ilgili bir sorun gibi görünüyor sudoers. Burada, belirli bir komutu çalıştırmak için hangi kullanıcıya bir kullanıcının yetkilendirileceğini belirtebilirsiniz (bu, aynı sudoersdosyayı birden fazla makinede kullanırken kullanışlıdır ). Muhtemelen bu dosyada belirtilen ana bilgisayar adı çözülemedi. hostÖrneğin komutuyla kontrol etmeyi deneyin .
Ale

RHEL 6'da benim için çalışmıyor, sudo -v"xx sudoers dosyasında değil. Bu olay bildirilecek."
79E09796

42

Bu çok basit. Run sudo -l. Bu, sahip olduğunuz sudo ayrıcalıklarını listeler.


1
Belki reddedildi, çünkü Daniel Beck'in neredeyse iki yıl önce söylediklerini tekrar ediyor.
G-Man

1
Ya da ne olduğunu açıklar, bu en iyi
ihtimalle

2
@Jonathan: Eğer ubuntu rigt 'de şimdi komut dosyası yazarsanız sudo -l, sudo yapıp yapamayacağınız bir şifre ister. sudo -vSadece yapıp yapamayacağınızı sorar ve "$(whoami)" != "root"hiçbir linux'ta hiçbir şey sormaz.
bksunday,

@bksunday Haklısın. Şimdi temiz bir Debian Jessy'de test ettim ve sonuçlarınızı doğruladım. Benim önceki (şimdi silindi) yorumum, bazı sudoayrıcalıklara sahip olduğum bir makinede yapılan testlerden kaynaklanıyordu .
Jonathan Ben-Avraham,

@ G-Man ancak bu basit cevap bana muhtemelen daha kesin olan Daniel'in cevabından daha fazla yardımcı oldu, bu komutun talihsiz bir şekilde sonlandığı yer ...
Betlista

11

İşte komut dosyası dostu sürüm:

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

sudoerişiminiz yoksa şifre girişinde takılı kalmayacağından .

Ayrıca şunu gibi bir değişkende ayarlayabilirsiniz:

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

Not: MacOS'ta coreutils, örneğin yüklemeniz gerekir brew install coreutils.


timeoutVarsayılan olarak mevcut olmayan yerler için alternatifler , örneğin OS X?
Harry,

1
Yüklemeniz gerekir coreutils, örneğin brew install coreutils.
kenorb

1
Bu benim için bir senaryoda çalışmıyor. Açıklanamayan bir sebepten dolayı senaryo onu öldürene kadar kilitleniyor.
beruic

6

Gerald Schade'nin cevabı burada , hala geliştirilebilir!

kullanım

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

İşte bu bir komut kullanım komple örneği :

#!/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

2

Benim için ' sudo -v' ve ' sudo -l' bir senaryoda çalışmadı çünkü bazen etkileşimli (benden yukarıda bahsedildiği gibi bir şifre sormak istiyor). ' sudo -n -l' de işe yaramadı, eksik parola nedeniyle sudo izinlerim olmasına rağmen '1' çıkış kodunu verdi. Ancak komutu aşağıdakilere genişletmek:

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

senaryo için benim için başarılı oldu. Bu ifade 0, şu anki kullanıcının 'sudo' olup 1olmadığını söyler .

Açıklama:
ek parametre -niçin sudoetkileşim önler. ' ' Komutunun
çıktısı şunlar olabilir : - boş (bu durumda, geçerli kullanıcı tarafından sudo çağrılabilir) veya: - geçerli kullanıcının sudo için yetkilendirilmediğine dikkat edin, veya: - parola (bu durumda kullanıcı yetkilidir). ("asswor", İngilizce "şifre" ve Almanca "Passwort" için de uygun olacaktır).$Asudo -n -v 2>&1




2

oylama ve yorum yapma konusunda düşük rütbeme sahibim, ancak Gerald Schade'nin cevabını değiştirmek istedim, çünkü bunu daha önce tek yolunu buldum ve başka hiç kimsenin bilmediğini düşündüm - şimdiye kadar: D

btw benim çözümüm:

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

(2015 yılının sonundan itibaren mwhahaaa)


1
Yorum yapmaya nasıl başladığınızı anladığınızdan emin olmak için "Neden yorum yapmak için 50 itibara ihtiyacım var" konusunu okuyun.
Pezevenk Suyu BT

1

"Sudo access" lezzetlerle geliyor. İki temel lezzet: İlk önce / etc / sudoers dosyasında sudo erişimi için sizin veya bir üyenizin bulunduğu bir grubun ayarlanması gerekir.

İkincisi, şifrenizi bilmeniz veya yakın zamanda bir sudo komutu vermeniz gerekiyor. Son zamanlarda, zaman aşımının süresi dolmamış. (Eğlenceli gerçek: sudoer'in dosyasında zaman aşımına uğratabilirsiniz.)

Sıklıkla bazı adımlar atması gereken bir betik prologundaki ikinci tür erişimi test etmek istiyorum. Bu kontrol başarısız olduğunda kullanıcıya senaryoyu çalıştırmadan önce 2. tür erişimi etkinleştirmesi gerektiğini tavsiye edebilirim.

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, sudo’ya şifrenin stdin’den okunmasını söyler. -P boş bir bilgi istemi ayarlar. -K ikinci erişim zamanını temizler.

/ Dev / null dizinine stderr gönderdiğinden, kullanıcının ilk sudo erişimi olup olmadığını da denetler.


-3

Takip Bu Sudoers dosyasını görüntülemek için adımlar. Eğer oradaysan, sudoların var. Değilse, kendinizi ekleyebilirsiniz.

  1. su
  2. visudo
  3. Dosyanın altına girin your_username_here ALL=(ALL) ALL
  4. Vur ESCve yaz:wq
  5. tip exit
  6. İhtiyacınız olan komutu yeniden çalıştırın sudo
  7. Şifrenizi girin (kökün şifresini değil)

10
OP koşmak için "başını belaya soktu" sudo, bu yüzden muhtemelen sistem yöneticisi değil , hatta seçkin sistem yöneticilerinden biri bile değil . Muhtemelen, kendisine sınırlı güç verilebileceğini düşünen bir kullanıcıdır. Gidebileceğinden şüphelenen nedir su?
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.