Bisakah skrip dijalankan bahkan ketika skrip tidak dapat dieksekusi?

25

Saya dapat menjalankan skrip (.sh) dengan dan tanpa skrip tersebut dapat dieksekusi. Jadi di mana tepatnya ini penting?

Asfame
sumber

Jawaban:

24

Katakanlah Anda memiliki file yang myscriptberisi 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.

geirha
sumber
Terima kasih telah menjelaskan secara detail. :) Jika saya memahaminya dengan benar, setiap pengguna yang mengakses bash hanya perlu membaca akses ke skrip untuk menjalankannya karena bash akan menggunakan skrip sebagai input dan hanya perlu membacanya. Saya bisa menghentikan perilaku ini dengan mengambil izin baca skrip untuk pengguna itu. Kanan? Jadi kapan izin yang dapat dieksekusi ini digunakan & justru penting?
Ashfame
Ya, jika Anda menggunakan "bash myscript" maka pengguna hanya perlu akses baca untuk "myscript" (dan tentu saja dapat dieksekusi untuk / bin / bash jika bash ada di dalam path). Namun, jika Anda membuat skrip Anda dapat dieksekusi, segalanya akan sedikit berbeda. Memang benar bahwa dari sudut pandang kernel, itu akan menjadi "/ bin / bash myscript" lagi jika baris pertama adalah #! / Bin / bash, tetapi untuk mencapai titik itu, pertama-tama Anda harus menyajikan skrip sebagai executable untuk pengguna atau grup. Namun, itu benar jika untuk beberapa pengguna skrip tidak dapat dieksekusi tetapi dapat dibaca, ia masih dapat "menjalankan" skrip dengan "bash myscript" ....
LGB
@ GBGB Jadi itu cukup berguna. Hal yang baik adalah memotong izin baca dari pengguna untuk skrip itu. Kanan?
Ashfame
@Ashfame: Saya akan mengatakan berguna daripada tidak berguna. Bit eksekusi pada file biasa tidak (dan tidak pernah dimaksudkan) digunakan untuk membatasi akses. Sepertinya Anda mengharapkan itu darinya. Jika Anda memiliki biner yang dapat dieksekusi, Anda harus memiliki izin untuk menjalankannya. Namun, jika Anda memiliki akses baca untuk itu, Anda selalu dapat menyalin file ke direktori home Anda sendiri, dalam hal ini salinan akan dimiliki oleh Anda, sehingga Anda dapat menambahkan izin eksekusi untuk itu ... dan menjalankannya. Untuk direktori, ia memiliki tujuan yang sedikit berbeda. Lihat mywiki.wooledge.org/Permissions
geirha
1
Apa yang harus saya gunakan daripada / bin / bash jika saya tidak tahu penerjemah yang benar? Apakah ada perintah yang menjalankan skrip sesuai dengan garis shebang?
Aivar
16

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.shdan 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".

Lekensteyn
sumber
Saya mengerti maksud Anda. Tetapi apakah itu untuk kelompok atau dunia atau keduanya?
Ashfame
@Ashfame Jika Anda menetapkan izin yang dapat dieksekusi, skrip dapat dijalankan langsung oleh pengguna yang memiliki izin itu - apakah mereka memilikinya atas dasar grup, dunia, atau pemilik. Tetapi bahkan orang tanpa izin dapat menjalankannya dengan memanggil program yang berbeda (seperti bash) untuk melakukan eksekusi - untuk memblokir bahwa Anda harus mengambil readizin mereka juga.
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 basisTetapi 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?
Ashfame
@Ashfame Pada titik izin baca, ya. Pada caranya, Anda akan memanggil sesuatu seperti sudo chmod g+x myfile.shdi 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 .
jg-faustus
apa yang saya maksudkan adalah ketika kita menambahkan izin yang dapat dieksekusi di GUI, lalu untuk siapa? pemilik / grup / dunia?
Ashfame
1

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.

myusuf3
sumber
Ya saya tahu tentang mereka. Itu artinya, saya (pemilik) selalu bisa menjalankannya. Kanan? Maka pengaturan file sebagai executable adalah untuk grup atau dunia atau keduanya?
Ashfame
1

The execsyscall dari kernel Linux gagal dengan EACCESjika file tersebut tidak executable

Meskipun Anda dapat melakukannya sh myprog.sh(yang hanya membaca file dan interpretasinya), mencoba menjalankan program tersebut karena ./myprog.shtidak dapat berfungsi, karena ketika Anda melakukannya:

Ini 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.shtidak dapat dieksekusi, maingagal 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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber