Chrome OS'de Bash betiğimi yürütmez. Bash'in senaryomu çalıştırmasını nasıl sağlayabilirim?


16

foo.shGeçerli dizinimde bir dosya var . Koşmaya çalışırsam ./foo.sh, şunu elde ederim:

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

Ama /bin/sh ./foo.shkoşarsam iyi çalışır.

Sadece nasıl çalıştırabilirim ./foo.shve / bin / sh ile otomatik olarak çalıştırabilirim?

Düzenleme: Tamam, bu Chrome OS ve bu belirli klasör ile bağlandı noexec. Görünüşe göre bu sadece koşma yeteneğini folyolar ./foo.sh; ama neden? Neden hala sh foo.shaynı şeyi başarmak için koşabilirim ? Öyleyse hangi güvenlik noexecveriyor?


1
belirsizliği ile güvenlik
Michael Durrant

". Foo.sh" çalışıyorsa denediniz mi?
Daniele Testa

@DanieleTesta Bu soru, geçmişten kalma eski bir kalıntıdır. ChromeOS'un oldukça erken (ancak kararlı) bir sürümünü çalıştıran ilk chromebook'lardan biri olan Google Cr-48 kullanıyordum. O zamandan beri çok yol kat ettik ve bu sorunun en son ChromeOS sürümleri için geçerli olacağını düşünmüyorum, ancak bunu kesin olarak söylemek için kullanmadım. Her neyse, varyasyonunuzun da işe yarayacağını düşünüyorum, ancak kesin olarak söylemeden önce test etmelisiniz. Hala tam olarak sihrinin nasıl noexecçalıştığı konusunda net değilim .
Ricket

Yanıtlar:


22

noexecO "beklenen" bir davranış olur çünkü bayrak uygun, komut için geçerli olacaktır.

Ancak, ayar noexecyalnızca ne yaptıklarını bilmeyen insanları durdurur. Çalıştırdığınızda , varsayılan olarak (muhtemelen ) takılı bir dosya sisteminde olmayan varsayılan konumundan sh foo.shçalıştırıyorsunuzdur .sh/binnoexec

Doğrudan noexecçağırarak normal ikili dosyalar için bile dolaşabilirsiniz ld.

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

Bu, bağlı bir dosya sisteminde olup olmadığına bakılmaksızın bash çalıştıracaktır noexec.


5
Bahsetme için +1 ld.so(zeki)
amfetamin

İki komutunu denedim; "paylaşımlı nesne dosyası açılamıyor: Böyle bir dosya veya dizin yok" - sh kopyalandığı, ancak bash çalıştırıldığı için. Ondan sonra çalıştı /lib/ld-2.10.1.so $HOME/shve yükleme kütüphaneleri paylaştı ederken başka bir hata döndürdü: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Söylediklerinin yanlış olup olmadığından veya başka bir şeyin karışıp karışmadığından emin değilim. Örneğin, / salt okunur olarak bağlanmıştır.
Ricket

Kesin olarak söyleyemedim çünkü denemek için ChromeOS'un bir kopyası yok. Bazı değişikliklerle çalışabileceğinden oldukça eminim ama kendim deneyemeden bunun ne olabileceğini bilmiyorum.
bahamat

Oh, bunun Chrome OS'un düzgün bir şekilde kilitli olması nedeniyle olduğunu düşünmek istiyorum. Oldukça güvenli görünüyor ama sanırım zamanla göreceğiz!
Ricket

1
Arasında bir fark var ldve ld.so. ldderleme sırasında ikili kod oluşturmak için nesne kodunun bağlanmasında kullanılan bir bağlayıcı iken ld.so, bir program yürütülürken benzer bir eylem gerçekleştiren çalışma zamanı bağlayıcısıdır. Burada adı geçen bağlayıcı, çalışma zamanı bağlayıcıdır.
Kusalananda

5

MS-DOS 2 bayt (satırbaşı satır besleme) satır sonları ile bir dosya yürütmeye çalışırsanız, bu hatayı (veya çok, çok benzer bir iletiyi) alabilirsiniz.

Vim bu günlerde o kadar akıllı ki, şaryo dönüşlerini '^ M' olarak göstermiyor. Böylece Vim'in "dosya formatının" ne olduğunu düşündüğünü kontrol etmez ve sadece ekrandaki görüntüye güvenirseniz aldanabilirsiniz.

Bu durumda "#! / Bin / sh ^ M" çekirdeğin "/ bin / sh ^ M" dosyasını bulmaya çalışmasına neden olur. Gerçekten kötü tercüman.


2

Komut dosyasını veya programı bir USB çubuğundan (veya başka bir çıkarılabilir medyadan) çalıştırma seçeneğiniz varsa, bağlantısını kesmeyi ve manuel olarak yeniden monte etmeyi deneyebilirsiniz:

  1. USB çubuğunu takın

  2. USB stick cihazını bulun $ mount

  3. Bunu not alın; varsayalım ki/dev/sdb1

  4. USB çubuğunu çıkarın:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Son olarak, USB çubuğunu tekrar takın:

$ sudo mount /dev/sdb1 mountpoint

Bağlama noktasıyla USB çubuğunun bağlanma adı


1

ChromeOS / ChromiumOS'taki sistem güvenliği nedeniyle belirli klasörler işaretlenir noexecve aşağıdaki komutla yeniden bağlamanız veya noexecikinci örnek gibi ayarlanmamış alternatif bir yol kullanmanız gerekir .

Bu komutlar geliştirici modunda en az ve erişebilir varsayalım shellile chronos@localhost / $ve sadece crosh>ve sudo şifremi biliyorum.

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

Google /usr/local, geliştiricilerin çoğunu ayırdığı için yeni sürüme geçişten sonra daha sürdürülebilir bir yöntem :

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

Bir şeyleri buraya koymanın ek yararı, $PATHzaten olduğu ( echo $PATHbunu onaylamaya çalışın ) olduğundan, içinde /usr/local/binve üzerinde çalıştırılan komut dosyalarını veya ikili dosyaları çalıştırmak için tam yolu kullanmanıza gerek yoktur chmod +x.


2
Merhaba, Unix SE'ye hoş geldiniz! Burada, tek komutlu cevapların genel merkez olarak kabul edilmediğini unutmayın. Açıklamayı öneririm, ne yapıyorsun ve neden.
peterh - Monica'yı geri yükle

0

Ben de aynı soruyu sordum. Benim sorunum SD kart ile oldu. Bu benim için çalıştı ve buradaki diğer cevaplardan çok daha basit. 928 numaralı Crouton sayısından öğrendim .

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

Cihazı değil, bağlama noktasını kullanmanız gerektiğini unutmayın (/ dev / mmcblk1p1). Aynı durum USB (/ dev / sdb1) için de geçerlidir. Sadece bağlama noktası farklıdır:

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

İstediğiniz etkiye sahip olduğunu bileceksiniz, çünkü sorgu yaptığınızda "noexec" bağlama seçeneklerinden kaybolacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.