Napisałem skrypt, który jako argument przyjmuje ciąg będący połączeniem nazwy użytkownika i projektu. Skrypt powinien przełączyć się (su) na nazwę użytkownika, cd do określonego katalogu na podstawie ciągu znaków projektu.
Zasadniczo chcę zrobić:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Problem w tym, że kiedy zrobię su ... to po prostu tam czeka. Ma to sens, ponieważ przepływ wykonania przeszedł do przełączenia na użytkownika. Kiedy wyjdę, reszta rzeczy jest wykonywana, ale nie działa zgodnie z oczekiwaniami.
Dodałem su do polecenia svn, ale polecenie nie powiodło się (tj. Nie zaktualizowało svn w żądanym katalogu).
Jak napisać skrypt, który pozwoli użytkownikowi na zmianę użytkownika i wywołanie svn (między innymi)?
źródło
chsh
dla innych użytkowników. Mój problem jest wymieniony na stackoverflow.com/q/15307289/80353 Jak dostosować odpowiedź do mojej sytuacji?sudo
czysu
ma drugorzędne znaczenie,sudo
jest o wiele bezpieczniejsze i wygodniejsze.O wiele prostsze: użyj
sudo
do uruchomienia powłoki i użyj heredoc do podawania poleceń.(odpowiedź pierwotnie na SuperUser )
źródło
-i
aby uzyskaćsomeuser
oczekiwane środowisko.sudo
może być wygodny, ale nie jest dobry, jeśli nie jest wyjęty z pudełka (jak w systemie AIX).su -c 'commands'
to poprawna odpowiedź.Użyj skryptu podobnego do poniższego, aby wykonać pozostałą część lub część skryptu przez innego użytkownika:
źródło
whoami
zamiast tego użytkownikid
zwróci nazwę zamiast identyfikatorasudo
może być wygodny, ale nie jest dobry, jeśli nie jest wyjęty z pudełka (jak w systemie AIX).su -c 'commands'
to poprawna odpowiedź.Musisz wykonać wszystkie polecenia dla różnych użytkowników jako ich własny skrypt. Jeśli jest to tylko jedno polecenie lub kilka poleceń, funkcja inline powinna działać. Jeśli jest dużo poleceń, prawdopodobnie najlepiej przenieść je do własnego pliku.
źródło
su -s /bin/bash
.Oto jeszcze jedno podejście, które było wygodniejsze w moim przypadku (chciałem po prostu zrzucić uprawnienia roota i wykonać resztę skryptu od użytkownika z ograniczonym dostępem): możesz zmusić skrypt do ponownego uruchomienia od właściwego użytkownika. Załóżmy, że początkowo jest uruchamiany jako root. Wtedy będzie wyglądać tak:
źródło
runuser -u $user -- "$@"
, jak stwierdzono w su (1)exec su "$user" "$0" -- "$@"
--
jest naprawdę przydatne.Użyj
sudo
zamiast tegoEDYCJA : Jak zauważył Douglas, nie można używać programu
cd
in,sudo
ponieważ nie jest to polecenie zewnętrzne . Aby wszystko działało, musisz uruchamiać polecenia w podpowłocecd
.Możesz zostać poproszony o wprowadzenie hasła tego użytkownika, ale tylko raz.
źródło
sudo
może być wygodny, ale nie jest dobry, jeśli nie jest wyjęty z pudełka (jak w systemie AIX).su -c 'commands'
to poprawna odpowiedź.Nie można zmienić użytkownika w skrypcie powłoki. Obejścia z użyciem sudo opisane w innych odpowiedziach są prawdopodobnie najlepszym rozwiązaniem.
Jeśli jesteś na tyle szalony, aby uruchamiać skrypty Perla jako root, możesz to zrobić ze
$< $( $> $)
zmiennymi, które przechowują rzeczywisty / efektywny uid / gid, np .:źródło
To zadziałało dla mnie
Oddzieliłem moją „obsługę administracyjną” od mojego „uruchomienia”.
następnie w moim start_env.sh
źródło
Zainspirowany pomysłem z @ MarSoft, ale zmieniłem linie w następujący sposób:
Kiedyś
sudo
pozwalałem na hasło mniej wykonywania skryptu. Jeśli chcesz wprowadzić hasło dla użytkownika, usuń rozszerzeniesudo
. Jeśli nie potrzebujesz zmiennych środowiskowych, usuń-E
z sudo.Te
/usr/bin/bash -l
, zapewnia, żeprofile.d
skrypty są wykonywane na zainicjowany środowiska.źródło
sudo
może być wygodny, ale nie jest dobry, jeśli nie jest wyjęty z pudełka (jak w systemie AIX).su -c 'commands'
to poprawna odpowiedź.sudo
. W rzeczywistości sudo nie jest takie proste, w wielu przypadkach potrzebujesz nawetsudo -E
wpisu konfiguracji w sudoers.d, aby umożliwić wykonanie bez tty z!requiretty
. Ale jest wiele przypadków, w których sudo jest niezbędne do automatycznych wywoływanych skryptów, w których okno dialogowe hasła może przeszkadzać. Dlatego nie usuwałbym go ze standardowego rozwiązania."$@"
wewnątrz łańcucha oznacza, że argumenty znajdujące się poza pierwszym są dołączane do oddzielnego ciągu, a nie są w nim zawarte-c
. Jeśli chcesz, aby było to bezpieczne, możeszprintf -v arg_q '%q ' "$0" "$@"
użyćsu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
rozwiązuje problem z-c
. Argumenty ze spacjami nie były wcześniej problemem, ale zaimplementowałem twoje dobre dane wejściowe. Musiałem tylko zrobić kilka eksperymentów, aby to zadziałało. zredagowałem pytanie i mam nadzieję, że nie