Jak mogę sprawdzić, czy użytkownik jest rootem w aplikacji java?Sprawdź, czy użytkownik jest rootem w aplikacji java.
Dzięki
Jak mogę sprawdzić, czy użytkownik jest rootem w aplikacji java?Sprawdź, czy użytkownik jest rootem w aplikacji java.
Dzięki
uruchomić macierzystą komendę? jak whoami
Sprawdź to: get login username in java.
Można zadzwonić
Process p = Runtime.getRuntime.exec("whoami")
metody. Następnie możesz przetworzyć stdout na p, aby odczytać wyjście polecenia.
Możesz zmienić ścieżkę, aby 'whoami' zwracał to, co lubisz. '/ usr/bin/whoami' może być lepszym wyborem. –
Czy argumentem jest 'Runtime.getRuntime.exec' nazwa programu lub polecenie powłoki? Ponieważ to polecenie powłoki, użytkownik uruchamiający aplikację Java z wiersza poleceń może zmienić to, co '/ usr/bin/whoami' naprawdę oznacza, modyfikując zmienne środowiskowe. IE: ustaw $ IFS tak, aby zawierał ukośnik, dodaj bieżący katalog do $ PATH, a następnie umieść tam program o nazwie 'usr'. – cHao
Tak czy inaczej, poleganie na wynikach 'whoami' nie jest naprawdę odpowiednią rzeczą dla celów bezpieczeństwa. Byłoby dobrze, jeśli chodzi o sprawdzenie wygody, powiedzmy, instalatora (aby można było wyświetlić odpowiedni komunikat o błędzie, a nie o połowiczne zainstalowanie czegoś) lub innego programu, który i tak by się złamał bez uprawnień root'a. Ale można go podważyć na wiele sposobów, przez co jest to zły pomysł polegający na * przyznaniu * dostępu do czegoś. – cHao
Najlepszym sposobem jest uruchomienie
Process p = Runtime.getRuntime.exec("groups `whoaim`");
i starają się analizować ciąg dostać korzeń połączeń grupowych. Twój proces JVM może być uruchamiany przez użytkownika, a nie przez administratora, ale przez moderatora, ale ten użytkownik może należeć do grupy root i masz uprawnienia root'a.
W prawie wszystkich systemach Linux, które widziałem, tylko rzeczywisty użytkownik root ma uprawnienia roota. Grupa główna zwykle nie uwzględnia faktycznego dostępu, ale * dostępu * potencjalnego; tj: ktoś może uruchomić polecenie * uzyskać * uprawnienia root, ale nie * automatycznie * je *. – cHao
Process p = Runtime.getRuntime().exec("id -u")
Należy pamiętać, że „root” użytkownik systemu nie można nazwać root
(choć rzadko się to zmienić), a jest to również możliwe skojarzenie go do innego użytkownika. Jeśli bieżący użytkownik jest root-em, wynik będzie wynosił 0
.
Zmiana nazwy użytkownika root jest możliwa, ale łamie kilka rzeczy, które mają w nazwie "root". Godne uwagi jest "su" - które, jeśli działa bez nazwy użytkownika, jest takie samo jak "su root", i narzeka, że użytkownik "root" nie istnieje. Próbowałem tego jeden raz i wkrótce zmieniłem nazwę użytkownika. :) – cHao
Łatwo. Wystarczy użyć
System.getProperty("user.name")
To może nie być bezpieczne, jak wskazano [w innej odpowiedzi SO] (http: // stackoverflow.com/a/2290392/2032064) – Mifeet
@ Mifeet Zgadzam się. Można to zmylić. Ale jeśli programista zna zamierzonych użytkowników i zamierzone środowisko oprogramowania, może to być przydatne rozwiązanie. –
String userName = System.getProperty("user.name");
Process p = Runtime.getRuntime().exec("groups " + userName);
String output = read(p.getInputStream());
String error = read(p.getErrorStream());
I tu jest funkcją odczytu:
public static String read(InputStream input) throws IOException {
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input))) {
return buffer.lines().collect(Collectors.joining("\n"));
}
}
prostu "inny" zmodyfikowane rozwiązanie.
Uważaj na '-Duser.name = root', możesz ustawić to, co chcesz. –
Możesz sfałszować nazwę użytkownika na wiele sposobów, niezależnie od tego, czy sprawdzasz 'user.name' czy parsuje dane wyjściowe' whoami'. Jeśli polegasz na tym w kontroli dostępu, jesteś trochę spieprzony. – cHao