Bir komut dosyasının root değilse çalışmasını nasıl durdurabilirim (ve “root olarak çalışmıyor! Çıkılıyor…”)


17

İşte kaynağım:

#!/bin/bash

echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";

Önbellekleri ve şeyleri temizler ve terminalde kök olarak çalıştırılması gerektiğini yansıtır. Temelde sadece komut dosyası root olarak yürütülmediğini algılarsa çalışmayı durdurmasını istiyorum.

Misal:

"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."

Yükseltilmiş ayrıcalıklarla çalıştırılırsa, normal şekilde çalışır. Herhangi bir fikir? Teşekkürler!



2
muru, diğer soru tersi hariç: root olarak çalışıyorsa betiğin başarısız olması.
Stéphane Chazelas

3
@ StéphaneChazelas ah, benim hatam. Geri
çekildi

Bir alternatif olarak gerçekleştirilen iş miktarını sınırlamak için rootolarak çalıştırmak gerekir tüm komutlar önek olarak ön eki ile rootbirlikte sudo.
reinierpost

Yanıtlar:


47
#!/bin/sh

if [ "$(id -u)" -ne 0 ]; then
        echo 'This script must be run by root' >&2
        exit 1
fi

cat <<HEADER
Host:          $(hostname)
Time at start: $(date)

Running cache maintenance...
HEADER

swapoff -a && swapon -a
echo 1 >/proc/sys/vm/drop_caches

cat <<FOOTER
Cache maintenance done.
Time at end:   $(date)
FOOTER

Kök kullanıcı UID 0 değerine sahiptir ("kök" hesabının adından bağımsız olarak). Tarafından döndürülen etkin UID id -usıfır değilse, kullanıcı komut dosyasını kök ayrıcalıklarıyla çalıştırmaz. id -ruGerçek kimliğe ( komut dosyasını çağıran kullanıcının UID'sine ) karşı test etmek için kullanın .

$EUIDAyrıcalıklı olmayan bir kullanıcı tarafından değiştirilebileceği için komut dosyasında kullanmayın :

$ bash -c 'echo $EUID'
1000

$ EUID=0 bash -c 'echo $EUID'
0

Bir kullanıcı bunu yaparsa, açıkça ayrıcalık yükselmesine yol açmaz, ancak komut dosyasındaki komutların yapması gerekeni yapamamasına ve yanlış sahiple oluşturulmuş dosyalara vb.


1
Not: Solaris 5.10'da, /bin/id -uverir/bin/id: illegal option -- u Usage: id [-ap] [user]
jrw32982 Monica

1
@ jrw32982 Solaris'teki POSIX yardımcı programlarına erişiminiz için /usr/xpg4/binerken olmanız gerekir $PATH.
Kusalananda

1
Mesele şu ki, -useçenek idevrensel değildir ve bu nedenle bu çözüm sadece PATIX'inizde bir POSIX versiyonunun olması idgereken uyarı ile evrenseldir .
jrw32982 Monica

1
@ jrw32982 Komut dosyanızın Solaris'te doğru POSIX yardımcı programlarını alması için, komut dosyasının $PATHüst kısmında /usr/xpg4/bindaha önce olduğu gibi değişiklik yapın /bin. POSIX olmayan bir ürün kullanmakta ısrar ediyorsanız id, daha taşınabilir bir çözüm bulmanız gerekecektir.
Kusalananda

1
@Harry Evet, böylece komut dosyası PATH=$( getconf PATH )başka bir açık varsayılan yol kullanabilir veya ayarlayabilir veya arama için açık bir yol kullanabilir id.
Kusalananda

19

İstediğiniz şeyin süper kullanıcı ayrıcalıklarına sahip olup olmadığınızı, yani etkili kullanıcı kimliğinizin 0 olduğunu kontrol etmek olduğunu düşünüyorum.

zshve bashbunu $EUIDdeğişkente kullanılabilir yapın, böylece şunları yapabilirsiniz:

if ((EUID != 0)); then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

POSIX benzeri mermilerle idstandart komutu kullanabilirsiniz :

if [ "$(id -u)" -ne 0 ]; then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

Tüm bu Not id -unveya whoamiveya $USERNAMEdeğişken zshsize alacak ilk kullanıcı kimliği için kullanıcı adı. 0 kimliğine sahip başka kullanıcıları olan sistemlerde root, işlem, kimliği doğrulanmış olanın soyundan gelse bile bu olmayabilir root.

$USERolur genellikle doğrulanmış, ancak bu güvenerek oldukça kırılgan olduğunu size kullanıcıya verir. Kabuk tarafından ayarlanmaz, ancak genellikle kimlik doğrulama komutu ile ayarlanır (örneğin login, su(GNU / Linux sistemlerinde, mutlaka diğerleri değil) sudo,, sshd(en azından opensh'dan) ...). Her zaman değil (uid'i değiştirmek bu değişkeni otomatik olarak ayarlamaz, uid'i değiştiren uygulama tarafından açıkça yapılmalıdır) ve aynı zamanda kabuğun soyundaki başka bir işlemle de değiştirilmiş olabilir. $LOGNAME, aynı uyarı ile POSIX tarafından belirtildiği gibi daha güvenilirdir (orijinal olarak FIPS 151-2'den)


12

Geçerli kullanıcıyı kontrol etmek için $USERveya whoamidüğmesini kullanabilirsiniz .

if [[ "$USER" != "root" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

if [[ $(whoami) != "root" ]]; then
    echo "Warning: script must be run as root or with elevated privileges!"
    exit 1
fi

if [[ $(id -u) != "0" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

1
NP. Kelimenin tam anlamıyla doğrudan bash kılavuzundan [ gnu.org/software/bash/manual/bashref.html] okumayı öneririm . Aslında şaşırtıcı derecede kolay bir hazır. Özellikle bu cevap için ben referans öneririz: 3.2.4.2 Conditional Constructs 3.5.4 Command Substitution
Jesse_b

9
Seçeneği id -uolan veya olmayan komut , -nwhoami kullanımına alternatiftir. -N olmadan ve sıfıra karşılaştırmak, çekirdeğin yaptığı testle daha iyi eşleşir. Çekirdeğin umurunda olduğu tek şey parola dosyasındaki ad değil, kimliktir.
icarus

6
Kullanımın $(id -u)daha iyi olduğuna inanıyorum . Bazı (kötü amaçlı) durumlarda $USERyanlış olabilir.
Basile Starynkevitch

1
@Jesse_b tarafından sağlanan bağlantıyla ilgilenenler için: bir yazım hatası var. Olması gereken gnu.org/software/bash/manual/bashref.html
Kryten

1
Bazı sistemler uid 0 değerine sahip olan ayrıcalıklı hesabın adı olarak "root" kullanmazlar. Bu nedenle, kök hesap adını değil, yalnızca uid 0'ı kontrol etmelisiniz.
roaima

10

Aslında istediğiniz bu işlemleri yapmak için erişiminiz olup olmadığını belirlemek. Bunun yerine kök olup olmadığınızı kontrol etmek kötü bir uygulama olarak kabul edilir.

Sistem, kök olmayan bir kullanıcının takas ve bırakma önbelleğini değiştirmesine izin verecek şekilde yapılandırılmışsa, neden kullanıcı komut dosyanızı çalıştırmasın?

Bunun yerine, işlemi deneyebilir ve başarısız olursa yararlı bir mesajla çıkabilirsiniz:

if ! ( swapoff -a && swapon -a )
then
  echo "Failed to clear swap (rerun as root?)" >&2
  exit 1
fi

if ! echo 1 > /proc/sys/vm/drop_caches
then 
  echo "Failed to free page cache (rerun as root?)" >&2
  exit 1
fi

Root dışı bir kullanıcı takas özelliğini kapatıyor mu?
Kusalananda

2
Evet. Bunu SELinux ile ayarlayabilirsiniz. Benzer şekilde, bir kök işleminin bunu yapmasını devre dışı bırakabilirsiniz.
o diğer adam

1
exitKullanıcının geçerli ayrıcalıklarıyla mümkün olduğu kadar çok şey yapmak istemesi durumunda, bir şey başarısız olduktan sonra yapmak istemeyebilirsiniz. (Ancak tüm bunların kök gerektirdiği tipik bir sistem için, çıkmak daha yararlı / daha az gürültülü olacaktır.)
Peter Cordes

2
Kök olup olmadığınızı kontrol etmenin "kötü uygulama" olduğunu söyleyecek kadar ileri gitmem. Özellikle de tam olarak bilmek istediğiniz şey buysa. İstediğinizi yapmak için yeterli izniniz olup olmadığını kontrol etmenin en iyisi olduğunu belirtmek isterim.
Erik Bennett
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.