Uruchom skrypt jako root podczas logowania (bez użytkownika sudoer, sesja powłoki)

8

Podobnie jak /etc/profilei ~/.profileuruchamiany przez root zamiast użytkownika robi logowanie. /etc/rc.localdziała po uruchomieniu, ale przed zalogowaniem muszę uruchomić skrypt. Użytkownik nie jest sudoer.

Dzięki!

Antonio Sánchez
źródło
Może być na to sposób, ale nie byłoby tak /etc/profilelub ~/.profileponieważ uruchamianie kodu w tych skryptach jest wykonywane przez powłokę użytkownika i podlega kontroli użytkownika, a jeśli nie chcesz, aby użytkownik miał uprawnienia do uruchamiania programów jak rootsame, będzie to musiało być wykonane przez niektóre działające usługi zewnętrzne względem procesów użytkownika. ... Pomocne może być podanie celu skryptu, który chcesz uruchomić.
Eliah Kagan
Muszę wykonać jedno konkretne (--bind) podłączenie dla jednego określonego użytkownika. Próbowałem fstab z opcjami właściciela i użytkownika, ale to nie działa. /etc/rc.local jest jedną z opcji, ale zawsze wykonuje podłączenie, niezależnie od tego, czy użytkownik się zaloguje, czy nie. Obecnie nadałem użytkownikowi uprawnienia sudoer do „montowania” użytkownika, ale jest to obejście problemu i nie lubię przyznawać żadnych uprawnień zwykłym użytkownikom. Myślę, że zamiast tego użyję rc.local. Dzięki!
Antonio Sánchez
Możesz utworzyć skrypt główny za pomocą tylko tej konkretnej mountkomendy i dać użytkownikowi uprawnienia do uruchamiania tylko tego skryptu (konfigurowanie /etc/sudoers). Polecenie z podanymi opcjami można ustawić bezpośrednio w sudoers.
enzotib
Próbowałem już w ten sposób. Chodzi o to, że kiedy przychodzi czas na uruchomienie „mount” w skrypcie, ponownie „sudo” jest obowiązkowe, ponieważ skrypt jest uruchamiany przez „użytkownika”, a nie „root”, więc pod koniec dnia „mount” należy przyznać także dla „użytkownika” i zamiast tylko jednej reguły sudoers mam teraz dwie. To jest moje doświadczenie, więc proszę pamiętać, że nie jestem ekspertem i może zrobiłem coś złego. Dzięki!
Antonio Sánchez,

Odpowiedzi:

3

Wracając do metody sudoers, myślę, że byłeś prawie tam, zanim się poddałeś. Patrząc na twoje najnowsze komentarze, chciałbym się odnieść do czegoś, co prawdopodobnie naprawi dla ciebie:

Jeśli uruchamiasz skrypt jako root, nie musisz wywoływać sudo z jego poziomu.

Mam taki skrypt:

#! /bin/bash

echo $USER
whoami

Jeśli uruchomię sudo ./myscript, zobaczę rootzwrócone dla obu tych. Sesja, w której działa skrypt, jest powłoką główną.

W skrócie oznacza to, że wszystko, co robisz w skrypcie, ma już uprawnienia root. Nie musisz dzwonić sudo(nie żeby to bolało - rootzwykle ma sudouprawnienia).

Więc napisz swój skrypt, i chowndo niego (aby tylko root mógł go uruchamiać, czytać lub edytować), a następnie po prostu pozwolić swoim użytkownikom na uruchomienie go przez sudoers. To powinno działać.rootchmod700

Jeśli to nie działa, jest to prawdopodobnie większy problem ze skryptem, a nie z ramką uprawnień. Proponuję dać użytkownikowi pełny sudodostęp (dodanie do grupy administracyjnej jest najprostszym sposobem), a następnie uruchomić skrypt.

Oli
źródło
2

Krok 1. Utwórz skrypt za pomocą komendy bind za pomocą dowolnego edytora. Na przykład:

sudo emacs bind_user_directories.sh

zawartość:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Krok 2. Zapisz plik bind_user_directories.sh i ustaw go jako wykonywalny:

chmod a+x bind_user_directories.sh

Krok 3. połącz go z odpowiednią lokalizacją, taką jak / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Krok 4. Utwórz skrypt upstart:

sudo emacs /etc/init/bind_user_directories.conf

zawartość:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Jeśli to Ci odpowiada, daj mi znać. Możesz sprawdzić dziennik systemowy pod kątem komunikatów po zalogowaniu. (Jeszcze go nie przetestowałem i nigdy wcześniej nie wdrożyłem czegoś takiego.) Jeśli ulepszysz rozwiązanie, udostępnij swoje ostateczne rozwiązanie tutaj. Dzięki.

MountainX
źródło
Tak to działa! Jest to świetna alternatywa dla skryptów mdms /etc/mdm/PostLogin/w świecie Ubuntu !!
Adam Ryczkowski
Czy masz podobne rozwiązanie w systemie? ... Por. askubuntu.com/questions/847930/…
Adam Ryczkowski
0

Aby uruchomić skrypt jako root przed zalogowaniem

  1. Mógłbyś rozpocząć scrip z Upstart .

  2. Można dodać wywołanie skryptu do istniejących kdm / gdm / etc uruchamiania skryptów .

Przykłady: Temat: FAQ: Autostart / Autorun, okresowe uruchamianie .

użytkownik26687
źródło
Ale Antonio Sánchez szuka sposobu uruchomienia skryptu root w momencie zalogowania się określonego użytkownika .
Eliah Kagan
Skrypt musi być uruchamiany niezależnie, sesja jest graficzną lub standardową powłoką. Zaktualizowałem tytuł, aby to zaznaczyć. Przeczytałem już coś o Upstart, ale wydaje się to skomplikowane z powodu (najwyraźniej) prostego zadania. W każdym razie i jak dotąd Upstart wydaje się jedynym sposobem, aby to zrobić. Jeśli znasz Upstart, czy trudno byłoby się nauczyć wystarczająco dużo, aby wykonać tę pracę? Dzięki!
Antonio Sánchez