Komut dosyaları çalıştırılabilir olarak ayarlanmadıklarında bile çalışabilir mi?


25

Çalıştırılabilir olarak ayarlanmış olan ve olmayan komut dosyalarını (.sh) çalıştırıyor gibi görünebilirim. Peki bu tam olarak nerede önemli?

Yanıtlar:


24

Diyelim ki myscriptaşağıdakileri içeren dosya sizde :

#!/bin/bash
echo "Hello, World!"

Bu dosyayı çalıştırılabilir hale getirir ve çalıştırırsanız ./myscript, çekirdek ilk iki bayt olduğunu görecektir #!, bunun anlamı bir betik dosyasıdır. Çekirdek daha sonra satırın geri kalanını tercüman olarak kullanacak ve dosyayı ilk argümanı olarak iletecektir. Yani, çalışır:

/bin/bash myscript

ve bash dosyayı okur ve içerdiği komutları çalıştırır.

Bu nedenle, bash (veya betiğinizin gerektirdiği tercüman) betiği "çalıştırmak" için sadece dosyayı okuyabilmesi gerekir.

Bu nedenle, komut dosyaları için yürütme biti, yürütülmesi biraz daha uygun hale getirir. Bash çalıştırılabilir olduğu sürece, bash komut dosyasını argüman olarak her zaman bash çalıştırabilir ya da bash'ı etkileşimli olarak çalıştırabilir ve komutları çalıştırmak için komut satırını satır satır sıraya yapıştırabilirsiniz.


Ayrıntılı olarak açıkladığınız için teşekkür ederiz. :) Eğer doğru anladıysam, bash'e herhangi bir kullanıcının erişimi çalıştırmak için sadece betiğe okuma erişimi gerekiyor çünkü bash betiği girdi olarak alacak ve sadece onu okumak zorunda kalacak. Bu davranışı, söz konusu kullanıcı için komut dosyasının okuma iznini alarak durdurabilirim. Sağ? Peki bu çalıştırılabilir izin ne zaman kullanılır ve gerçekten önemlidir?
Ashfame

Evet, eğer "bash myscript" kullanıyorsanız, kullanıcının sadece "myscript" için okuma erişimine ihtiyacı vardır (ve eğer bash yolun içindeyse tabii ki / bin / bash için çalıştırılabilir). Ancak, komut dosyanızı çalıştırılabilir yaparsanız, işler biraz farklıdır. İlk satır #! / Bin / bash ise, çekirdeğin bakış açısından tekrar "/ bin / bash myscript" olacağı doğrudur, ancak bu noktaya ulaşmak için önce betiği çalıştırılabilir olarak sunmanız gerekir. kullanıcı veya grup. Ancak, bazı kullanıcılar için komut dosyası çalıştırılabilir değil ancak okunabilirse, (ler) hala komut dosyasını "bash myscript" ile "çalıştırabilir" ....
LGB

@ LGB Yani bu oldukça işe yaramaz. İyi bir şey, bu komut dosyası için okuma iznini bir kullanıcıdan uzaklaştırmaktır. Sağ?
Ashfame

@Ashfame: Yararsızdan çok faydalı diyebilirim. Düzenli dosyalardaki execute bit erişimi sınırlamak için kullanılmaz (ve asla kullanılmaya yönelik değildir). Bunu ondan bekliyor gibisin. İkili bir yürütülebilir dosya varsa, çalıştırmak için üzerinde yürütme iznine sahip olmalısınız. Bununla birlikte, okuma erişiminiz varsa, dosyayı her zaman kendi ana dizininize kopyalayabilirsiniz, bu durumda kopya size ait olur, böylece dosyaya yürütme izni ekleyebilir ve çalıştırabilirsiniz. Ancak dizinler için biraz farklı bir amacı var. Bkz mywiki.wooledge.org/Permissions
geirha

1
Doğru yorumlayıcıyı tanımıyorsam / bin / bash yerine ne kullanmalıyım? Senaryoyu shebang çizgisine göre çalıştıran bir komut var mı?
Aivar

16

"Kabuk betiğini çalıştırmak" ile "sh komutunu kullanarak bir kabuk betiği çalıştırmak" ile karıştırdığınızdan emin olun.

Bu, aşağıdaki dosya izinlerinden etkilenmez file.sh:

sh file.sh

Sen yürütme sh(programa giderir hangi /bin/shokur, hangi) file.shve yürütür 's kodunu.

Komut dosyasını gerçekten yürütürseniz, dosya izinleri etkili olur :

./file.sh

Dosya izinlerinin FAT gibi Linux olmayan dosya sistemleri tarafından desteklenmediğini unutmayın. Yani chmod -x file.sh, çalıştırsanız bile , dosya hala eski izinlerine sahip olacak.

Yürütme izni dosya sistemi tarafından uygulanır. Ancak programlar, "çalıştır" üzerindeki dosya sistemi izinlerini atlayan dosya içeriğini okuyarak da kodu "çalıştırabilir".


Amacını anlıyorum. Ama o zaman grup mu yoksa dünya mı yoksa her ikisi için mi?
Ashfame

@Ashfame Yürütülebilir izni belirlerseniz, komut dosyası, ister grup isterse dünya veya sahipler düzeyinde olsun, doğrudan bu izne sahip kullanıcılar tarafından çalıştırılabilir. Ancak yürütme iznine sahip olmayan insanlar bile yürütmeyi bashyapmak için farklı bir program (gibi ) çağırarak yürütebilirler - izinlerini de almanız gerekeceğini bloke etmek için read.
jg-faustus

If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisPeki izin, çalıştırılabilir izinleri kontrol edilerek farklı kullanıcılara nasıl verilir? Ve ikinci noktanı anladım. Senaryonun okuma iznini alarak demek, böylece bash ile bile işlememelerini sağlar. Sağ?
Ashfame

@Ashfame Okuma izni noktasında, evet. Bunun üzerine sudo chmod g+x myfile.sh, dosya grubu için yürütme izinleri eklemek üzere terminalde olduğu gibi bir şey çağırırsınız . Dosya izinleri öğreticisine bakın . Birkaç kullanıcının izinlerini aynı anda yönetmek için, grupları kullanırdınız, örneğin grupları yönetme'ye bakın .
jg-faustus

Demek istediğim GUI'de çalıştırılabilir izin eklediğimizde, o zaman kimin için? sahibi / grup / dünya?
Ashfame

1

Böyle düşünmeyin. Bu dosyayı çalıştırabilir miyim? Şunu düşünün: Bu dosyayı kim yürütebilir?

Bilgisayar sizin ve dosya sizin ise, çalıştırabileceğinizden eminim. Chmod ve chown ve dosya izinleri gibi komutlara daha fazla bakmak isteyebilirsiniz .

Umarım bu yardımcı olur.


Evet onları biliyorum. Bu, ben (sahip) her zaman çalıştırabilir anlamına gelir. Sağ? O zaman bir dosyayı çalıştırılabilir olarak ayarlamak grup veya dünya için mi yoksa her ikisi için mi?
Ashfame

1

execLinux çekirdeğinin syscall ile başarısız EACCESdosya çalıştırılabilir değilse

Yapabildiğiniz halde sh myprog.sh(sadece dosyaları okur ve yorumludur), programı çalıştıramayacağınız şekilde çalıştırmaya ./myprog.shçalışmak, çünkü bunu yaptığınız zaman:

Bu doğrulanabilir main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

ve myprog.sh:

#!/bin/sh
echo worked

Eğer myprog.shçalıştırılabilir değil, mainbaşarısız:

execve: Permission denied
13
13

Ubuntu'da test edildi 17.10 gcc -std=c99,.

POSIX 7 şunlardan bahseder:

Fexecve () dışında exec işlevleri, aşağıdaki durumlarda başarısız olur:

[EACCES] Yeni işlem görüntü dosyasının yol ön ekinde listelenen bir dizin için arama izni reddedildi veya yeni işlem görüntü dosyası yürütme iznini reddetti.

Diğer gerekçeleri şu adreste bulabilirsiniz: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

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.