Di Chrome OS, Bash tidak akan menjalankan skrip saya. Bagaimana saya membuat Bash menjalankan skrip saya?

16

Saya memiliki foo.shfile 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.shmaka itu berjalan dengan baik.

Bagaimana saya bisa memperbaikinya sehingga saya bisa menjalankan ./foo.shdan 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.shuntuk mencapai hal yang sama persis? Lalu, keamanan apa yang noexecdiberikan?

Ricket
sumber
1
keamanan melalui ketidakjelasan
Michael Durrant
Apakah Anda mencoba jika menjalankan ". Foo.sh" berfungsi?
Daniele Testa
@DanieleTesta Pertanyaan ini adalah peninggalan kuno dari masa lalu. Saya menggunakan Google Cr-48, salah satu chromebook pertama, menjalankan versi ChromeOS yang cukup awal (tapi stabil). Kami telah menempuh perjalanan panjang sejak saat itu dan saya tidak berpikir pertanyaan ini akan berlaku untuk versi ChromeOS terbaru, tetapi saya belum menggunakannya untuk mengatakan dengan pasti. Pokoknya saya pikir variasi Anda juga akan berhasil tetapi orang harus mengujinya sebelum mengatakan dengan pasti. Saya masih tidak jelas bagaimana tepatnya noexecmelakukan keajaibannya.
Ricket

Jawaban:

22

The noexecbendera tepat akan berlaku untuk script, karena itu akan menjadi "diharapkan" perilaku.

Namun, pengaturan noexechanya menghentikan orang yang tidak cukup tahu tentang apa yang mereka lakukan. Ketika Anda menjalankan, sh foo.shAnda sebenarnya menjalankan shdari lokasi default (mungkin /bin) yang tidak ada pada sistem file yang di-mount noexec.

Anda bahkan dapat mencari noexecfile biner biasa dengan memohon ldlangsung.

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

Ini akan menjalankan bash, terlepas dari apakah itu ada di sistem file yang terpasang noexec.

bahamat
sumber
5
+1 untuk menyebutkan ld.so(pandai)
amphetamachine
Saya mencoba dua perintah Anda; "tidak dapat membuka file objek yang dibagikan: Tidak ada file atau direktori" - karena dia sedang disalin tetapi sedang dijalankan. Jadi kemudian saya mencoba /lib/ld-2.10.1.so $HOME/shdan 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.
Ricket
Yah, saya tidak bisa mengatakan dengan pasti karena saya tidak punya salinan ChromeOS untuk dicoba. Saya cukup yakin bahwa ini dapat bekerja dengan beberapa modifikasi tetapi tanpa bisa mencobanya sendiri, saya tidak tahu apa itu.
bahamat
Oh well, saya ingin berpikir itu karena Chrome OS dikunci dengan benar. Tampaknya memang cukup aman tapi saya kira kita akan melihat dari waktu ke waktu!
Ricket
1
Ada perbedaan antara lddan ld.so. ldadalah linker yang digunakan dalam menautkan kode objek untuk membentuk biner saat kompilasi, sementara ld.soruner timeer melakukan tindakan serupa ketika menjalankan sebuah program. Linker yang dimaksud di sini adalah run-time linker.
Kusalananda
5

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.

Bruce Ediger
sumber
2

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:

  1. Tancapkan USB stick

  2. Temukan perangkat USB stick dengan $ mount

  3. Catat itu; mari kita asumsikan itu/dev/sdb1

  4. Lepas stick USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Terakhir, pasang kembali USB stick:

$ sudo mount /dev/sdb1 mountpoint

Dengan mountpoint nama mount USB stick

Joachim Pfeiffer
sumber
1

Untuk alasan keamanan sistem pada ChromeOS / ChromiumOS folder tertentu ditandai noexecdan Anda harus melakukan remount dengan perintah di bawah ini, atau menggunakan jalur alternatif yang tidak noexecdisetel, seperti contoh kedua.

Perintah-perintah ini menganggap Anda setidaknya dalam mode pengembang dan memiliki akses ke shelldengan chronos@localhost / $dan bukan hanya crosh>dan mengetahui kata sandi sudo.

sudo mount -i -o remount,exec /home/chronos/user/

Metode yang lebih berkelanjutan yang harus bertahan dari peningkatan karena Google mencadangkan sebagian besar /usr/localuntuk pengembang:

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

Manfaat tambahan dari meletakkan segala sesuatu di sini adalah sudah ada di $PATH(coba echo $PATHkonfirmasi ini) sehingga Anda tidak perlu menggunakan path lengkap untuk menjalankan skrip atau binari yang ada di dalamnya /usr/local/bindan telah chmod +xmenjalankannya.

megdimka
sumber
2
Hai, selamat datang di Unix SE! Catatan, jawaban perintah tunggal tidak dianggap sangat HQ di sini. Saya sarankan untuk menjelaskan, apa yang Anda lakukan dan mengapa.
peterh
0

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 .

$ sudo mount -o remount,exec /media/removable/SD\ Card

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:

$ sudo mount -o remount,exec /media/removable/USB\ Drive

Anda akan tahu itu memiliki efek yang diinginkan karena "noexec" akan menghilang dari opsi pemasangan ketika Anda bertanya.

tbc0
sumber