Jawaban:
Katakanlah Anda memiliki file yang myscript
berisi yang berikut:
#!/bin/bash
echo "Hello, World!"
Jika Anda membuat file ini dapat dieksekusi dan menjalankannya ./myscript
, maka kernel akan melihat bahwa dua byte pertama adalah #!
, yang berarti itu adalah file skrip. Kernel kemudian akan menggunakan sisa baris sebagai interpreter, dan meneruskan file sebagai argumen pertama. Jadi, ini berjalan:
/bin/bash myscript
dan bash membaca file dan menjalankan perintah yang dikandungnya.
Jadi, untuk bash (atau penerjemah apa pun yang dibutuhkan skrip Anda) untuk "mengeksekusi" skrip, hanya perlu dapat membaca file.
Jadi, untuk skrip, bit eksekusi hanya membuatnya sedikit lebih nyaman untuk mengeksekusinya. Selama bash dapat dieksekusi, Anda selalu dapat menjalankan bash dengan file skrip sebagai argumen, atau menjalankan bash secara interaktif dan menyalin tempel baris skrip per baris ke terminal Anda untuk menjalankan perintah.
Pastikan Anda tidak bingung "menjalankan skrip shell" dengan "jalankan skrip shell menggunakan sh".
Ini tidak akan terpengaruh oleh izin file pada file.sh
:
sh file.sh
Anda mengeksekusi sh
(yang memutuskan ke program /bin/sh
), yang membaca file.sh
dan mengeksekusi kode itu.
Izin file akan berpengaruh jika Anda benar - benar menjalankan skrip itu sendiri :
./file.sh
Perhatikan bahwa izin file tidak didukung oleh sistem file non-Linux, seperti FAT. Jadi, bahkan jika Anda menjalankan chmod -x file.sh
, file itu masih akan memiliki izin sebelumnya.
Jalankan izin ditegakkan oleh sistem file. Tetapi program dapat "mengeksekusi" kode juga dengan membaca konten file, yang mem-bypass izin sistem file pada "eksekusi".
bash
) untuk melakukan eksekusi - untuk memblokir bahwa Anda harus mengambil read
izin mereka juga.
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
Tetapi bagaimana izin diberikan kepada pengguna yang berbeda dengan memeriksa izin yang dapat dieksekusi? Dan saya mendapat poin kedua Anda. Maksud Anda mengambil izin baca skrip mereka sehingga mereka bahkan tidak bisa memprosesnya melalui bash. Kanan?
sudo chmod g+x myfile.sh
di terminal untuk menambahkan izin eksekusi untuk grup file. Lihat tutorial Izin file . Untuk mengelola izin untuk beberapa pengguna secara bersamaan, Anda akan menggunakan grup, lihat misalnya Mengelola grup .
Jangan berpikir seperti itu. Bisakah saya menjalankan file ini? Pikirkan seperti itu: Siapa yang dapat menjalankan file ini?
Jika komputer itu milik Anda dan file itu milik Anda, saya yakin Anda bisa menjalankannya. Anda mungkin ingin melihat lebih jauh ke perintah seperti chmod dan chown , dan mengajukan izin.
Saya harap itu membantu.
The exec
syscall dari kernel Linux gagal dengan EACCES
jika file tersebut tidak executable
Meskipun Anda dapat melakukannya sh myprog.sh
(yang hanya membaca file dan interpretasinya), mencoba menjalankan program tersebut karena ./myprog.sh
tidak dapat berfungsi, karena ketika Anda melakukannya:
exec
system call on./myprog.sh
exec
system call dari kernel Linux seperti yang dijelaskan di: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -the-first-of-a-pyt / 40938801 # 40938801Ini dapat diverifikasi dengan 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);
}
dan myprog.sh
:
#!/bin/sh
echo worked
Jika myprog.sh
tidak dapat dieksekusi, main
gagal dengan:
execve: Permission denied
13
13
Diuji di Ubuntu 17.10 gcc -std=c99
,.
POSIX 7 menyebutkan bahwa pada:
Fungsi exec, kecuali untuk fexecve (), akan gagal jika:
[EACCES] Izin pencarian ditolak untuk direktori yang tercantum dalam awalan path file gambar proses baru, atau file gambar proses baru menolak izin eksekusi.
Dasar pemikiran lebih lanjut dapat ditemukan di: /security/66550/unix-execute-permission-can-be-easy-bypassed-is-it-superfluous-atau-whats-the