Sudo'yu bir bash betiğinde kullanma ile ilgili en iyi uygulamalar


11

Komutların çoğunluğu sudo'dan önce normal kullanıcı olarak çalıştırılması gerektiğinde, bir avuç komutun root olarak çalıştırılması gereken uzun ve uzun süren bir bash betiğim var, çünkü dosya sahipliğini ve bu tür işleri bozacaktı.

Bazı yöntemler buldum, ama her birinin bazı sorunları var

Yöntem 1: Dosyanın içinde sudo kullanma

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

Bu, kodun yazılma biçiminden iyi görünecektir. sudoaslında kök tarafından çalıştırılması gereken birkaç ifadeden önce yazılır, ancak her sudoçağrı arasındaki süre çok uzunsa sudotekrar şifre ister. Ayrıca, sudoörneğin geçersiz bir parola nedeniyle ilk yürütme başarısız olursa, komut dosyasının geri kalanı yine de yürütülür.

Yöntem 2: Dosyayı çağırmak ve gerektiğinde orijinal kullanıcıya geri dönmek için sudo kullanma

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

Bu da berbat, çünkü su username -chemen hemen her satırın önüne eklemem gerekiyor . Ayrıca orijinal kullanıcı adını bulmak sudomümkündür, ancak hantal.

Daha iyi bir yol var mı?

Düzenleme: Ben sadece neden bahsettiğimi göstermek için küçük, saçma komut dosyaları gönderdim. Gerçek komut dosyasında sudo (başlatma ve durdurma hizmetleri) gerektiren bazı satırlar var, sudo ve gerçekten sudo olmadan çalıştırılması gereken çok fazla satır olması önemli değil.


4
Bu çok nadiren gereklidir. Çoğu durumda, komut dosyasını sudoyükseltilmiş izinlere sahip olması gerekiyorsa çalıştırmanız yeterlidir. Ama su username -ckoşmak için geçiş yapmanın bir anlamı yok echo. Başka bir deyişle, bu [XY] gibi geliyor. Senaryonuzun gerçekten ne yapacağını ve kullanıcıları neden bu kadar sık ​​değiştirmeniz gerektiğini düşündüğünüzü düzenleyebilir ve açıklayabilir misiniz ?
terdon

1
@ElderGeek yanlış bağlantıyı yapıştırdınız mı? İlişkili bile görünmüyor. Bu muhtemelen bir komut dosyasında 'sudo' komutunu nasıl çalıştırırım? ama umarım OP biraz daha fazla açıklayabilir.
terdon

@terdon Öyle görünüyor. Temizlemek.
Elder Geek

Bu sadece örnek bir betik. Buraya 200'den fazla satır komut dosyası yapıştırmak istemedim. Daha fazla ayrıntı için cevabı düzenleyeceğim.
Dakkaron

'De açıklanan doğrulama seçeneğini düşündünüz mü man sudo? -v, --validate 'Kullanıcının önbelleğe alınmış kimlik bilgilerini güncelleyin, gerekirse kullanıcının kimliğini doğrulayın. Sudoers eklentisi için bu, sudo zaman aşımını varsayılan olarak 15 dakika daha uzatır, ancak bir komut çalıştırmaz. Tüm güvenlik ilkeleri önbelleğe alınmış kimlik bilgilerini desteklemez. ' (Eğer yeterince sık çalıştırırsanız, sudo kimlik doğrulaması zaman aşımına
uğramamalıdır

Yanıtlar:


5

Yöntem 2 ile ilgili olarak, bir işlevi kullanmak daha kolaydır. Örneğin:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERsudoer'ın kullanıcı adı. $(logname)Onun yerine de kullanabilirsiniz .

Makinemde çalışıyor:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

Okuyarak man sudoersbiri görür:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

Böylece, parola doğrulaması olmadanregular ana bilgisayarda machine1çalıştırılmasına command1ve command2kök olarak izin verebilirsiniz :

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

ancak man -k sudoayrıntılar için her birini okuyun .


0

Belki bu yardımcı olabilir:

chmod 775 yourscript.sh

Daha sonra komut dosyasının içindeki sudo'yu kullanabilirsiniz (parola istemi olmadan) Ve sudo'yu komut dosyanızdaki diğer komutlar için kullanamazsınız.


Bunun işe yaramadığından korkuyorum. chmod 775yalnızca dosyayı yürütmenize izin verir ve dosyayı yürüten kullanıcıyı veya haklarını değiştirmez.
Dakkaron
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.