Próbuję utworzyć taki skrypt:
#!/bin/bash
sudo -s
something...
Kiedy go wykonuję, otrzymuję nową powłokę, ale something
jest ona wykonywana tylko wtedy, gdy wychodzę z powłoki utworzonej przez sudo -s
, a nie w jej wnętrzu.
Jakaś pomoc?
shell-script
sudo
Matteo
źródło
źródło
sudo -s
na wypadek,root
gdyby użytkownik miał (raczej kiepski) pomysł na zmianę powłoki. Tak naprawdę powinno być to,sudo sh
co wyraźnie określa, której powłoki należy użyć.Innym sposobem byłoby przekazanie komend (y) pełnej bash do
sudo
:Lepszym sposobem byłoby jednak uruchomienie skryptu za pomocą
sudo
. Nie jest to zbyt dobry pomysł, aby miećsudo
wewnątrz skryptu. Zdecydowanie lepiej jest uruchomić cały skrypt z uprawnieniami roota (sudo script.sh
). W razie potrzeby możesz użyć,sudo
aby usunąć uprawnienia do określonych poleceń. Na przykład:Uruchomienie powyższego skryptu zwraca:
źródło
Bourne shell ma
-c
flagę za pomocą którego można przekazać dowolny skrypt powłoki, tak że można napisać coś podobnegoJest to jednak przydatne tylko w przypadku najprostszych poleceń, ponieważ poprawne cytowanie skryptu jest bardzo kłopotliwe, a niedogodność jest jeszcze większa, jeśli wyślesz polecenie do zdalnego serwera przez ssh, ponieważ skrypt argumentu zostanie przeanalizowany dwukrotnie, raz z boku wysyłanie skryptu i uruchamianie skryptu z boku.
Jeśli
something
jest to złożony skrypt lub musi zostać przekazany przez linię ssh , powszechną praktyką jest pisanie funkcji,prepare_something_script
której zadaniem jest pisanie skryptu „coś” na standardowym wyjściu . W najprostszej formie funkcja ta może wykorzystać dokument tutaj do wygenerowania danych wyjściowych:Skrypt utworzony przez
prepare_something_script
może być następnie uruchomiony lokalnie z uprawnieniami przyznanymi przez sudo w następujący sposób:W scenariuszu, w którym skrypt musi być wykonywany zdalnie z uprawnieniami nadanymi przez sudo , zwykle koduje się skrypt w bazie 64, aby uniknąć przekierowania standardowego wejścia ssh , w następujący sposób:
Jeśli używasz tego kodu w funkcji, nie zapomnij oznaczyć zmiennej coś 64 jako lokalną . Niektóre implementacje base64 oferują
-d
flagę do dekodowania, która jest gorzej obsługiwana niż--decode
wariant pełny . Niektóre implementacje wymagają dodania a-w 0
do polecenia kodowania, aby uniknąć fałszywych podziałów linii.źródło
Musisz dodać polecenie przed sudo -s, zamiast w następnym wierszu.
źródło