Yanıtlar:
Diyelim ki myscript
aş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.
"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/sh
okur, hangi) file.sh
ve 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".
bash
yapmak için farklı bir program (gibi ) çağırarak yürütebilirler - izinlerini de almanız gerekeceğini bloke etmek için read
.
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 basis
Peki 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ğ?
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 .
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.
exec
Linux çekirdeğinin syscall ile başarısız EACCES
dosya ç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:
exec
sistem çağrısını kullanıyor./myprog.sh
exec
Linux çekirdeğinin sistem çağrısı tarafından yorumlandığı şekilde yorumlanır : /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -the-ilk-line-of-a-pyt / 40938801 # 40938801Bu 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, main
baş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