Sudo şifresi sorulur ve bash betiğinde programlı olarak ayrıcalık yükseltilsin mi?


49

Şu anda bir hisse senedi Linux sistemine (şu anda Ubuntu) çeşitli programlar yükleyen ve kuran bir bash betiği üzerinde çalışıyorum. Programları yüklediğinden ve ayrıcalıklar gerektiren çeşitli klasörlere birkaç dosya kopyaladığından, "yükseltilmiş ayrıcalıklara ihtiyacım var" -ve-exit standardını zaten yaptım.

Ancak, eğer mümkünse, kullanıcının komut dosyası komutunu sudo ile çalıştırmazsa (örneğin GUI dosya yöneticisinden başlatmak gibi), kullanıcının sudo şifresini sormasını ve komut dosyasının ayrıcalığını otomatik olarak yükseltmesini istiyorum. kullanıcı betiği yeniden başlatmak zorunda kalmadan.

Bu, Linux yüklemeleri üzerinde çalışmak üzere tasarlandığından, sistemi değiştiren herhangi bir seçenek benim amaçlarım için çalışmaz. Tüm seçeneklerin komut dosyasına dahil edilmesi gerekir.

Bash içinde mümkün mü? Eğer öyleyse, bunu yapmanın en iyi (güvenli, ancak özlü) yolu nedir?



@MichaelMrozek - Ah, parçalanmayı en aza indirmeye çalışırken çok sayıda niş alana sahip olmanın sevinci. Ve biliyorsun, Google’ı ararken hiçbir zaman verdiğin bağlantı bana gelmedi.
Shauna,


@jww, bu bağlantıların neredeyse hepsinin bundan 4 yıl sonra sorulduğunun farkındasın , değil mi?
Shauna

1
@Shauna - Sanırım sorunu şimdiye kadar çözdün. Bağlantılar gelecekteki ziyaretçiler içindir.

Yanıtlar:


64

sudoDoğrudan komut dosyasından çalıştırıyorum :

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi

16

Öneririm:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

Neyi if [[ -t 1 ]];kontrol ediyor?
Shauna,

Ah tamam. GUI ve terminal GUI ile bir ilgisi olduğunu düşündüm, ancak if ifadesinin kendisinin neyi kontrol ettiğinden emin değildim.
Shauna,

Şaşırtıcı, teşekkürler!
Fire-Dragon-DoL

16

Bunu komut dosyasının ilk satırı olarak ekleyin:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Değişim sudoiçin gksuya gksudoeğer bir grafik istemi tercih ederim.


3
Not "$*"birine bütün argümanları birleştirmek için gidiyor ( /path/to/script one two threeneden oluyor $1olma one two three) ve $*tırnak argümanlar içinde boşluklar kadar karışıklık olacak olmadan. "$@"doğru çalışıyor
Michael Mrozek

@MichaelMrozek Ah, doğru. Aradığım kişi bu, Sabit
Kevin

Debian'da bunu yapmanın bir yolu yok, sudo komutu yok gibi görünüyor?
yanlış kullanıcı adı

@wrongusername install sudo, kullanmaktan çok daha iyi su. Ama gerçekten istiyorsan, muhtemelenexec su -c "$0" "$@"
Kevin,

2

örnek script paylaşımı umrumda değil ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Gerçekten verimli bir astar gibi görünüyor! Güzel!
groovenectar

Burada Etkili UID kullanmak $EUDIveya her zaman aynı sonucu kullanmak mantıklı olur mu? Örneğin,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar
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.