przepraszam, musisz mieć tty, aby uruchomić sudo

13

Zadałem już to pytanie w przepełnieniu stosu , ale zostałem poproszony o opublikowanie go tutaj. Czyniąc to samo.

Uruchomiłem to polecenie, używając mojego programu Java

sudo -u <username> -S pwd

Mam ten wynik

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

Próbowałem edytować / etc / sudoers, ale już zawiera

<username>       ALL=(ALL)       NOPASSWD: ALL

Potem dowiedziałem się, że można to zrobić, komentując następujący kod w / etc / sudoers

# Defaults requiretty

Ponadto domyślnie, gdy sudopróbujemy wykonać polecenie jako inny użytkownik , musimy podać własne hasło. Ale można to zmienić, wprowadzając następującą zmianę w / etc / sudoers-

Defaults targetpw

Moje pytanie brzmi: czy jest możliwe wykonanie powyższego polecenia w Javie bez wprowadzania jakichkolwiek zmian w dowolnym miejscu, tj. Przy domyślnych ustawieniach ?

AlwaysALearner
źródło
1
Czy dlatego pytałeś raczej wymyśloną Alternatywę dla sudo ?
slhck,
6
Wydaje się specyficzne dla dystrybucji, jeśli requirettyjest domyślnie włączone. Według sudowłasnej dokumentacji jest ona domyślnie „wyłączona”.
mpy

Odpowiedzi:

3

Nie wiem, jak uruchamiać polecenia powłoki w Javie, ale spójrz na opcję -t dla polecenia ssh

-t force pseudo-tty allocation.

To właśnie robię, gdy muszę uruchomić komendę jako root przez ssh (bezpośrednie logowanie do roota wyłączone i tty wymagane przez sudo)

Zapytaj i naucz się
źródło
1
Chociaż takie podejście może rozwiązać problem na pierwszy rzut oka, wcale nie jest jasne, w jaki sposób jest ono związane z pytaniem. Czy możesz wyjaśnić bardziej szczegółowo?
pabouk
1
+1 za rozwiązanie problemu bez konieczności zmiany ustawień domyślnych.
Łukasz
1

Moje pytanie brzmi: czy możliwe jest wykonanie powyższego polecenia w java bez dokonywania jakichkolwiek zmian w dowolnym miejscu, tj. Przy domyślnych ustawieniach?

sudo -u -S pwd

Krótka odpowiedź brzmi: nie, musisz zmienić ustawienia, aby sudo działało inaczej niż obecnie.

sudo może być niewłaściwym narzędziem do tego. Reguły Sudo mają pomóc administratorom systemu w skonfigurowaniu sposobu na podniesienie uprawnień, które trudno nadużyć w celu uzyskania dodatkowych / niezamierzonych uprawnień.

Jeśli zastanowisz się, co sudo dla Ciebie robi:

  1. wyświetla monit o podanie hasła w celu weryfikacji tożsamości
  2. podnieść uprawnienia
  3. następnie opcjonalnie uzyskaj uprawnienia jako inny użytkownik
  4. loguje sudo do uzyskiwania dostępu lub uruchamiania poleceń

Jeśli chcesz, aby java uruchamiała dowolne polecenia jako dowolni użytkownicy bez podawania hasła dla tych użytkowników lub własnego, w zasadzie zastępujesz sudo. W takim przypadku powinieneś stworzyć własne zasady zapobiegania nadużyciom.

Istnieją w zasadzie dwa sposoby:

  1. uruchom java z podwyższonymi uprawnieniami i ostrożnie weź i oddaj potrzebne uprawnienia (zobacz wywołania funkcji setuid () seteuid () C).
  2. uruchom zewnętrzny program, aby zdobyć podwyższone uprawnienia, kiedy chcesz

W przypadku nr 1 twój program Java wykonuje to, co robi sudo, i powinieneś wdrożyć własny zestaw reguł, aby chronić przed nadużyciami.

Istnieją programy inne niż sudo do zrobienia # 2. Jeden przykład można znaleźć na https://code.google.com/archive/p/exec-wrapper/downloads

Ten przydatny skrypt powłoki tworzy program C w celu uruchomienia innej komendy (zwykle skryptu). Następnie kompilujesz program C do pliku binarnego i zaznaczasz ten setuid root, a tak naprawdę może on być setuid dla dowolnego użytkownika. (tryb: 4555 i właściciel: root)

Dopóki korzystasz z systemu plików, który na to pozwala, uruchomienie programu binarnego spowoduje uruchomienie skonfigurowanej komendy jako identyfikatora użytkownika, który jest właścicielem samego programu binarnego.

Mr. Ice
źródło