Sudo w skrypcie bash

Chcę z poziomu menadżera plików, poprzez proste kliknięcie, uruchomić skrypt.sh w bash, w którym jest m.in. komenda sudo, np.

#!/bin/bash
sudo komenda1
komenda2
komenda3

O ile wywołanie tego skryptu z terminala jako ./skrypt.sh działa poprawnie, to nie działa uruchomienie skryptu poprzez kliknięcie.
W takim przypadku zostanie tylko wykonana komenda2 i komenda3.

Jak rozwiązać ten problem?

Poprzez kliknięcie, czyli poprzez utworzenie pliku .desktop (tzw. aktywator), tak?

  • jest tam zaznaczona opcja ‘Uruchamianie w terminalu’?
jakis-program.desktop
--------------------------------------------
[Desktop Entry]
[...]
Terminal=true
[...]
  • próbowałeś, zamiast bezpośredniego wywołania skryptu?
xfce4-terminal --command=skrypt.sh

Klikam z mojego ulubionego menadżera (doublecmd). Plik skrypt.sh jest plikiem wykonywalnym i po kliknięciu w niego uruchamiają się wszystkie zapisane tam komendy, poza komendami poprzedzonymi przez sudo.
Podobnie działa to z poziomu pcmanfm, tuxcmd czy mc.
(Pod thunar skrypt otwiera się w edytorze.)
Chcę aby było szybko i łatwo, więc nie chcę tworzyć aktywatorów ani wklepywać komend w terminalu.

Utwórz aktywator, nadaj mu uprawnienie execute i sprawdź czy działa.

W katalogu ~/.config/applications/ masz mnóstwo aktywatorów. Wystarczy skopiować i wyedytować zawartość.

Tworzenie aktywatora na pulpicie, z opcją “Uruchamianie w terminalu” i klikanie w niego z poziomu pulpitu działa. Ale to nie jest rozwiązania, którego szukam.

Jaka jest różnica pomiędzy klikaniem w skrypt i klikaniem w aktywator?

Z doublecmd korzystam prawie zawsze. Pulpitu nie widzę bo mam zasłonięty aplikacjami.
Skypty mam dostępne w katalogu domowym, szybko dostęne z doublecmd.
Poza tym nie chcę zaśmiecać Pulpitu dodatkowymi aktywatorami.

Z pliku ~/.config/user-dirs.dirs dowiesz się gdzie masz pulpit (to katalog, jak każdy inny - przynajmniej w większości środowisk graficznych). Przenosisz aktywator z pulpit’u w dowolne miejsce, nadajesz mu execute i uruchamiasz z doublecmd.

To tak u mnie nie działa.
Aktywator kliknięty na pulpicie działa.
Aktywator kliknięty z poziomu doublecmd w katalogu ~/Pulpit (lub przeniesiony do innego katalogu i tam kliknięty) otwiera mi się w edytorze tekstowym.

A teraz najlepsze - czarna magia?
Aktywator nazywał się na Pulpicie: “testowyAktywator” (plik: testowyAktywator.desktop).
Po przeniesieniu do innego katalogu jego nazwa została zmieniona (w doublecmd) na NowaNazwaAktywatora.desktop.
Po ponownym przeniesieniu do katalogu ~/Pulpit ten aktywator jest widoczny na Pulpicie pod starą nazwą “testowyAktywator”, chociaż w doublecmd widoczny jest pod nową zmienioną nazwą: NowaNazwaAktywatora.desktop.

Nie podobają mi się te całe aktywatory i nie ma już ochoty tego drążyć.
Szukam prostego rozwiązania, a to generuje coraz więcej problemów.

Masz rację z tym otwieraniem się w edytorze (.desktop, to plik text’owy). Nawet jeżeli ma ustawiony execute.


Co do czarnej magii, to sprawa jest prosta - doublecmd pokazuje nazwę pliku, bo tak go traktuje; z kolei desktop czy thunar wiedzą, że jest, to plik specjalny i prezentują nazwę zawartą wewnątrz pliku:

[Desktop Entry]
Name=nazwa_programu

Uważam, że nie upraszczasz, tylko komplikujesz. Ja również używam doublecmd - prawie do wszystkiego. Prawie. Programy (w tym skrypty) uruchamiam czasem z terminala, menu, panelu, ale - przede wszystkim - z wyszukiwarki programów (Alt+F2). W zasadzie mógłbym ograniczyć się tylko do niej, bo jest w stanie ogarnąć wszystko, co u siebie uruchamiam. Plusem takiego rozwiązania jest jednolite środowisko ręcznego uruchamiania programów - musiałbyś jednak zaprzyjaźnić się z aktywatorami i poznać podstawy konfiguracji wyszukiwarki (tak aby w prosty i szybki sposób wykorzystać terminal i sudo).

Dzięki za wyjaśnienie kwestii pokazywania nazw przez Pulpit i thunar.

Ponieważ unikam, gdy mogę, ręcznego pisania komend, więc opcja z Alt+F2 odpada.

Stworzyłem natomiast w Edytorze Menu aktywator z opcją “Uruchamianie w terminalu", do którego podpiąłem skrypt w bashu z sudo w środku i takie rozwiązanie działa i jest do ewentualnego zaakceptowania.

@majo pytanie z ciekawości gdzie trzymasz swoje skrypty?

u mnie wszystkie skrypty są w /usr/local/bin/ i te z których często korzystam mam pod skrótami na klawiaturze przydatny program do skrótów sxhkd

i np: mam jeden skrypt skrótem odpalany:

#ifconfig.sh
super + n
    lxsu sh /usr/local/bin/ifconfig.sh

na prawach root ( tylko ja nigdy z sudo nie korzystam ) tylko su

@LinGruby
Większość trzymam w katalogu domowym. Mam ich niedużo i używam sporadycznie.

Wyszukiwarka programów (Alt+F2) stworzona jest dla aktywatorów. Można, przy jej pomocy, uruchomić dowolną komendę, ale przede wszystkim ma ona pomóc w szybkim uruchamianiu aktywatorów, czyli praktycznie tego, co masz w menu. Jeżeli nie odpowiada Ci taka skromna forma (za którą odpowiada komenda xfce4-appfinder --collapsed), to pod inny skrót (np. Alt+F3) możesz podpiąć komendę xfce4-appfinder i uzyskasz połączenie szybkiej wyszukiwarki spod Alt+F2 i menu start. Wypróbuj.

xfce4-appfinder jest niewątpliwie wygodnym i przydatnym narzędziem, wyglądem prawie identycznym z tym dostępnym po kliknięciu w ikonę Menu, z czego regularnie korzystam (wpisując tylko fragment komendy lub opisu pakietu).

W tym wątku szukam możliwości uruchomienia kliknięciem skryptu bash z sudo w środku (gdyż miałem 2 takie mini skrypty).
I choć chyba taka opcja nie istnieje, to rozwiązanie z dodaniem aktywatora do Menu (gdzie stworzony aktywator skryptu także pojawia się na liście, po wpisaniu fragmentu nazwy skryptu lub jego opisu) jest OK.

Cieszę się, że alternatywa jest akceptowalna. Na tym bym poprzestał, bo nie uruchamiam skryptów z poziomu doublecmd, więc nie jest, to dla mnie problem. Bym - gdybym nie spróbował zasymulować Twojego problemu u siebie, ze swoim skryptem. No i okazało się, że u mnie w ogóle nie chcą się wykonywać! Dokładniej rzecz biorąc, różnie, to wygląda, w przypadku różnych skryptów.

Nie wiem skąd wynika to ograniczenie (doublecmd, zasady bezpieczeństwa, konstrukcyjne ograniczenia związane z komunikacją pomiędzy interface’em graficznym i text’owym?), ale jest problem, aby bezpośrednio z GUI uruchomić komendę CLI (przeciwnie niż w drugą stronę). No więc? Uruchamiasz w skrypcie emulator terminala (który jest aplikacją graficzną), a właściwą komendę umieszczasz jako parametr terminala.

Jeżeli chcesz zamykać okno Enter’em:

xfce4-terminal --execute sh -c 'komenda_01; komenda_02; komenda_03; komenda_xx; read a'

Jeżeli chcesz zamykać okno kliknięciem na ‘krzyżyk’ lub skrótem:

xfce4-terminal --hold --execute sh -c 'komenda_01; komenda_02; komenda_03; komenda_xx'

Wadą (a może po prostu cechą) takiego rozwiązania jest, to że uruchamiając ten skrypt z terminala (a nie GUI), otwiera się w osobnym oknie.

1 polubienie

Bingo :slight_smile:
Po małej modyfikacji, poniższy skrypt bash (z sudo w treści) działa mi poprawnie, a pojawiające się okno terminala samo się zamyka, więc jest OK.

xfce4-terminal --execute sh -c 'komenda_01; komenda_02; komenda_03; komenda_xx'

A także jego alternatywna postać:

xfce4-terminal --execute sh -c 'komenda_01 && komenda_02 && komenda_03 && komenda_xx'

I jeszcze jeden alternatywny zapis (dla bardziej złożonego kodu skryptu):

xfce4-terminal --execute sh -c '
komenda_01
komenda_02
komenda_03
...
komenda_NN
'

Z podanego przez Ciebie wzoru usunąłem cudzysłowy, gdyż generowały mi wyskakujące okienko komunikatu błędu: “Nie udało się wywołać procesu potomnego”.
Ciekawe dlaczego u mnie jest inaczej niż u Ciebie? (ale to pytanie retoryczne :slight_smile: )

Parametr --hold też nie jest mi potrzebny, a nawet przeszkadza, gdyż, po zakończeniu działania skryptu, na górze terminala wyświetla się belka (jak poniżej) zasłaniająca cześć wygenerowanego wcześniej kodu.

U mnie wersja z && nie raczyła wykonywać nic więcej, poza pierwszą komendą. Ale nie próbowałem bez " .


EDIT-20190907-2025 … bez " jest OK. Poprawiłem wpis.