it-swarm-tr.com

Parola istemi olmadan belirli bir programı root olarak nasıl çalıştırırım?

Ben parola olmadan bir şey Sudo çalıştırmak gerekir, bu yüzden visudo kullanılan ve sudoers dosyaya ekledi:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Sonra denedim:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

Neden şifre istiyor? Parola sormadan, root olmayan bir kullanıcıyla komutları root olarak nasıl çalıştırabilir/kullanabilirim?

175
LanceBaynes

sudoers dosyasında, genellikle /etc/sudoers Adresinde bulunan ve kullanıcıyla da eşleşen başka bir girişiniz var. Öncelik alabilmesi için NOPASSWD kuralının bu kuraldan sonra olması gerekir.

Bunu yaptıktan sonra, Sudo/path/to/my/program Dışındaki tüm komutlar için normalde bir parola ister ve parolanızı sormadan her zaman çalışmanıza izin verir.

97
Warren Young

/etc/sudoers İçinde birden fazla eşleşen giriş varsa, Sudo sonuncuyu kullanır. Bu nedenle, parola istemi ile herhangi bir komutu yürütebiliyorsanız ve parola istemi olmadan belirli bir komutu yürütebilmek istiyorsanız, en son istisnanın olması gerekir.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Programın root olarak çalıştırılmasına ancak diğer kullanıcılar tarafından çalıştırılmasına izin vermemek için (root) Yöntemine dikkat edin. (Çıkarımları düşünmedikçe, gerekli olandan daha fazla izin vermeyin.)

Ubuntu çalıştırmayan veya varsayılan Sudo yapılandırmasını değiştiren okuyucular için not (Ubuntu'nun Sudo varsayılan olarak tamamdır) : Kabuk komut dosyalarını yükseltilmiş ayrıcalıklarla çalıştırma riskliyse, temiz bir ortamdan başlamanız gerekir (Kabuk başladıktan sonra çok geç (bkz Kabuk komut dosyalarında setuid'e izin verme ), bu yüzden bununla ilgilenmek için Sudo'ya ihtiyacınız var). Defaults env_reset İçinde /etc/sudoers Olduğundan veya bu seçeneğin derleme zamanı varsayılanı olduğundan emin olun (Sudo sudo -V | grep env, Reset the environment to a default set of variables İçermelidir).

[~ # ~] uyarı [~ # ~] : Bu cevap güvensiz kabul edildi. Aşağıdaki yorumlara bakın

Komple Çözüm: Aşağıdaki adımlar, istenen çıktıyı elde etmenize yardımcı olacaktır:

  1. Yeni bir komut dosyası oluşturun (create_dir.sh istediğiniz komut dosyası adıyla):

    vim ~/create_dir.sh
    

    Komut dosyası kullanıcının ana dizininde oluşturulur

  2. Yalnızca root veya Sudo kullanıcısının kök dizin düzeyinde klasör oluşturmak gibi çalışabileceği bazı komutlar ekleyin:

    mkdir /abc
    

    Not: Bu komutlara Sudo eklemeyin. Kaydet ve çık (:wq!)

  3. Yürütme izinlerini kullanarak şunları atayın:

    Sudo chmod u+x create_dir.sh
    
  4. Bu komut dosyasının parola gerektirmemesi için değişiklik yapın.

    1. sudoers dosyasını açın:

      Sudo visudo -f /etc/sudoers
      
    2. Sonuna aşağıdaki satırı ekleyin:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      ahmad yerine kullanıcı adınız yazın. Bunun son satır olduğundan da emin olun. Kaydet ve çık.

  5. Şimdi komutu çalıştırırken Sudo ifadesini ekleyin:

    Sudo ./create_dir.sh
    

    Bu, şifre sormadan komut dosyasının içindeki komutları çalıştıracaktır.

Burada belirtilen kolay adımları izleyin http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

Bence sentaksın yanlış. En azından benim için çalışan aşağıdakileri kullanıyorum:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Sudo kullanmak zorunda kalmamak veya sudoers yapılandırma dosyasını değiştirmek zorunda kalmak istemiyorsanız, aşağıdakileri kullanabilirsiniz:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

Bu, komutun Sudo'ya ihtiyaç duymadan kök olarak çalışmasını sağlayacaktır.

6
linuxgnuru

Manjaro gibi bir dağıtımınız varsa, önce/etc/sudoers tanımını geçersiz kılan bir dosyayla ilgilenmelisiniz, yeni yapılandırmalarınızı eklemek için silebilir veya doğrudan bu dosyayla çalışabilirsiniz.

Bu dosya:

Sudo cat /etc/sudoers.d/10-installer

Bunu görmenin SADECE yolu kök ayrıcalıkları altında, bu dizini onsuz listeleyemezsiniz, bu dosya Manjaro'ya özgüdür, bu yapılandırmayı başka bir adla, ancak aynı dizinde bulabilirsiniz.

Tercih ettiğiniz dosyaya, istediğiniz yapılandırmaları almak için aşağıdaki satırları ekleyebilirsiniz:

Bir grup için kimlik doğrulamasını yoksay

%group ALL=(ALL) NOPASSWD: ALL

veya bir kullanıcı için kimlik doğrulamasını yoksay

youruser ALL=(ALL) NOPASSWD: ALL

veya Belirli bir kullanıcı için yürütülebilir dosyayı kimlik doğrulamasını yoksay

youruser ALL=(ALL) NOPASSWD: /path/to/executable

HIZLI NOT: Sudo'yu kimlik doğrulaması olmadan kullanmak için bir kapı açıyorsunuz, bu, sisteminizdeki her şeyi değiştiren her şeyi çalıştırabileceğiniz, sorumluluk ile kullanabileceğiniz anlamına gelir.

5
Lyoneel

Sudo'nun takma ad olmadığını doğrulayın. Böyle koş

/usr/bin/Sudo /path/to/my/program

Örneğin, bunun gibi bir Kabuk takma adı:

alias Sudo="Sudo env PATH=$PATH"

bu davranışa neden olabilir.

4
Sepero

Bu benim için sorunu çözdü (ayrıca yardımcı olabilecek diğer cevapları da denedi):

Aradığım komut dosyası, yazma izinlerine sahip olmadığım bir dizin olan /usr/bin'daydı (ancak genellikle orada herhangi bir dosyayı okuyabilirim). Komut dosyası chmodded + x (yürütülebilir izin) idi, ancak yine de çalışmadı. Bu dosyayı /usr/bin yerine ana dizinimdeki bir yola taşıdığımda, sonunda parola girmeden Sudo ile çağırabiliyordum.

Ayrıca şüphe ettiğim bir şey (gelecekteki okuyucular için netlik): Senaryonuzu Sudo olarak çalıştırmanız gerekiyor. Komut dosyasını çağırıyor olduğunda Sudo yazın. Betiğinizin içinde root gerektiren komut için Sudo kullanmayın (benim durumumda klavye arka ışığını değiştirme). Belki de işe yarıyor, ama gerek yok ve değil daha iyi bir çözüm gibi görünüyor.

2
Luc

Komut dosyanızı yürüttüğünüzde Sudo /path/to/my/script.

Edit: Başka bir cevaba yapılan yorumunuza dayanarak, bunu bir simgeden çalıştırmak istiyorsunuz. Bir .desktop Terminalde olduğu gibi programınızı Sudo ile yürüten dosya.

gtk-Sudo görsel bir şifre için Sor.

Muhtemelen bir şeyleri kök olarak çalıştırmamanız gerektiği ve sistemi yolun daha aşağısında değiştirmenin, kök izinlerine hiç ihtiyaç duymamanızın daha iyi bir yol olacağını düşünmelisiniz.

2
Caleb

Başka bir olasılık da komut dosyanızı çalıştırmak için super komutunu kurmak, yapılandırmak ve kullanmak olabilir.

super /path/to/your/script

Bazı ikili yürütülebilir çalıştırmak istiyorsanız (örneğin [~ # ~] elf [~ # ~] bazı C kaynak kodundan ikili) -ki değil bir komut dosyası- kök olarak setuid (ve aslında /bin/login, /usr/bin/Sudo ve /bin/su ve super hepsi bu tekniği kullanıyor). Ancak, çok dikkatli olun, büyük bir güvenlik açığı açabilirsiniz .

Somut olarak, programınız paranoyak olarak kodlanmalıdır (bu nedenle, potansiyel olarak düşmanca bir kullanıcı olduğunu varsayarak, "harekete geçmeden" önce tüm argümanları ve çevreyi ve dış koşulları kontrol edin), seteuid (2) ve arkadaşlar (ayrıca bkz. setreuid (2) ) (ayrıca bkz. yetenekleri (7) & kimlik bilgileri (7) & yürütmek (2) ...)

Böyle bir ikili dosyayı kurarken chmod u+s (Read chmod (1) ) kullanacaksınız.

Ancak çok dikkatli olun .

Böyle bir şeyi kodlamadan önce Gelişmiş Linux Programlama dahil olmak üzere setuid hakkında birçok şey okuyun.

Bir komut dosyasının veya Shebang - düzenlenmiş bir şeyin ayarlanamayacağına dikkat edin. Ancak küçük bir setuid-binary kodlama (C olarak) kodlayabilirsiniz.

1

İdeal olarak, Sudo aracılığıyla hangi komutların çalıştırılabileceğini özelleştiriyorsanız, bu değişiklikleri sudoers dosyasını doğrudan düzenlemek yerine /etc/sudoers.d/ Altında ayrı bir dosyada yapmalısınız. Ayrıca dosyaları düzenlemek için her zaman visudo kullanmalısınız. NOPASSWD komutlarına ASLA ALL komutları vermemelisiniz.

Örnek: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Satır verme izninizi ekleyin: myuser ALL= NOPASSWD: /path/to/your/program

Sonra kaydedin ve çıkın ve visudo sözdizimi hatalarınız varsa sizi uyaracaktır.

Çıktıda kullanacağınız herhangi bir %groupyouarein ALL=(ALL) ALL komutundan ÖNCE kullanıcıya özel NOPASSWD komutlarının görüntülenmesi durumunda, kullanıcılarınıza verilen izinleri görmek için Sudo -l Çalıştırabilirsiniz. şifreniz istenir.

Kendinizi bu sudoers.d dosyalarının birçoğunu oluştururken bulursanız, belki de görselleştirmek daha kolay olacak şekilde kullanıcı başına adlandırılmış dosyaları oluşturmak istersiniz. DOSYA İSİMLERİ ve dosya içindeki KURALLAR'ın sıralamasının çok önemli olduğunu unutmayın; yüklenen SON, önceki girişlerden DAHA FAZLA veya DAHA AZ izinli olsun kazanır.

Dosya adı sırasını 00-99 veya aa/bb/cc önekini kullanarak kontrol edebilirsiniz, ancak sayısal öneki olmayan HERHANGİ bir dosyanız varsa, numaralandırılmış dosyalardan sonra yükleneceklerini, ayarlar. Bunun nedeni, dil ayarlarınıza bağlı olarak "sözcüksel sıralama" Kabuğunun önce sıra numaralarını kullanması ve daha sonra "artan" düzende sıralama yaparken büyük ve küçük harflerin arasına serpilmesidir.

Geçerli dilinizin AaBbCc etc veya ABC sonra abc yazdırıp yazdırmayacağını görmek için printf '%s\n' {{0..99},{A-Z},{a-z}} | sort Ve printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort Komutlarını çalıştırmayı deneyin. kullanılacak en iyi "son" harf öneki olur.

0
dragon788

Alternatif olarak python pudo paketini kullanabilirsiniz.

Kurulum:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Kök ayrıcalık altında komutları çalıştırmak için python otomasyonunu kullanmak için kullanılan kod snippet'i aşağıdadır:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Kök ayrıcalığı altındaki komutları çalıştırmak için cmd örneği aşağıdadır:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0
Madhusudhan Kasula

Herhangi bir kullanıcının şifre sormadan programı Sudo olarak yürütmesine izin vermek için aşağıdaki satırı ekleyebilirsiniz

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

içinde /etc/sudoers

% Sudo başardığını unutmayın.

0
ultimatex

Aşağıdakiler istediğiniz durum içindir yalnızca komutun seçeneklerin bir kısmının değişken olduğu belirli bir seçenek kümesi varsa parola olmadan bir komutu çalıştırın. AFAIK, sudoers bildirimlerinde değişkenler veya değer aralıkları kullanmak mümkün değildir; yani, _command option1_ öğesine açıkça erişime izin verebilirsiniz, ancak _command option2_ işlevine açık bir şekilde erişime izin verebilirsiniz:

user_name ALL=(root) /usr/bin/command option1

ancak yapı _command option1 value1_ ise, burada _value1_ değişebilirse, _value1_ 'nin olası her değeri için açık sudoers satırlarına sahip olmanız gerekir. Kabuk betiği bunun etrafında bir yol sağlar.

Bu cevap M. Ahmad Zafar'ın cevabından ilham aldı ve orada güvenlik sorununu çözdü.

  1. Komutu Sudo olmadan çağırdığınız bir Shell komut dosyası oluşturun.
  2. Komut dosyasını kök ayrıcalıklı bir klasöre (örn. _/usr/local/bin/_) kaydedin, başkalarına yazma erişimi olmayan (örneğin _chown root:wheel /usr/local/bin/script_name_) dosyayı kök sahip olun (ör. _chmod 755 /usr/local/bin/script_name_).
  3. Visudo kullanarak sudo kullanıcılarına istisna ekleyin:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Senaryonuzu çalıştırın _Sudo script_name_.

Örneğin, macOS'ta ekran uyku zaman aşımını değiştirmek istiyorum. Bu, aşağıdakiler kullanılarak yapılır:

_Sudo pmset displaysleep time_in_minutes_

Uyku zaman aşımı değiştirmeyi parola yazmanın zorluğunu haklı göstermeyen masum bir eylem olarak görüyorum, ancak pmset birçok şey yapabilir ve bu diğer şeyleri Sudo parolasının arkasında tutmak istiyorum.

Yani _/usr/local/bin/ds_ 'de aşağıdaki komut dosyası var:

_#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi
_

sudoers dosyasının sonunda şu satır var:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Zaman aşımını 3 dakika olarak ayarlamak için betiğimi normal kullanıcı hesabı _user_name_'den çalıştırıyorum:

_Sudo ds 3_

PS Komut dosyamın çoğu giriş doğrulamasıdır, bu zorunlu değildir, bu nedenle aşağıdakiler de işe yarar:

_#!/bin/bash
pmset displaysleep $1 
_
0
Koit Saarevet