Belirli bir komutu çalıştırma iznim olup olmadığını nasıl anlarım?


18

Sıradan bir kullanıcı olarak komut verme hakkına sahip olup olmadığımı tespit etmenin herhangi bir yolu var mı?

Örneğin; Kapatma komutunu gerçekten yayınlamadan önce verme hakkım olup olmadığını kontrol etmek istiyorum .

Aşağıdaki komutlar gibi bir şey

-> doIhaveRightToIssue shutdown
-> Yes/No

4
Düz yol, denemeyi (öğrenmeden sudo) ve öğrenmektir. Metin modu komutları gerekebilir sudove grafik komutları gerekebilir gksudo. Komutun nereye kurulduğunu da kontrol edebilirsiniz which command. Varsa /sbinveya /usr/sbin- Komut ihtiyaçları bekleyebilirsiniz sudoya gksudo.
sudodus

Yanıtlar:


26

En basit durum, bir ikili yürütülebilir dosya gibidir gzip. İlk olarak, yürütülebilir dosyayı buluruz:

$ which gzip
/bin/gzip

Sonra bu dosyanın özelliklerine bakıyoruz:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Üç x bize dosyanın sırasıyla sahip (birinci root) veya gruptaki herhangi biri root(ikinci root) ve başka herhangi biri tarafından yürütülebilir . Böylece kullanıcının programı yürütmesine izin verilir.

Ancak, yürütülebilir dosyanız içindeki diğer yürütülebilir dosyaları çağıran bir komut dosyası olabilir. Komut dosyasını yürütebilirsiniz, ancak içinde çalıştırılan programları uygulayamazsınız. Gerçekte denemek dışında, kullanıcının bunu yapmasına izin verilip verilmediğini belirlemenin bir yolu yoktur.

Sonra gibi özel durumlar var shutdown- bu gerçekten systemctlçağırmak için izin verilip verilmediğini belirlemek için kendi mekanizmalarına sahip ve örneğin, yoksa sudo şifrenizi sormak için adlandırılan bir çekirdek yardımcı programa sembolik bir bağlantıdır. .

( whichKomut hakkında: Bu, $ PATH içinde çalıştırmanıza izin verilen yürütülebilir dosyaları bulur ve $ PATH içinde aynı ada sahip birden fazla varsa hangisini kullandığınızı söyler. burada izni nerede arayacağınıza bir örnek olarak kullanın. whichYürütülebilir dosyayı bulan, zaten onu yürütme izniniz olduğunu gösterir.)


Çok özlü cevap (+1). Örneğin, apt-get kurulumunun sonucunu -s bayrağıyla (sudo apt-get install -s htop) benzetmek mümkündür. Bir sorundan önce bir komutun iznini öğrenmenin bir yolu yoksa, en azından "benzet" gibi bir şey olduğunu düşündüm.
Bernhard Colby

Kesinlikle, kullanabileceğiniz bir "kuru çalışma" veya "benzetim" bayrağı sağlayan yardımcı programlar vardır.
Jos

4
whichkomutu, $PATHdeğişkene eklenen dizinlerden birinde bulunan dosyalar için yeterli olmalıdır . Örneğin, yapıyor sudo chmod 700 /bin/nanoya da sudo chmod 744 nanonedenleri whichhiçbir çıktı üretmek için. Yerel biri başka yerlerdeki ikamet komut için PATHdizinleri, ls -lya stataramaları hile olacaktır. Güzel cevap, ama lütfen bu bilgiyi
mesajına

Serg'in söylediklerini stat -c '%a' /bin/gziportadan kaldırmak 755, örneğin almak için bir şey kullanın .
AT

21

İle sudo:

$ sudo -l shutdown
/sbin/shutdown

Eğer iznim yoksa sudo, komutu göstermek yerine şikayet edeceğim.

Polkit ile çalıştırmak istediğiniz eylemi kontrol edersiniz:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

İlgili eylemi bulmak farklı bir sorudur.


Sudo ile sorun ben sistemde sudoer değil olmasıdır. Bu nedenle, gerçekten bir komut vermeden önce dikkatli olmaya çalışıyorum.
Bernhard Colby

4
@BernhardColby, bir sudoer olmasanız sudo -lbile güvenle çalıştırabilirsiniz - tüm mesele bu -l- sudo ile bir komut çalıştırıp çalıştıramayacağınızı söylemek için.
17'de muru

Teşekkürler (+1), bilmiyordum. Bilgisayarımı alır almaz çözümünüzü deneyeceğim.
Bernhard Colby

8

Kullanabilirsiniz:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdownshutdownkomutun yolunu döndürür . test -xbu yolun sizin için yürütülebilir olup olmadığını denetler.

Komutu yürütebilseniz de, görevi yerine getirmek için yeterli izne sahip olmadığı için komut yine de başarısız olabilir. Bu, bir komutu yürütmek için erişimi kısıtlamak yerine programların gerçekte yapabileceği işlemlere erişimi kısıtlamak yerine Unix tipi sistemlerde yaygın olarak görülen durumdur.


Örneğin ne olacak alias shutdown="shutdown now"?
Dmitry Grigoryev

Takma adlarla ilgili sorunu önlemek için $(which shutdown)veya kullanabilirsiniz $(shopt -u expand_aliases && command -v shutdown). Bu sorun yalnızca etkileşimli modda görünür.
David Foerster

5

Zaman zaman biraz zor olabilir ...

Her şeyden önce, izinlere ls -l...

 owngrpotr kullanıcı grubu komutu
-rwxr-xr-x kök kutusu vim

Geçen / üçüncü üçlü bir amacımız x onun içinde, o zaman ( "yürütebileceği") diğerleri ve demekse siz - - öyle bir kabuk-komut dosyası veya bir şey olursa, o zaman ... o yürütebileceği diğerleri gerekir r "( okuyabilir ").

Eğer başkaları var yok yürütme-iznini ancak grup Eğer bir üyesi iseniz, o zaman yürütebileceği gelmez (ikinci üçlü) grubunda - örnekte üzerinde, bin . Örneğin, tekerlek grubu genellikle kimin çalışabileceğini sınırlamak için kullanılır su, bu nedenle yalnızca bu gruba ait kullanıcılar bunu yürütebilir. Başka bir örnek, geliştiriciler için bir grup oluşturmak ve C-derleyicisinin ve bu tür araçların yürütülmesini bu gruba kısıtlamaktır.

Son üçlüden sonra bir iz + varsa, bu AccessControllLists'in kullanıldığı anlamına gelir - bu, ek kullanıcılara ve gruplara yürütme hakları ekleyebilir.

+++

Komutu yürütebilseniz bile, komut, erişiminiz olmayan dosyalara, dizinlere ve / veya cihazlara erişime bağlı olabilir; bu, yapabileceklerinizi sınırlandırabilir ( hiçbir şey yapmamak).

Son olarak, bir komutu yürütmenize izin verilebilse de, komutun kendisi kimliğinizi kontrol edebilir ve bir yapılandırma dosyasında listelenmedikçe veya belirli kullanıcılar (ör. Root ) olmadıkça onu kullanmanıza izin vermeyebilir . Örneğin mountkomut sadece sağlayacak kök herhangi bir cihaz monte etmek - Normal kullanıcılar sadece hiçbiri olabilir vs böyle in gibi listelenen cihazları / / fstab ... monte izin verilir. Kök değilseniz ve bir şey takmaya çalışırsanız mount, cihazı takmayı şikayet eder ve reddeder. Başka bir örnek, sudoherkes için çalışacak, ancak yalnızca / etc / sudoers içinde listelenen kullanıcıların şeyleri kök olarak çalıştırmasına izin verilecektir .


3

, Vb. Kullanmak which, vakaların% 99'unda çalışacak pratik bir çözümdür, ancak% 100 emin olmak için, listelenen her yürütülebilir dizini el ile incelemeniz gerekir . Birçok kabuk (dahil ) komutunuza entres ön ekini ekler ve başarılı olana kadar bu dosyaları tekrar tekrar çalıştırmayı dener. Yana gerçekten komutu yürütemez sizin kabuk gerçekten bulacaktır hangi dosya tahmin etmek için, bu imkansız.typecommand$PATHbash$PATHwhich

Örneğin PATH=/opt/arm/bin:/bin, her iki dizin de yürütülebilir dosyalar içeren, ancak farklı mimariler için var hayal edin . Çalışmaya which ddgeri dönülecektir /opt/arm/bin/dd(bunu yürütmek için izinlerim olduğu varsayılarak), bu girdi önce gelir. Ancak, ddkabuğumda çalıştırdığımda /bin/ddçalıştırılacak, çünkü /opt/arm/bin/ddçalıştırılamayacak. Aynı durum, bozuk ikili dosyalar, eksik kütüphaneler, vb. Durumunda da olabilir.

Başka bir yönü, "izinlere sahip" olduğunu düşündüğünüz şeydir. Bir kullanıcı olarak, çalıştırmak için izinleri var rm ~/fileama değil rm /root/file. Yine, manuel inceleme olmadan veya komutu vermeden ve sonuçları gözlemlemeden genel bir yol yoktur.

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.