it-swarm-tr.com

Bir komut dosyası root olarak çalıştırılıp çalıştırılmadığını nasıl kontrol edebilir?

Basit bir bash betiği yazıyorum, ancak root olarak çalıştırılıp çalıştırılmadığını kontrol etmem gerekiyor. Bunu yapmanın çok basit bir yolu olduğunu biliyorum, ama nasıl yapacağımı bilmiyorum.

Sadece açık olmak için:
Bir komut dosyası yazmanın basit bir yolu nedir foo.sh, böylece ./foo.sh komutu 0 komutunu verir ve Sudo ./foo.sh komutunu _ verir 1?

100
Malabarba
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
144
aneeshep

Bir kök kullanıcının "kök" olarak adlandırılması gerekmez. whoami, 0 kullanıcı kimliğiyle ilk kullanıcı adını döndürür. $USER, kullanıcı kimliği 0 olan, ancak farklı bir ada sahip olan oturum açan kullanıcının adını içerir.

Hesabın root olarak giriş yapıp yapmadığını kontrol eden tek güvenilir program:

id -u

etkili kullanıcı kimliği için -u kullanıyorum, real için -r kullanmıyorum kullanıcı kimliği. İzinler kararlı etkili kullanıcı kimliği ile değil, real bir.

Testler

/etc/passwd, verilen sırayla 0 kullanıcı kimliğine sahip aşağıdaki kullanıcı adlarını içerir:

rootx
root2

root2 olarak giriş yapmış, aşağıdaki sonuçları veriyor:

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

Güncellenen komut dosyası şöyle görünür:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
112
Lekensteyn

Gibi @ Lekensteyn dedi etkili kullanıcı kimliği kullanmalısınız. Bash içinde id -u çağırmanıza gerek yok:

#!/bin/bash

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

@ geirha'nın yorumlardan yaptığı öneri aritmetik değerlendirmeyi kullanıyor:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
30
jfs

Bunu, geçerli kullanıcıyı döndüren whoami komutunu kullanarak gerçekleştirebilirsiniz:

#!/bin/bash

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

...

Yukarıdakileri çalıştırmak, geçerli kullanıcı root değilse You must be root to do this. yazacaktır.


Not: Bazı durumlarda alternatif olarak $USER değişkenini kontrol etmeniz yeterli olur:

if [ $USER != 'root' ]
20
Nathan Osman

Verimliliği göz önünde bulundurarak, önce EUID ortam değişkenini test edebilir ve sonra varsa, standart id komutunu çağırabilirsiniz:

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

Bu şekilde, VEYA kısayol nedeniyle, bir bellek içi değişken sorgusunu önceleyen bir sistem komutu çağırmaktan kaçınırsınız.

Kod tekrar kullanımı:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
10
Luchostein
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
9
João Pinto

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

2
alexandre1985

Bu snippet şöyle olur:

  • Farklı oturumları kontrol et
  • Sudo !! kullanmanızı öneririz
  • ve bir hata döndür
 eğer ["$ (whoami & 2>/dev/null)"! = "root"] && ["$ (id -un & 2>/dev/null)"! = "root"] 
 sonra 
 echo "Bu betiği çalıştırmak için kök olmalısın!" 
 echo "'Sudo !!' kullan" "
 çıkış 1 
 fi 
1
rubo77

Bu cevap sadece bir fikrinizi saklamak için bazılarınız için yararlı olabilir. Masaüstü GUI'den çalıştırılan ve kök ayrıcalıkları gerektiren bir komut dosyasına ihtiyacınız varsa, şu yolu deneyin:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 [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 yolla, sizden kök kullanıcı şifresini isteyen Güzel bir iletişim penceresi açacaksınız. Aynen komut satırı Sudo ile olduğu gibi.

gksudo sisteminizde mevcut olmayabilir, ardından Sudo apt-get install gksu ile kurun.

1
gertas
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
1
Delan Azabani

Bu kod hem Bash hem de altında çalışan Bourne sh (FreeBSD altında test edilmiştir) ile EUID tanımlamamaktadır. EUID varsa, değeri döndürülür, aksi takdirde 'id' komutu çalıştırılır. Bir Shell yerleşik ": -" kullandığı için yukarıdaki "veya" yukarıdaki örnekten biraz daha kısadır.

Sh içindeki kök:

# echo $EUID

# euid=${EUID:-`id -u`}
# echo $euid
0

In bash:
[[email protected] ese]$ euid=${EUID:-`id -u`}
[[email protected]d2 ese]$ echo $euid
10260
0
Clayton Haapala