Bir komut dosyasının yalnızca bir bölümünü sudo olarak çalıştırın ve şifreyi yalnızca bir kez girin


14

Dış bağımlılıkları yükleyen bir komut dosyası (aslında komut dosyaları ve makefile birleşimi) yazıyorum: bazı apt-getkomutlar, bazı gitklonlama, oluşturma, yükleme, gruplara kullanıcı ekleme, ...

Bu komut dosyalarındaki işlemlerin bazıları süper kullanıcı izinleri gerektirir, bazıları gerektirmez.

Şimdiye kadar sudo ile tüm make işlemini çalıştırdım, ancak bazı dezavantajları var:

  • gitkopyaladığım depolar rootsahibi olarak alırım , yani daha sonra sudoveyachown
  • gruplara kullanıcı ekleyen komut dosyaları, whoamigeri döndükten sonra hangi kullanıcının ekleneceğini bilmiyorroot

Yalnızca kullanıcı gerektiren komutları süper kullanıcı olarak çalıştırmanın en iyi yolu nedir? İdeal olarak, işlem yine de sudoşifremi girmemi gerektiriyor , ancak yükleme işleminin başlangıcında sadece bir kez. Sonunda unutur, ama o zamana kadar her zaman saklar (birkaç saat sürebilir).

Çevrimiçi bulduğum çözümler şunları içerir:

  • sudo -vama senaryoyu doğru anlarsam bu zaman aşımına uğrar. Betiğim birkaç saat çalışıyor olabilir
  • ile komut dosyası çalıştıran sudo, ancak do komutlar değil ile superuser gerek sudo -u $(logname) <command>. Şimdi yaptığım şey bu, ama tam tersi olması gerektiği gibi geliyor.

İdeal olarak, betiğimin:

  1. süper kullanıcı kimlik bilgilerini sor
  2. giriş yapan kullanıcı olarak normal komutları çalıştır
  3. adımda girilen kimlik bilgileriyle sudo komutlarını çalıştırın
  4. sudo -k süper kullanıcı oturumunu kapatmak için

2
Yine de her şeyi sudo olarak çalıştırabilirsiniz ve betiğiniz SUDO_USERortam değişkenini kontrol edebilir . Varsa, sudo'yu çağıran kullanıcının kullanıcı adını içerecektir. Böylece (root olarak) $ SUDO_USER: $ SUDO_GID $ dosyalarınızı düzenleyebilirsiniz. Benzer şekilde, bu değişkenleri kontrol edebilirsiniz, böylece adduser komutlarınız hangi kullanıcıyı ekleyeceğinizi bilir.
roadmr

... veya her şeyi root su $SUDO_USER -c commandolarak çalıştırın ve normal kullanıcı olarak çalıştırılan komutlar için kullanın .
Rmano

Yanıtlar:


7

Sudo erişiminiz olduğundan, kendiniz için bir sudoers dosyası oluşturun, ardından komut dosyası tamamlandığında silin:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

Genel olarak önermediğim bir yol, şifreyi kendiniz okumak ve gerektiğinde şifreyi geçmek için sudo' -Sseçeneğini kullanmaktır :

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

Gönderen man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
Bu güvenli mi? echo "$password"??
αғsнιη

@KasiyA echo "$password"olmaz, ama yorumlu metinler ve yorumlamalar biraz daha güvenlidir. Her zamanki araçlar tarafından gösterilen komut satırında görünmezler.
muru

1
Ben kesinlikle, konuşma, düşünmek echo "$password"bir borunun sol tarafı üzerinde olan bir bash komut güvenli. echobir kabuk yerleşiktir; /bin/echobasitçe çağrıldığında çalışmaz echo .... Diğer bazı mermilerin bir echoyerleşimi vardır ( dashörneğin), ancak Bourne tarzı mermilerin bir tane olması gerekmez . Bu yüzden echo "$password" |bash kabul edilebilir olduğunu düşünüyorum ama en iyi birisi sorunu fark etmeden komut dosyası başka bir kabuk için bağlantı durumunda kaçınılabilir. Ben olmayan bir taşınabilir kullanmak [[yerine [de bu komut dosyasının sorununun aynı tür önlemek için. @KasiyA
Eliah Kagan
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.