Dengan Bash, source
dimungkinkan untuk mengeksekusi skrip tanpa set bit eksekusi. Ini perilaku yang didokumentasikan dan diharapkan, tetapi bukankah ini menentang penggunaan bit eksekusi?
Saya tahu, itu source
tidak membuat subkulit.
bash
permissions
executable
source
conventions
Motte001
sumber
sumber
chmod
dapat memungkinkan Anda menetapkan izin (termasuk `x) dengan angka oktal memberikan petunjuk tentang dari mana era itu berasal. Saya tidak akan terkejut jika itu dimulai sebagai indikator cepat dan kotor "ini adalah file biner yang dapat Anda jalankan", dari hari-hari sebelum dia-bang diciptakan, tetapi saya tidak punya bukti untuk itucp /sbin/suidexecutable /tmp/mycopy; /tmp/mycopy
Jawaban:
Bash adalah seorang juru bahasa; ia menerima input dan melakukan apa pun yang diinginkannya. Tidak perlu memperhatikan bit yang dapat dieksekusi. Bahkan, Bash bersifat portable, dan dapat berjalan pada sistem operasi dan sistem file yang tidak memiliki konsep bit yang dapat dieksekusi.
Apa yang peduli dengan bit yang dapat dieksekusi adalah kernel sistem operasi. Ketika kernel Linux melakukan
exec
, misalnya, ia memeriksa apakah sistem file tidak di-mount dengannoexec
opsi, ia memeriksa bit yang dapat dieksekusi dari file program, dan memberlakukan persyaratan yang diberlakukan oleh modul keamanan (seperti SELinux atau AppArmor).Perhatikan bahwa bit yang dapat dieksekusi adalah jenis kontrol yang agak diskresioner. Pada sistem Linux x86-64, misalnya, Anda dapat mem-bypass verifikasi kernel dari bit yang dapat dieksekusi dengan secara eksplisit memanggil
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
sebagai interpreter :Ini agak analog dengan sumber kode sumber Bash di Bash, kecuali itu
ld.so
adalah interpreter, dan kode yang dijalankannya adalah kode mesin dalam format ELF.sumber
ld.so
adalah melakukan tautan dinamis.source
atau setara tetapi standar dot.
tidak menjalankan script, tapi membaca perintah dari file script, kemudian mengeksekusi mereka, baris demi baris, di lingkungan shell saat ini.Ada apa-apa terhadap penggunaan bit eksekusi, karena shell hanya perlu membaca izin untuk membaca isi dari file.
Bit eksekusi hanya diperlukan saat Anda menjalankan skrip. Di sini shell akan
fork()
memproses baru kemudian menggunakanexecve()
fungsi untuk membuat gambar proses baru dari skrip, yang diperlukan untuk menjadi file biasa yang dapat dieksekusi.sumber
bash < script
, pada dasarnya Anda mendapatkan hasil yang sama dengansource script
. Perlindungan apa yang disediakan oleh pemeriksaan bit eksekusi?execv
* dari syscall dapat digunakan dengan executable, bukan apakah seorang juru bahasa akan menjalankannya. Mengapa membingungkan orang (dan merusak kemampuan untuk mengevaluasi kode yang dialirkan dari sumber non-file) dengan melanggar konvensi?bin/activate
tidak memiliki bit yang dapat dieksekusi. Naskah dapat sepenuhnya menjadi perpustakaan atau hal lain seperti itu. Saya kira memiliki .sh mungkin merupakan sinyal juga, tetapi memiliki minimum senjata kaki itu baik: itu bagus bahwa tidak mungkin dijalankan./bin/activate
secara tidak sengaja. bin/activate
Bit yang dapat dieksekusi (tidak seperti yang lain) pada file nonsetuid dan nonsetguid tidak banyak mekanisme keamanan. Apa pun yang dapat Anda baca, Anda dapat menjalankan secara tidak langsung, dan Linux akan membiarkan Anda secara tidak langsung membaca apa pun yang dapat Anda jalankan tetapi tidak secara langsung membaca (yang seharusnya cukup untuk melubangi konsep non-set (g) dan x-bit menjadi langkah keamanan).
Ini lebih merupakan hal yang mudah: Biarkan sistem menjalankannya untuk saya secara langsung jika bitnya diatur, kalau tidak saya perlu melakukannya secara tidak langsung (
bash the_script;
atau beberapa peretasan untuk mendapatkan gambar memori dari eksekusi tanpa izin yang dapat dijalankan ).Anda dapat mengaturnya untuk kenyamanan jika Anda berniat baik dalam-sumber dan mengeksekusi insourcable Anda.
Namun, tampaknya, banyak pelaksana perpustakaan bersama yang berbagi pemikiran Anda dan akibatnya, banyak sistem mengharuskan perpustakaan bersama, yang pada dasarnya adalah padanan asli dari sumber shell, ditandai dapat dieksekusi agar dapat digunakan. Lihat Mengapa perpustakaan bersama dapat dieksekusi? .
sumber
chmod
itu dan membuatnya dapat dieksekusi. Ini untuk menyortir data dari program, jadi pertanyaan OP adalah pertanyaan yang masuk akal.x
bit hanya sebuah tempat ekstra itu dapat membaca / menulis petunjuk apa yang harus dilakukan./tmp$ cp /bin/cat ./cat ; chmod a-rw ./cat ; ./cat & cp /proc/$!/exe /tmp/cat2
->cp: cannot stat ‘/proc/16260/exe’: Permission denied
Itu pertanyaan yang bagus! Unix menggunakan bit yang dapat dieksekusi untuk membedakan antara program dan data. OS tidak memerlukan bit eksekusi, karena skrip bersumber tidak diteruskan ke OS untuk dieksekusi sebagai proses baru. Tetapi shell memperlakukan skrip bersumber sebagai sebuah program, dan akan mencari
$PATH
file yang ingin Anda sumber. Jadi, shell itu sendiri dapat meminta izin untuk mengeksekusi file bersumber; tapi ternyata tidak.Pertanyaannya pasti sudah lama muncul. Desain cangkang Bourne adalah hasil dari "rangkaian modifikasi, dialog, diskusi" yang panjang di antara para penghuni Bell Labs, dan banyak keputusan desain didiskusikan oleh SR Bourne dan yang lainnya selama bertahun-tahun. Sayangnya, pandangan cepat saya tidak menemukan diskusi tentang fitur sumber (dalam pertahanan saya, sulit untuk google untuk itu). Apa yang saya temukan adalah "." perintah tidak muncul dalam pengantar awal ke shell oleh Bourne sendiri, tetapi hadir dalam versi 7 versi yang lebih matang .
Tanpa otoritas, inilah interpretasi saya sendiri:
The
.
perintah, aliassource
, ini berlaku tekstual inklusi (seperti#include
di C preprocessor) ke kode sumber dari script mengeksekusi atau sesi interaktif. Karena itu, file yang disertakan tidak boleh "dieksekusi".Filosofi Unix selalu memberi para programmer cukup tali untuk menggantung diri. Terlalu banyak larangan berpegangan tangan dan sewenang-wenang hanya menghalangi. Baru-baru ini beberapa distribusi
rm -r /
menolak untuk melakukan apa yang Anda minta. (Perintah ini memberi tahurm
untuk menghapus semua yang ada di komputer Anda. Jangan mencobanya sebagai root! Atau lebih baik lagi, tidak sama sekali.) Jadi, mungkin Bourne di al. baru saja memutuskan bahwa ketika Anda mencoba untuk sumber file, Anda dianggap tahu apa yang Anda lakukan. Itu juga menghindari pekerjaan yang tidak perlu, dan siklus sangat berarti saat itu.sumber
Sejauh menyangkut OS, file yang berisi skrip shell hanyalah data. Jika Anda meneruskan nama file data seperti itu ke
source
perintah atau meneruskannya di baris perintah ke doa bash shell, semua OS melihat adalah string yang kebetulan bertepatan dengan nama file yang berisi data.Bagaimana bit eksekusi akan relevan dalam kasus itu?
sumber
Perbedaannya penting karena Anda mungkin memiliki file perintah shell yang tidak berguna sebagai executable, tetapi hanya berguna ketika bersumber. Untuk file ini, Anda dapat mematikan bit eksekusi dan kemudian tidak akan pernah diakses kecuali secara eksplisit dalam perintah sumber. Alasan untuk hal seperti itu adalah untuk memiliki efek samping pada cangkang asalnya. Untuk contoh tertentu, saya memiliki skrip bernama fix_path yang melihat dan memodifikasi path.
sumber
Untuk berjaga-jaga kalau-kalau ada yang tertarik dalam studi lebih lanjut dan / atau klarifikasi: Dalam shell yang hampir memenuhi syarat POSIX diimplementasikan beberapa waktu lalu, kerja internal fungsi 'exec_program ()' dan 'builtin_source ()' sangat patut dicontoh. Dalam fungsi-fungsi itu Anda melihat secara persis apa perbedaan di antara mereka:
https://github.com/rsenn/shish/blob/master/src/builtin/builtin_source.c
https://github.com/rsenn/shish/blob/master/src/exec/exec_program.c
pada dasarnya sumber dapat dilihat sebagai shell sementara mengarahkan kembali deskriptor file internal di mana ia mem-parsing script shell dari (terminal dalam mode interaktif). jadi sangat mirip dengan pengalihan lainnya seperti
<input_file.txt
dan>>append_to_something.list
dan ini hanya perlu membuka dan menutup file.jadi eksekusi ditangani oleh
execve()
system call yang mana bit eksekusi itu wajib.Saya ingat melihat beberapa sistem yang memungkinkan eksekusi binari ELF / a.out, tetapi melalui mengeksekusi "/lib/ld-dynamic-linker.so" dan dengan program biner (tanpa bit exec) sebagai argumen pertama. Saya percaya itu pada beberapa mesin DEC Alpha atau VAX (Mungkinkah itu SCO Unix?)
sumber
Sudut pandang lain:
Skrip bersumber pada dasarnya terdiri dari shell bawaan dan panggilan program. Shell builtin (dengan
source
di antaranya) adalah bagian dari shell dan shell harus dapat dieksekusi di tempat pertama. Setiap program yang dipanggil (yang menjadi ELF, skrip lain dengan shebang, apa pun) harus memiliki bit eksekusi, jika tidak maka ia tidak akan berjalan.Jadi itu tidak menentang penggunaan bit eksekusi, karena tidak ada yang tanpa bit eksekusi yang akan berjalan. Validasi tidak terjadi untuk skrip bersumber secara keseluruhan; itu dilakukan untuk setiap bagian secara terpisah, tetapi itu dilakukan.
sumber