etkileşimli olmayan komut dosyasında sudo


9

Üç işlevlerini yürütür bir komut dosyası vardır: A && B && C.

Fonksiyon Bihtiyaçları süper kullanıcı olarak çalıştırın iken edilecek Ave Cyok.

Birkaç çözümüm var ama bunların hiçbiri tatmin edici değil:

  1. tüm betiği sudo: sudo 'A && B && C'

    Bu, çalıştırmak için kötü bir fikir Ave Cgerekmiyorsa süper kullanıcı gibi görünüyor

  2. betiği etkileşimli yap: A && sudo B && C

    Parolamı girmem gerekebilir, ancak her işlevin biraz zaman alabileceği için komut dosyamın etkileşimli olmamasını istiyorum ve komut dosyasının beni beklemesini istemiyorum. Bu yüzden ilk etapta bir senaryo, bu yüzden çalışmasını izlemek zorunda değilim.

  3. Aptal çözüm: sudo : && A && sudo -n B && C

    İlk önce bir no-op çalıştırmak için aptalca görünüyor sudove ayrıca A'dan daha fazla almayacağı için parmağımı geçmeliyim $sudo_timeout.

  4. Varsayımsal çözüm (keşke var olduğunu söylemenizi isterim):

    sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'

    Bu, başlangıçta şifremi soracak ve daha sonra bu kimlik bilgilerini yalnızca gerektiğinde kullanacaktır.

Bütün bunlar hakkında ne düşünüyorsun? Bu soruna bir çözüm olmadığı için çok şaşırırdım, çünkü oldukça yaygın bir problem (ne hakkında make all && sudo make install)


3
Sudo ile yürüttüğünüz bir komut dosyası yapabilirsiniz, ancak komut dosyasında Ave Cparçalarını açıkça kullanarak yürütün su -l some_non_priviliged_user. Hiçbir zaman aşımı sorunu ve A ve C için priveliges yok. 4'ün mümkün olduğunu düşünmüyorum, sudobir kullanıcı için "küresel bir durum" gibi görünüyor.
Anthon

Yanıtlar:


7

Yapabileceğiniz en iyi şey komut dosyası ile sudobaşlatmak ve daha sonra normal bir kullanıcı olarak açıkça su userveya ile çalıştırmak istediğiniz işlemleri başlatmak olduğunu düşünüyorum sudo -u user:

#!/usr/bin/env bash

## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)

## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $USER = "root" ]
then
    echo "The script needs to run as root" && exit 1
fi

## Run the job(s) that don't need root
sudo -u $usr commandA

## Run the job that needs to be run as root
commandB

9

Komut /etc/sudoersdosyanızı, NOPASSWDparola girmeden çalışmasına izin vermek için özniteliğe sahip dosyaya ekleyin . Bunu belirli bir kullanıcıya (veya kullanıcı kümesine) bağlayabilir veya sudosisteminizdeki herkes tarafından çalıştırılmasına izin verebilirsiniz .

Adlı bir komut dosyasının örnek satırı /usr/local/bin/bossyşöyle görünebilir

ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy

Sonra böyle bir şey kullanırsın

A && sudo bossy && C

Bu örnek için PATHiçerdiğini varsaydım /usr/local/bin. Değilse, komut dosyasının tam yolunu kullanın, yanisudo /usr/local/bin/bossy


En güvenli yaklaşım için oy verin.
eyoung100

0

!requirettySeçeneğin sudoyanı sıra NOPASSWDseçeneği de kullanmak isteyebilirsiniz . Ancak bunun güvenliği azalttığını unutmayın.


1
Sorun interaktif olmasını senaryoyu istememek olarak tanımlanmaktadır gibi, ile 2. /etc/sudoerskomutu çalıştırmak için kullanıcı için girişi Bile NOPASSWDdoğru cevaptır.
Andrew

Bu "X veya Y yapabilirsin", "X ve Y yapabilirsin" idi. Sadece ikisi de sorunu çözecektir. Belki de cevabımı tekrar söylemeliyim.
Steve Wills,

0

Sudo'ya ön izin verme cevabımı mı temel alıyorsunuz? (Böylece daha sonra çalıştırılabilir) , iki komut dosyası yazın:

  • ABC_script:

    #!/bin/sh
    sudo -b ./B_script
    A  &&  > A_is_done
    while [ ! -f B_is_done ]
    do
            sleep 60
    done
    rm -f B_is_done
    C
  • B_script:

    #!/bin/sh
    while [ ! -f A_is_done ]
    do
            sleep 60
    done
    rm -f A_is_done
    B  &&  > B_is_done

Çalıştır ./ABC_script:

  • Çalışacak sudo -b ./B_script. Bu parolayı sorar ( çalıştırdıktan hemen sonra ABC_script). Doğru parolanın girildiği varsayılarak B_script, b alanında ( -bbelirtildiği için) kök olarak ortaya çıkar. Bu eşdeğer gibi görünüyor sudo sh -c "./B_script &".
  • B_scriptile paralel olarak eşzamansız olarak çalışmaya başlar ABC_scriptB_scriptadlı dosyanın var olup olmadığını sınar A_is_done ve görünene kadar döngüler.
  • Paralel olarak ABC_scriptçalışır A. / When Abaşarıyla tamamlanırsa, komut dosyası adlı bir dosya oluşturur A_is_done.
  • ABC_scriptdaha sonra çağrılan bir dosyanın var olup olmadığını test eder B_is_done ve görünene kadar döngüler.
  • Paralel olarak, döngünün B_scriptvarlığını algılar A_is_doneve kopar. A_is_doneDosyayı siler ve çalışır B. Unutmayın, B_scriptroot olarak çalışıyor, bu yüzden Broot olarak çalışıyor . / When Bbaşarıyla tamamlanırsa, komut dosyası adlı bir dosya oluşturur B_is_doneve çıkar.
  • Paralel olarak, döngünün ABC_scriptvarlığını algılar B_is_doneve kopar. B_is_doneDosyayı siler . Unutmayın, B_scriptroot olarak koştunuz, bu yüzden B_is_doneroot'a aittir ve rm -fonay için bir istek almamak için kullanmak istersiniz . ABC_scriptsonra çalışır Cve çıkar.

Daha fazla ayrıntılandırma için notlar:

  • ABC_scriptmuhtemelen B_scriptmutlak bir yoldan geçmelidir ./.
  • Yerine A_is_doneve B_is_done, ABC_scriptmuhtemelen rastgele, benzersiz dosya oluşturmak gerekir.
  • Beklediği program bitmiş ancak başarısız olmuşsa, döndürmeyi bekleyen komut dosyasının bildirilmesi için bir hüküm olması gerekir. (Şu anda, Abaşarısız olursa, her iki komut dosyası da sonsuz bir bekleme döngüsüne girer.) Bu, değiştirmek kadar basit olabilir

    A  &&  > A_is_done

    için

    A; echo $? > A_is_done

    ve daha sonra X_is_donedosyaları okumak için döndürme beklemelerini değiştirmek ve 0 içeriyorsa devam etmek ve aksi takdirde çıkmak.


-3

Aptal ol. birçok satır kullanın.

if A; then

    if sudo B ; then
        C
    fi
fi

bu endişelerimi nasıl çözüyor? Sorunun bir ilgisi yok&&
Antoine Pelisse

&&, ilk komut başarısız olduğunda çalıştırmayı durdurur. İf ifadeleri bunu daha ayrıntılı bir şekilde yapar. Demek istediğim, güzel olmasa bile işinizi halletmek.
Robert Jacobs

1
Bu, daha seçenek 2 daha ayrıntılı sürümünden daha başka bir şey değildir: A && sudo B && C. Tıpkı Antoine'ın soruda açıkladığı gibi; bu bitene kadar şifreyi Aistemez ve bunu beklemek veya betiğin onu beklemesini istemez.
Scott
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.