czyniąc skrypt bash wykonywalnym programowo

12

Muszę utworzyć skrypt bash, aby utworzyć i zamontować dysk. Dwie proste komendy. Oba „działają” po wprowadzeniu w wierszu poleceń.

Skrypt jest tworzony i uruchamiany za każdym razem, gdy zwykły użytkownik się loguje, dlatego potrzebuję metody, aby ten skrypt był wykonywalny w tym czasie. Jak dotąd nie mogę tego uruchomić. Na przykład pierwsza część mkdir /vvv/ggggnie jest kontynuowana, ponieważ skrypt nie jest wykonywalny (tak sądzę).

Mam nadzieję, że to ma sens. czy to możliwe? Będziemy wdzięczni za wszelkie przemyślenia na temat tego, jak to zrobić.

Aktualizacja :

Dziękuję za twoje odpowiedzi. Prawdopodobnie powinienem dodać dodatkowe informacje poza tym, że jestem nowy w Linuksie.

Używam aplikacji wirtualnego pulpitu open source o nazwie Ulteo. Ta aplikacja działa na Ubuntu i ma bardzo małe wsparcie - dlatego tu jestem. Zasadniczo uczę się przez ogień.

Aplikacja ma więc funkcję zarządzania skryptem logowania, w której mogę powiązać skrypt z użytkownikiem. Prosty skrypt systemu Windows z obsługą sieci działa doskonale. Jednak kiedy próbuję zastosować skrypt bash dla Linuksa, nic się nie dzieje.

Myślę, że ponieważ chmod +xnajpierw muszę wykonać skrypt przeciw skryptowi, aby skrypt był wykonywalny, dlatego się nie udało. Nawiasem mówiąc, Ulteo działa w więzieniu chroot. Utworzyłem skrypt, zapisałem go i nie mogłem go znaleźć. Szukałem zarówno w więzieniu chroot, jak i poza nim.

Podoba mi się podejście Dan08, aby początkowy skrypt odwoływał się do innego skryptu, który mogę znaleźć i zrobić ręcznie. Czy napotkałbym ten sam problem?

Czy te dodatkowe informacje wyjaśniają sytuację? Z góry dziękuję.

Zdjęcia w załączeniu.

! [Zaloguj się do konsoli zarządzania scipt] [1]

! [skrypty systemu Windows, które działają] [2]

! [prosty skrypt Linuksa, który nie działa] [3]

Niestety nie mogę jeszcze publikować zdjęć

HIlton Dynamics
źródło
Czy zamierzasz napisać zadanie crona, aby uruchomić skrypt za każdym razem, gdy użytkownik jest zalogowany? Ten przewodnik powinien również pomóc w ich wykonywaniu .
Sleep Deprived Bulbasaur
1
„Skrypt jest tworzony i uruchamiany za każdym razem, gdy zwykły użytkownik loguje się” dlaczego? Naprawiłbym to, ponieważ wydaje mi się to nielogiczne. Podaję skrypt użytkownikowi jako parametr i pozostawiam skrypt nietknięty po utworzeniu.
Rinzwind
1
W pytaniu jest dziwna mieszanka czasów, która wprawia mnie w zakłopotanie co do tego, co się obecnie dzieje i co chciałbyś, żeby to zrobił. Pomogłoby to, gdybyś mógł bardziej szczegółowo określić obecną sytuację.
Oli
Proszę edytować swoje pytanie i pokazać nam skrypt. Pokaż nam również wynik działania ls -l scriptname. Powinieneś także wyjaśnić, w jaki sposób dokładnie tworzony jest skrypt i dlaczego nie tworzysz go tylko raz i zostawiasz w spokoju. Wreszcie, normalny użytkownik nie powinien mieć dostępu do zapisu /vari dlatego nie powinien mieć możliwości tworzenia tam katalogów.
terdon
1
Opublikuj łącza do obrazu w komentarzach. Zaimportujemy je za pomocą (sugerowanych) zmian.
muru

Odpowiedzi:

19

Musisz zrobić dwie rzeczy:

  1. Odwołaj się do interpretera skryptu na początku skryptu:

    #!/bin/bash
  2. Ustaw uprawnienia, aby był wykonywalny:

    chmod +x myscript.sh
Ed Manet
źródło
3

Zamiast umożliwiać wykonanie skryptu, możesz zastosować inne podejście i zmienić sposób jego wywoływania.

script.sh wystarczy uruchomić skrypt wykonywalny.

jednak

Możliwe jest uruchomienie skryptu niewytłumaczalnego, jeśli podasz program, aby go uruchomić.

Tak /bin/bash script.shlub bash script.shlub python script.pywszystkie uruchomią skrypty niewykonywalne.

Tak więc moją sugestią byłoby zmodyfikowanie sposobu wywoływania skryptu i określenie pliku binarnego używanego do jego uruchomienia.

Dan
źródło
Po mojej stronie zwykle robię to do wytłumaczenia, ponieważ jeśli tego nie zrobisz, nie będziesz mógł ponownie uruchomić pliku. Na przykład python os.execv(__file__, sys.argv)nie działa i na pewno jest więcej takich sytuacji. Jeśli celem jest bezpieczeństwo, po prostu użyj go z katalogu root / sudo, zamiast tego zezwalaj użytkownikom na uruchamianie plików binarnych. Ponadto, jeśli celem jest bezpieczeństwo, nie chcesz, aby mogły uruchamiać skrypty, ponieważ i tak możesz zaszkodzić systemowi ... wykonywalny czy nie. Nie rozumiem więc, dlaczego tak ważne jest unikanie tworzenia plików wykonywalnych.
m3nda
0

Utwórz program w C, C ++ lub Python itp. I użyj polecenia systemowego, aby wykonać skrypt bash.

Na przykład program C wygląda następująco:

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

Aby uruchomić program podczas uruchamiania, dodaj go do listy programów startowych. Otwórz aplikacje startowe z deski rozdzielczej i dodaj skompilowany plik wykonywalny do listy, klikając przycisk Dodaj.

akxer
źródło
2
-1: To naprawdę nie jest odpowiedź. Dlaczego python miałby być lepszy niż skrypt powłoki? Nie mówiąc już o C! W każdym razie nie pokazujesz, jak ten program będzie wyglądał i nie wyjaśniasz, jak dodać program do listy programów startowych.
terdon
Odpowiedzi na twoje pierwsze pytanie można udzielić, wyjaśniając, w jaki sposób język programowania różni się od języka skryptowego, a dla reszty edytowałem swoją odpowiedź
akxer,
Dzięki za edycję -1 usunięto. Jednak użycie programu C do uruchomienia skryptu powłoki w systemie Linux jest całkowicie niepotrzebne i powoduje niepotrzebne koszty ogólne. Dlaczego nie dodać samego skryptu do aplikacji startowych? Lub, jeśli naprawdę chcesz używać C, dlaczego nie wdrożyć go bezpośrednio? Tworzenie opakowania w języku C, które wywołuje skrypt powłoki w systemie Linux, nie ma żadnego sensu, chyba że skrypt musi być uruchamiany z ustawionym bitem SUID. Nawet w takim przypadku istnieją zwykle prostsze rozwiązania.
terdon
1
-1: To nadal nie udałoby się, gdyby skrypt nie miał uprawnień do wykonywania. Musisz zadzwonić bash path/yourbashscript.sh.
muru
1
Co nasuwa pytanie, dlaczego nie uruchomić bash path/yourbashscript.shbezpośrednio zamiast kompilować i uruchamiać ten program C?
muru
0

Możesz uczynić skrypt bash wykonywalnym, uruchamiając następujące polecenie w wierszu polecenia.

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

Następnie wykonanie go przy uruchamianiu można wykonać, dodając go do listy programów startowych, jak powiedział @akabhirav.

LanceLafontaine
źródło
Wydaje mi się, że pytanie (nieco) pokazuje, że zna się na chmod. Ale prosi o metodę umożliwiającą wykonanie go z poziomu samego skryptu (więc nie musi tego robić ręcznie). Chociaż wciąż kwestionuję tę metodę: odtworzenie skryptu w locie nie jest na to sposobem.
Rinzwind
0

SHC to ogólny kompilator skryptów powłoki. Pobiera skrypt określony w wierszu poleceń i generuje kod źródłowy C. Wygenerowany kod źródłowy jest następnie kompilowany i łączony w celu uzyskania rozebranego pliku binarnego.

Skompilowany plik binarny nadal będzie zależał od powłoki określonej w pierwszym wierszu kodu powłoki (shebang: #!/bin/shlub takiej), dlatego SHC nie tworzy całkowicie niezależnych plików binarnych.

Sam SHC nie jest takim kompilatorem jak cc. Raczej koduje i szyfruje skrypt powłoki i generuje kod źródłowy C z dodatkową możliwością wygasania. Następnie używa kompilatora systemowego do kompilacji rozebranego pliku binarnego, który zachowuje się dokładnie tak jak oryginalny skrypt. Po uruchomieniu skompilowany plik binarny odszyfruje i wykona kod z -copcją powłoki .

Jhosman
źródło
Jaki jest tego sens, jeśli plik wykonywalny nadal wymaga oryginalnego środowiska powłoki? W jaki sposób jest to lepsze niż dodanie a #!i chmod +x?
xiota