Sudo - Sudo olup olmadığını ve / veya ne kadar zaman kaldığını kontrol etmek için bir komut var mı?


27

(Originally Stack Overflow'ta yayınlandı. Bunun yerine burada denememi önerdiler. İşte orijinal yazı: https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-ve-veya-ne kadar-zaman-kaldı-kalan )

Başlığa bakınız. Ben sudo sorgulamama izin veren bir komut istiyorum İdeal olarak, eğer sudo zaman aşımına uğradıysa hala sudo ve false olsaydı başarı ile sonuçlanırdı. Kalan süreyi almak da yararlı olabilir (endişelenmeme rağmen sudo -v'yi yeniden doğrulamak için yapabilirim.) Oh ve şifre sormak zorunda kalmamalıydı.

Bulduğum en yakın şey "sudo -n true", ancak -n seçeneği sadece iş yerindeki Centos 5 makinemde mevcut. -n şifre sormak zorunda kalırsa başarısız olur. Bu işlevselliği elde etmenin başka bir yolu var mı? Aslında birlikte çalıştığım tüm makinelere sahip olmadığımı varsayalım, bu yüzden sudo'nun yeni sürümlerini beğenime kuramıyorum.

Ne pahasına olursa olsun bunu yapıyorum böylece sudo durumunu belirtmek için istekte bulunabilirim. Hangi terminallerin aktif olarak bağlanabileceğini bilmek hoşuma gidiyor. Ayrıca, kök olduğumda renkleri değiştiren bir istemim var, ancak çok sık kök kullanmıyorum, bu nedenle kullanım sınırlı.

Yanıtlar:


10

Bu -nseçenek sudo'nun daha yeni sürümlerinde mevcuttur, ancak belirttiğiniz gibi bu bir seçenek değildir. Sadece sudo denemek ve bir şifre sorması ile geri gelip gelmediğini görmek için kısa aradığınız şeyi yapmanın gerçek bir yolu yok. Endişeniz görsel bir gösterge istiyorsanız, neden bir root bash oturumu başlatmak için sudo / bin / bash başlamıyorsunuz? Bunun güvensiz olduğuna dikkat edin, ancak birileri sudo'da isteğinizin değiştiğini fark ederse de biraz güvensizdir.


1
Görsel göstergenin güvenlik sonuçları için +1!
sonraki duyuruya kadar duraklatıldı.

O kısım başıma gelmemişti. Göstergenin yapmayı umduğum şey sudo-K'yi çalıştırmamı hatırlatmak, sudo'yu aktif bırakıp bazı potansiyel olarak tehlikeli terminalleri açık bırakmayı unutmak yerine. Sık sık ekranımı kilitlemeyi unuttuğumdan değil, ilave sigortadan hoşlanıyorum.
valadil

Şu anda sudo -V'yi kontrol etmeye meyilliyim ve -n için yeterince yenise, bildirimi almak için -n'yi kontrol ediyorum. Hiçbir yerde hiçbir şey kırmamalı gibi görünüyor.
valadil

@ valadil: Bana ince bir göstergenin çok fazla güvenlik riski getirmeyeceği ortaya çıkıyor. Örneğin, istemdeki kullanıcı adının altını çizin.
sonraki duyuruya kadar duraklatıldı.

@Dennis: Kesinlikle. İstemi "OMG_YOU_HAVE_SUDO_NOW! _User @ host" ya da onun gibi bir şeyle değiştirmeyecektim. Muhtemelen rengi biraz değiştirirdim. Kimsenin ne anlama geleceğini bilmesini beklemiyorum.
valadil

29

Bunun gerçekten eski bir soru olduğunu biliyorum ama bugün bir senaryoda yazdım:

CAN_I_RUN_SUDO = $ (sudo -n çalışma süresi 2> & 1 | grep "load" | wc -l)
eğer [$ {CAN_I_RUN_SUDO} -gt 0]
sonra
    echo "sudo komutunu çalıştırabilirim"
Başka
    echo "Sudo komutunu çalıştıramıyorum"
fi

1

Aşağıdaki komut, sudo uyguladığın için renkli bir gösterge göstereceğinden sudo -k, makineden uzaklaşmadan önce bir tane yapmayı unutma . Renkli olmayan terminallerde de kullanışlıdır.

Farklı terminal oturumlarında sudo aktif ve inaktif olabileceğimiz için ~ / .bashrc komutunun sonuna koyabileceğiniz bir şey yarattım.

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

bashTest etmek için terminal tipinde . Ayrıca, her komut çalıştırdığınızda, son komutun bittiği zaman bilgisine sahip bir satır ekler, böylece öğle yemeğine gidebilir ve son komutun ne zaman bittiğini anlayabilirsiniz :).

İhtiyaçlarınıza uyacak şekilde bu kodla oynayabilirsiniz. PS1 değişkeni de var (gerçek küçük bilgi istemi tek satırlık), ancak bununla uğraşmamak daha iyi olur.

PS: OS-X için, @nwinkler tarafından aşağıdaki yorumu arayın.


Çıkış kodunu kontrol etmek sudo -nOS X'de çalışmıyor gibi görünüyor. Burada soruma bakın: superuser.com/questions/902826/…
nwinkler

Peki, önerdiğim sudo -ntest, kullanıcının sudo erişimi etkin olup olmadığını belirlemek için kullanılabilecek başka bir test olabileceğine inanıyor musunuz? ya da belki OS-X biraz güncelleme gerektiriyor? OS-X btw'yi hiç kullanmadım.
Kova Gücü

2
OS X'in en son sürümünü kullanıyorum sudo -n. BSD'de (OS X'in dayandığı) GNU sürümünden farklı bir davranışa sahip olabilir. İnsanlara, denetimin bu sürümünün OS X'te işe yaramadığını bildirmek için yorumumu ekledim. Başka bir yanıttan ( sudo -n uptime 2>&1|grep "load"|wc -l) bir çek kullandım ( ve bu, OS X'te iyi çalışıyor gibi görünüyor.) ama işe yarıyor.
nwinkler

1
@nwinkler oh, bu yüzden aslında ürettiği çıktıya (dönüş değeri değil), ilginç bir geçici çözüme bağlı
Kova Gücü,

@nwinkler ancak mümkün olduğunca yakın. Veya daha da iyisi, çünkü sudo -nsudo -V 1.7.9 adamcağız
Marco M. von Hagen

1

@ Wags007 tarafından verilen cevabı basitleştirmek için

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

Bununla birlikte, eğer https://www.sudo.ws/man/1.8.15/sudoers.man.html konfigürasyonunuzda varsa defaults mail_badpass, yanlış yaptığınız her test için gönderilen bir posta olacaktır (sorulacaktı). Bu tür sıkıntılardan kaçınmak için sudoers dosyanızın bir bölümünü değiştirin.

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Sonuç olarak, / bin / true dışındaki tüm komutlar için güvenlik uyarısı gönderilir. Evet, birileri şimdi sudo trueherhangi bir güvenlik uyarısı postası gönderilmeden sınırsız sayıda çağrı yaparak bir şifreyi zorla kullanmaya çalışabilir.

Not: Her zaman visudosudoers dosyasını düzenlemek için favori editörünüz yerine kullanın . Bunu yapmamak, kilitli kalma riskiniz vardır.


0

Sudo el kitabına göre, sudo oturumu zaman damgası dosyasına ( /usr/lib/sudo/<username>) göre belirlenir , böylece zaman damgası dosyasının tarihini / saatini kontrol ederek ne kadar zaman kaldığını anlayabilirsiniz. Ancak, sistemimde zaman damgası dosyası aslında bir dizindir ve içinde şifreli içerik bulunan üç dosya vardır (ve ayrıca bazı tuhaf zaman damgaları, ancak /usr/lib/sudo/<username>sudo’ya şifremi verdiğim zamanla çakışan bir zaman damgası gibi görünüyordu. Sanırım /usr/lib/sudo/<username>/0en son sudoinfazın zaman damgası var .


1
Sistemimde, zaman damgası dosyaları sudo kullanmadan okunamayan, şifre isteyen ve dolayısıyla OP'nin ihtiyaçları için çalışmayan bir dizinde bulunuyor.
sonraki duyuruya kadar duraklatıldı.

İyi bir nokta. Bu dosyaların sahipliğini kontrol etmedim. Haklısın, işe yaramaz.
Dysaster


0

En azından 1.8.21p2 numaralı sudo'da bu yaklaşım iyi çalışıyor:

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

0

Bu, muhtemelen çoğu insanın standartlarına göre aşırı derecede üstesinden gelir, ancak burada kilidin açılıp açılmadığını kontrol etmek için kullandığım (olası doğru) fonksiyon (işte sudoçalışan kullanıcı ise rootkilidini açmaya gerek olmadığı için zaman kaybetmeyecektir 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

basit cevap ...

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

Kullanıcı zaten aktif bir sudo oturumuna sahip değilse, bu bir parola
soracaktır

-2

Man sayfa hakkında nasıl

man sudo

Kullanılabilir komutlarınızı listeleyin:

sudo -l

sudo'da zaman veya tarih sınırı yoktur ... bkz:

man sudo
man sudoers

sudo -l bana bir şifre istemi veriyor. Aktif bir sudo seansım olmadığını söylememe ihtiyacım var.
valadil

sudo durumu zaman aşımına uğradı, ancak zamanlama özelliğinin bulunmadığı anlamına geliyorsa haklısınız.
sonraki duyuruya kadar duraklatıldı.

Evet - zaman aşımına uğradı - ama program yok.
Andreas Rehm
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.