2010-08-02 3 views
0

사용자 이름이 주어지면 유닉스 계열 시스템에서 임의의 사용자 (프로그램을 실행하지 않아도되는 사용자)의 홈 디렉토리를 찾는 가장 좋은 방법은 무엇입니까?Java에서 임의의 사용자의 홈 디렉토리를 찾는 가장 좋은 방법은 무엇입니까?

것은이 같은 뭔가를 찾고 있어요 :

public void writeToHomeDirectory(String user){ 
    File homeFolder = new File("~" + user); 

    File f = new File(homeFolder, "A File"); 
    //f.writeStuff() 
} 

이이 쉘 기능입니다으로 확장하지 않는 '~ 사용자로 작동하지 않습니다. Java에서이를 수행 할 수있는 방법이 있습니까? 아니면 Runtime.exec()을 사용하여 셸을 실행하는 유일한 방법입니까?

답변

0

자기 대답에 대해 유감스럽게 생각 합니다만, 나는 그 명령을 올바르게 받아들이려고 애를 먹었으므로 다른 누군가가 나와 똑같은 문제를 겪을 경우에 대비하여 여기에 넣을 것입니다.

private File getHomeDirectoryOf(String username) throws IOException, Exception{ 
    String[] command = new String[]{"/bin/sh", "-c", "echo ~"+username + ""}; 
    Process echo = Runtime.getRuntime().exec(command); 
    BufferedReader br = new BufferedReader(new InputStreamReader(echo.getInputStream())); 

    try{ 
     echo.waitFor(); 
    } 
    catch(InterruptedException e){ 

    } 

    String path = br.readLine(); 
    echo.destroy(); 

    if(path.contains("~")){ 
     System.out.println("Home directory for " + username + " cannot be found."); 
     throw new Exception(); 
    } 
    else{ 
     return new File(path); 
    } 
} 

이것은 로컬 사용자 또는 LDAP 사용자 만 필요하면이 문제를 해결하는 훨씬 더 좋은 방법을 제공합니다.

1

Java에서이 작업을 수행하는 쉬운 방법은 없습니다. 그러나 "/ etc/passwd"파일을 읽고 user에 대한 항목을 찾고 사용자의 홈 디렉토리를 추출하면됩니다. 기본적으로 쉘이 수행하는 것입니다 ...

+0

네, 좋은 해결책 인 것 같습니다./home/directory에 하위 디렉토리를 나열하고 모든 사용자의 홈 디렉토리를 찾을 수 있습니까? –

+1

사용자가/home /에 저장되지 않으면 어떻게됩니까? 그들은 회사 네트워크에 있지 않습니다. Windows는 어떻습니까? –

+0

나는이 대답을 좋아하지만 나의 목적에 맞지 않을까 걱정된다 -/etc/passwd에없는 네트워크 (LDAP) 사용자를 포함시켜야한다. 나는 "echo ~ user"또는 "finger user"와 같은 쉘 명령을 사용하는쪽으로 점점 더 기울어 져 가고 있습니다. – Scott

0

시스템의 모든 사용자에 대한 정보가 올바른 권한 없이는 얻지 못할 것이라고 상상합니다.

은 운영 체제에 따라 이래로, 당신은 재산 user.home을 사용할 수 있습니다 다음은 메서드에 전달 한 사용자 문자열과 재산 user.name에서 사용자 이름을 대체 :

String user = "..."; // found elsewhere 
    String home = System.getProperty("user.home"); 
    String newUserHome = home.replace(System.getProperty("user.name"), user); 

이 적어도 유지 사용자 정의 된 사용자 홈 디렉토리에 대한 현재 OS의 위치 규칙. 사용자 홈 디렉토리가 일관된 위치에 있지 않은 경우 (그리고 내가 그럴 것이라고 상상할 수 없다면) 모든 배팅은 IMO를 벗어난 것입니다.

+0

LDAP 네트워크 사용자가있는 경우 원하는 NFS 공유에 홈 디렉토리를 넣을 수 있으므로 같은 폴더에 있지 않을 수도 있습니다. 좋은 측면 생각, 그래도. – Scott

0

'sh'를 실행하여 ~을 평가하도록 할 수 있습니다. 하지만 그것은 이상한 요구 사항입니다. 확률은 어쨌든 쓰기 권한이 없기 때문에 읽기 액세스 권한이 아닐 수도 있습니다.

관련 문제