2011-02-25 12 views

Odpowiedz

2

uruchomić macierzystą komendę? jak whoami

1
+1

Uważaj na '-Duser.name = root', możesz ustawić to, co chcesz. –

+0

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

2

Można zadzwonić

Process p = Runtime.getRuntime.exec("whoami") 

metody. Następnie możesz przetworzyć stdout na p, aby odczytać wyjście polecenia.

+0

Możesz zmienić ścieżkę, aby 'whoami' zwracał to, co lubisz. '/ usr/bin/whoami' może być lepszym wyborem. –

+0

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

+0

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

0

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.

+0

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

7
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.

+1

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

6

Łatwo. Wystarczy użyć

System.getProperty("user.name") 
+0

To może nie być bezpieczne, jak wskazano [w innej odpowiedzi SO] (http: // stackoverflow.com/a/2290392/2032064) – Mifeet

+0

@ 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. –

0
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.

Powiązane problemy