bash betiğini programlı olarak yürütülebilir hale getirme


12

Bir sürücü oluşturmak ve monte etmek için bir bash betiği oluşturmanız gerekir. Yani, iki basit komut. Her ikisi de komut satırına girildiğinde "çalışır".

Komut dosyası oluşturulur ve normal bir kullanıcı her oturum açtığında yürütülür, bu yüzden bu komut dosyasını o anda yürütülebilir yapmak için bir yönteme ihtiyacım var. Şimdiye kadar, bunu işe alamıyorum. Örneğin mkdir /vvv/gggg, komut dosyası yürütülebilir olmadığından ilk bölüm devam etmiyor (tahmin ediyorum).

Umarım bu mantıklıdır. Mümkün mü? Bu çalışmanın nasıl yapılacağı ile ilgili düşünceler takdir edilecektir.

Güncelleme :

Yanıtlarınız için teşekkürler. Muhtemelen Linux'ta yeni olduğumdan başka ek bilgiler eklemeliyim.

Ulteo adında açık kaynaklı bir sanal masaüstü uygulaması kullanıyorum. Bu uygulama Ubuntu üstünde çalışır ve çok az desteği vardır - bu yüzden buradayım. Temel olarak ateşle öğreniyorum.

Yani, bir uygulama bir komut dosyası bir kullanıcıya bağlayabilirsiniz bir oturum açma komut dosyası yönetimi işlevi vardır. Net kullanımı ile basit bir windows script mükemmel çalışıyor. Ancak, bir Linux bash betiği uygulamaya çalıştığımda hiçbir şey olmuyor.

Ben chmod +xbetiği çalıştırılabilir hale getirmek için ilk önce betiğe karşı yapmak gerektiğinden, bu yüzden başarısız olduğunu düşünüyorum. Bu arada, Ulteo bir chroot hapishanesinde çalışıyor. Bir komut dosyası oluşturdum, kaydettim ve komut dosyasını bulamadım. Kök hapishanesinin içinde ve dışında arama yaptım.

Ben ilk komut dosyası ben bulmak ve manuel olarak yürütülebilir yapmak başka bir komut dosyası referans dan08 tarafından yaklaşım gibi. Aynı problemle karşılaşır mıydım?

Bu ek bilgiler durumu aydınlatıyor mu? Şimdiden teşekkürler.

Ekli fotoğraflar.

! [giriş scipt yönetim konsolu] [1]

! [çalışan windows komut dosyaları] [2]

! [işe yaramayan basit linux betiği] [3]

Üzgünüm Henüz resim gönderemiyorum


Bir kullanıcı her giriş yaptığında betiği çalıştırmak için bir cron işi yazacak mısınız? Bu kılavuz, onları da çalıştırılabilir yapmanıza yardımcı olacaktır .
Uykusuz Bulbasaur

1
"Komut dosyası her normal kullanıcı oturum açtığında oluşturulur ve yürütülür" neden? Bana mantıksız geldiği için bunu düzeltirdim. Komut dosyasını kullanıcıyı bir parametre olarak besler ve oluşturulduktan sonra komut dosyasına dokunur.
Rinzwind

1
Soruda şu anda ne olduğu ve ne yapmasını istediğiniz konusunda bana karışıklık veren garip bir zaman karışımı var. Mevcut durumun ne olduğu konusunda biraz daha spesifik olmanız yardımcı olacaktır.
Oli

Lütfen sorunuzu düzenleyin ve bize senaryoyu gösterin. Ayrıca bize çıktı göstermek ls -l scriptname. Komut dosyasının tam olarak nasıl oluşturulduğunu ve neden sadece bir kez oluşturup yalnız bırakmadığınızı da açıklamalısınız. Son olarak, normal kullanıcınızın yazma erişimine sahip olmaması /varve bu nedenle orada dizin oluşturamaması gerekir.
terdon

1
Resim bağlantılarını yorumlara yazın. Bunları (önerilen) düzenlemeler yoluyla içe aktaracağız.
muru

Yanıtlar:


19

Yapmanız gereken iki şey var:

  1. Komut dosyasının başındaki kod yorumlayıcısına başvurun:

    #!/bin/bash
  2. Yürütülebilir hale getirmek için izinleri ayarlayın:

    chmod +x myscript.sh

3

Komut dosyanızı yürütülebilir yapmak yerine, farklı bir yaklaşım izleyebilir ve komut dosyasını arama şeklinizi değiştirebilirsiniz.

script.sh çalıştırılabilir bir komut dosyası çalıştırmak için yeterlidir.

ancak

Çalıştırılacak programı belirtirseniz, gerçekleştirilemeyen bir komut dosyası çalıştırmak mümkündür.

Öyleyse /bin/bash script.shveya bash script.shveya python script.pytümü yürütülebilir olmayan komut dosyalarını çalıştırır.

Benim önerim betiğin çağrılma şeklini düzenlemek ve çalıştırmak için kullanılan ikili dosyayı belirtmektir.


Benim tarafımda genellikle onları büyütülebilir hale getiriyorum, çünkü bunu yapmazsanız dosyayı kendisinden yeniden başlatamazsınız. Örneğin, python os.execv(__file__, sys.argv)işe yaramaz ve elbette bunun gibi daha fazla durum vardır. Güvenlik bir hedefse, bunu root / sudo'dan kullanın, bunun yerine kullanıcıların ikili dosyaları çalıştırmasına izin verin. Ayrıca, hedef güvenlikse, komut dosyalarını çalıştırabilmelerini istemezsiniz, çünkü sisteme yine de zarar verebilirsiniz ... yürütülebilir veya değil. Bu yüzden onları çalıştırılabilir yapmaktan kaçınmak için neden önemli olduğunu anlamıyorum.
m3nda

0

C, C ++ veya Python vb. Bir program oluşturun ve bash betiğini çalıştırmak için sistem komutunu kullanın.

Örneğin, bir C programı şöyle görünecektir:

#include "stdio.h"
int main(int argc, char const *argv[])
{
    system('chmod +x path/yourbashscript.sh');
    system('path/yourbashscript.sh');
    return 0;
}

Programı başlangıçta yürütmek için programı başlangıç ​​programları listesine ekleyin. Başlatma Uygulamalarını kontrol panelinizden açın ve derlenen yürütülebilir dosyayı ekle düğmesine tıklayarak listeye ekleyin.


2
-1: Bu gerçekten bir cevap değil. Python neden bir kabuk betiğinden daha iyi olur? Bırakın C! Her durumda, aslında bu programın nasıl görüneceğini göstermiyorsunuz ve başlangıç ​​programı listesine nasıl program ekleyeceğinizi açıklamıyorsunuz.
terdon

İlk sorunuzun cevabı, bir programlama dilinin bir kodlama dilinden ne kadar farklı olduğunu açıklayarak verilebilir cevabımı düzenlediğim gibi
akxer

Düzenleme için teşekkürler, -1 kaldırıldı. Bununla birlikte, Linux'ta bir kabuk komut dosyası başlatmak için bir C programı kullanmak tamamen gereksizdir ve gereksiz ek yükler ekler. Neden komut dosyasının kendisini başlangıç ​​uygulamalarına eklemiyorsunuz? Ya da C'yi gerçekten kullanmak istiyorsanız, neden doğrudan uygulamıyorsunuz? Linux'ta bir kabuk komut dosyası çağıran bir sarıcı oluşturmak, komut dosyasının SUID bit kümesiyle çalıştırılması gerekmedikçe hiçbir anlam ifade etmez. Bu durumda bile, genellikle daha basit çözümler vardır.
terdon

1
-1: Komut dosyasının yürütme izinleri olmasa da başarısız olur. Aramalısın bash path/yourbashscript.sh.
muru

1
Hangi soruyu gündeme getiriyor, neden bash path/yourbashscript.shbu C programını derlemek ve çalıştırmak yerine doğrudan koşmuyorsunuz?
muru

0

Komut satırında aşağıdakileri çalıştırarak bash betiğinizi yürütülebilir yapabilirsiniz.

cd ~/path/to/file
chmod +x nameoffile.sh

Ardından, başlangıçta yürütülmesi, @akabhirav'ın dediği gibi başlangıç ​​programları listenize eklenerek yapılabilir.


Bana öyle geliyor ki soru (bir şekilde) nasıl chmod yapacağına aşina olduğunu gösteriyor. Ancak, komut dosyasının içinden yürütülebilir hale getirmek için bir yöntem istiyor (bu yüzden bunu manuel olarak yapmak zorunda değil). Ben hala yöntemi sorgulamak rağmen: anında bir komut dosyası yeniden yapmak bunu yapmanın yolu değildir.
Rinzwind

0

SHC genel bir kabuk komut dosyası derleyicisidir. Komut satırında belirtilen ve C kaynak kodunu üreten bir komut dosyası alır. Oluşturulan kaynak kodu daha sonra derlenir ve soyulmuş bir ikili veri üretmek için bağlanır.

Derlenmiş ikili hala kabuk kodunun (satır: #!/bin/shveya benzeri) ilk satırında belirtilen kabuğa bağımlı olacaktır , bu nedenle SHC tamamen bağımsız ikili dosyalar oluşturmaz.

SHC'nin kendisi gibi bir derleyici değildir cc. Daha ziyade bir kabuk betiğini kodlar ve şifreler ve eklenen sona erme özelliğiyle C kaynak kodu üretir. Daha sonra, tam olarak orijinal komut dosyası gibi davranan soyulmuş bir ikili dosyayı derlemek için sistem derleyicisini kullanır. Yürütüldükten sonra, derlenmiş ikili kodun şifresini çözer ve kabuğun -cseçeneği ile yürütür .


Eğer yürütülebilir dosya hala orijinal kabuk ortamını gerektiriyorsa bunun anlamı nedir? Bu sadece bir #!ve eklemekten daha iyi olabilir chmod +xmi?
xiota
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.