Kök olarak çalıştırılıp çalıştırılmadığını nasıl kontrol edebilirim?

80

Basit bir bash komut dosyası yazıyorum, ancak root olarak çalıştırılıp çalıştırılmadığını kontrol etmek için buna ihtiyacım var. Bunu yapmanın çok basit bir yolu olduğunu biliyorum, ama nasıl bir fikrim yok.

Sadece açık olmak gerekirse:
Komut dosyası yazmanın basit bir yolu nedir? foo.sh , bu yüzden ./foo.sh komutu 0 komutunu ve sudo ./foo.sh komutları 1 komutunu verir?

    
sordu Malabarba 02.12.2010 12:30

10 cevap

117
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
    
verilen cevap aneeshep 02.12.2010 12:44
97

Kök kullanıcının "root" olarak adlandırılması gerekmez. whoami , kullanıcı kimliği 0 olan ilk kullanıcı adını döndürür. $USER , kullanıcı kimliği 0 olan ancak farklı bir ada sahip olabilen giriş yapmış kullanıcının adını içerir.

Hesabın root olarak kaydedilip kaydedilmediğini kontrol eden tek güvenilir program:

id -u

Gerçek kullanıcı kimliği için -u değil, etkili kullanıcı kimliği için -r kullanıyorum. İzinler etkin kullanıcı kimliğine göre belirlenir , değil gerçek bir.

Testler

/etc/passwd , belirtilen sırada kullanıcı kimliği 0 olan aşağıdaki kullanıcı adlarını içerir:

rootx
root2

root2 olarak giriş yaptı, sonraki sonuçları verir:

  • whoami : rootx
  • echo $USER : root2 (bu, program boş bir ortamda başlatılmışsa boş bir dizge döndürür, ör. env -i sh -c 'echo $USER' )
  • id -u : 0 Gördüğünüz gibi, diğer programlar bu kontrolde başarısız oldu, yalnızca id -u geçti.

Güncellenmiş komut şu şekilde görünür:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
    
verilen cevap Lekensteyn 13.03.2011 10:19
29

@Lekensteyn, etkili kullanıcı kimliğini kullanmanız gerektiğini söyledi. Bash içinde id -u aramanız gerekmez:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi

@ geirha'nın yorumları önerisi aritmetik değerlendirmeyi kullanır:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
    
verilen cevap jfs 13.03.2011 11:26
18

Bunu, mevcut kullanıcıyı döndüren whoami komutunu kullanarak yapabilirsiniz:

#!/bin/bash

if [ 'whoami' != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi

...

Geçerli kullanıcı You must be root to do this. değilse, yukarıdakilerin çalıştırılması root değerini yazdı.

Not: bazı durumlarda bir alternatif $USER değişkenini kontrol etmektir:

if [ $USER != 'root' ]
    
verilen cevap Nathan Osman 13.03.2011 08:38
9
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
    
verilen cevap João Pinto 02.12.2010 12:40
6

Verimliliği göz önünde bulundurarak, önce, EUID ortam değişkenini test edebilir ve eğer mevcut değilse, standart id komutunu çağırın:

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

Bu şekilde, VEYA kısayolu nedeniyle, bir bellek içi değişkeninin sorgulanmasından önce bir sistem komutunu çağırmaktan kaçınırsınız.

Kod yeniden kullanım:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
    
verilen cevap Luchostein 12.10.2016 16:14
3

Komut dosyasını yalnızca root tarafından çalıştırılabilir yapmanın basit bir yolu, komut dosyasını satır ile başlatmaktır:
#!/bin/su root

    
verilen cevap alexandre1985 13.08.2016 23:07
1
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
    
verilen cevap Delan Azabani 02.12.2010 12:35
1

Bu snippet şöyle olurdu:

  • Farklı oturumları kontrol et
  • sudo !! kullanılmasını öner
  • ve bir hata döndürün
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ]
      then
      echo "You must be root to run this script!"
      echo "use 'sudo !!'"
      exit 1
fi
    
verilen cevap rubo77 16.10.2014 11:17
1

Bu cevap sadece bir fikri kurtarmak için bazılarınız için yararlı olabilir. Masaüstü GUI'sinden çalıştırılan ve root ayrıcalıkları gerektiren bir betiğe ihtiyacınız varsa şu yolu deneyin:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w %pre% [email protected]
   exit
fi

#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave

Bu şekilde, root kullanıcı şifresi için size soran güzel bir iletişim penceresi alacaksınız. Komut satırı sudo ile olduğu gibi.

gksudo , sisteminizde mevcut olmayabilir ve ardından sudo apt-get install gksu ile yükleyemez.

    
verilen cevap gertas 18.10.2015 00:00

Etiketlerdeki diğer soruları oku