Saya memiliki foo.sh
file di direktori saya saat ini. Jika saya mencoba lari ./foo.sh
, saya dapat:
-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied
Tetapi jika saya jalankan /bin/sh ./foo.sh
maka itu berjalan dengan baik.
Bagaimana saya bisa memperbaikinya sehingga saya bisa menjalankan ./foo.sh
dan menjalankannya secara otomatis dengan / bin / sh?
Sunting: Oke, ini Chrome OS dan folder khusus ini terpasang noexec
. Tampaknya itu menggagalkan kemampuan untuk berlari ./foo.sh
; tapi kenapa Mengapa saya masih bisa berlari sh foo.sh
untuk mencapai hal yang sama persis? Lalu, keamanan apa yang noexec
diberikan?
noexec
melakukan keajaibannya.Jawaban:
The
noexec
bendera tepat akan berlaku untuk script, karena itu akan menjadi "diharapkan" perilaku.Namun, pengaturan
noexec
hanya menghentikan orang yang tidak cukup tahu tentang apa yang mereka lakukan. Ketika Anda menjalankan,sh foo.sh
Anda sebenarnya menjalankansh
dari lokasi default (mungkin/bin
) yang tidak ada pada sistem file yang di-mountnoexec
.Anda bahkan dapat mencari
noexec
file biner biasa dengan memohonld
langsung.Ini akan menjalankan bash, terlepas dari apakah itu ada di sistem file yang terpasang
noexec
.sumber
ld.so
(pandai)/lib/ld-2.10.1.so $HOME/sh
dan kembali kesalahan lain saat memuat shared library:/home/chronos/user/sh: failed to map segment from shared object: Operation not permitted
. Saya tidak yakin apakah apa yang Anda katakan tidak benar, atau jika ada hal lain yang mengganggu. Misalnya, / dipasang sebagai hanya-baca.ld
danld.so
.ld
adalah linker yang digunakan dalam menautkan kode objek untuk membentuk biner saat kompilasi, sementarald.so
runer timeer melakukan tindakan serupa ketika menjalankan sebuah program. Linker yang dimaksud di sini adalah run-time linker.Anda juga bisa mendapatkan kesalahan ini (atau pesan yang sangat, sangat mirip) jika Anda mencoba mengeksekusi file dengan akhir jalur MS-DOS 2-byte (carriage-return linefeed).
Vim sangat pintar akhir-akhir ini, sehingga tidak perlu memperlihatkan kereta kembali sebagai '^ M'. Jadi Anda bisa tertipu jika Anda tidak memeriksa apa yang menurut Vim "format file" dan hanya mengandalkan tampilan di layar.
Dalam hal ini "#! / Bin / sh ^ M" menyebabkan kernel mencoba menemukan "/ bin / sh ^ M", yang tidak dapat ditemukan. Penerjemah yang buruk, memang.
sumber
Jika Anda memiliki opsi untuk menjalankan skrip atau program dari stik USB (atau media yang dapat dilepas lainnya), Anda dapat mencoba melepas pemasangan dan memasangnya kembali secara manual:
Tancapkan USB stick
Temukan perangkat USB stick dengan
$ mount
Catat itu; mari kita asumsikan itu
/dev/sdb1
Lepas stick USB:
Terakhir, pasang kembali USB stick:
Dengan mountpoint nama mount USB stick
sumber
Untuk alasan keamanan sistem pada ChromeOS / ChromiumOS folder tertentu ditandai
noexec
dan Anda harus melakukan remount dengan perintah di bawah ini, atau menggunakan jalur alternatif yang tidaknoexec
disetel, seperti contoh kedua.Perintah-perintah ini menganggap Anda setidaknya dalam mode pengembang dan memiliki akses ke
shell
denganchronos@localhost / $
dan bukan hanyacrosh>
dan mengetahui kata sandi sudo.Metode yang lebih berkelanjutan yang harus bertahan dari peningkatan karena Google mencadangkan sebagian besar
/usr/local
untuk pengembang:Manfaat tambahan dari meletakkan segala sesuatu di sini adalah sudah ada di
$PATH
(cobaecho $PATH
konfirmasi ini) sehingga Anda tidak perlu menggunakan path lengkap untuk menjalankan skrip atau binari yang ada di dalamnya/usr/local/bin
dan telahchmod +x
menjalankannya.sumber
Saya punya pertanyaan yang sama. Masalah saya dengan kartu SD. Ini bekerja untuk saya, dan itu jauh lebih sederhana daripada jawaban lain di sini. Saya mempelajarinya dari edisi Crouton # 928 .
Perhatikan bahwa Anda harus menggunakan titik pemasangan, bukan perangkat (/ dev / mmcblk1p1). Hal yang sama untuk USB (/ dev / sdb1) dalam kasus Anda. Hanya titik pemasangan yang berbeda:
Anda akan tahu itu memiliki efek yang diinginkan karena "noexec" akan menghilang dari opsi pemasangan ketika Anda bertanya.
sumber