Как найти домашний каталог пользователя в Linux или Unix? - PullRequest
44 голосов
/ 29 января 2009

Как мне найти домашний каталог произвольного пользователя из Grails? В Linux это часто / home / user. Однако в некоторых ОС, например, в OpenSolaris, путь /export/home/user.

Ответы [ 13 ]

69 голосов
/ 30 января 2009

Обычно вы используете утверждение

String userHome = System.getProperty( "user.home" );

, чтобы получить домашний каталог пользователя на любой платформе. См. Документацию метода для getProperty , чтобы узнать, что еще вы можете получить.

Могут возникнуть проблемы с доступом, которых вы можете избежать, используя этот обходной путь (используя файл политики безопасности)

44 голосов
/ 29 января 2009

Для UNIX-подобных систем вы можете захотеть выполнить «echo ~username» с помощью оболочки (поэтому используйте Runtime.exec() для запуска {"/bin/sh", "-c", "echo ~username"}).

6 голосов
/ 20 февраля 2014

Попробуйте это на Java:

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
5 голосов
/ 19 октября 2009

Для произвольного пользователя в качестве веб-сервера:

private String getUserHome(String userName) throws IOException{
    return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
3 голосов
/ 18 февраля 2013

Если вы пытаетесь сделать это для имени пользователя, которое вы не можете жестко написать, это может быть сложно. Конечно, echo ~rbronosky скажет вам путь к моему домашнему каталогу /home/rbronosky, но что если rbronosky находится в переменной? Если вы сделаете name=rbronosky; echo ~$name, вы получите ~rbronosky

Вот пример из реальной жизни и решение:

У вас есть скрипт, который пользователь должен запустить через sudo . Сценарий должен получить доступ к домашней папке пользователя. Вы не можете ссылаться на ~/.ssh, иначе он расширится до /root/.ssh. Вместо этого вы делаете:

# Up near the top of your script add
export HOME=$(bash <<< "echo ~$SUDO_USER")
# Then you can use $HOME like you would expect
cat rsa_key.pub >> $HOME/.ssh/authorized_keys

Прелесть этого в том, что если скрипт не запускается как sudo , тогда $ SUDO_USER пуст, так что это в основном то же самое, что делать "echo ~". Это все еще работает, как вы ожидаете.

Если вы используете set -o nounset, который вы должны использовать , вы хотите сделать экспорт до этого.

3 голосов
/ 29 января 2009

Если вы хотите найти домашний каталог определенного пользователя, я не верю, что вы можете сделать это напрямую.

Когда мне нужно было сделать это раньше из Java, мне пришлось написать некоторый нативный код JNI, охватывающий семейство вызовов UNIX getpwXXX().

3 голосов
/ 29 января 2009

Для этого вы можете использовать переменную окружения $HOME.

2 голосов
/ 25 мая 2011

Я предполагаю, что вы хотите найти домашний каталог РАЗНОГО пользователя. Очевидно, что получить свойство user.home было бы самым простым способом получить домашний каталог текущего пользователя.

Чтобы получить произвольный домашний каталог пользователя, требуется немного изящества с командной строкой:

String[] command = {"/bin/sh", "-c", "echo ~root"}; //substitute desired username
Process outsideProcess = rt.exec(command);
outsideProcess.waitFor();
String tempResult;
StringBuilder sb = new StringBuilder();
while((tempResult = br.readLine()) != null) sb.append(tempResult);
br.close();
return sb.toString().trim();

Теперь технически у нас должен быть поток, ожидающий на stdout и stderr, чтобы буферы не заполняли и не блокировали процесс, но я уверен, что буфер мог бы по крайней мере содержать одно имя пользователя. Кроме того, вы можете проверить результат, чтобы увидеть, начинается ли он с ~ root (или с любым другим именем пользователя), просто чтобы убедиться, что пользователь существует и что он правильно оценен.

Надеюсь, это поможет. Голосуйте за этот ответ, если он поступит так, как я новичок в разработке SO, и мог бы использовать баллы.

1 голос
/ 29 октября 2013

eval echo ~ $ SUDO_USER

может работать.

1 голос
/ 29 января 2009

Найдите оболочку Java для getpwuid/getpwnam(3) функций, они запрашивают у системы информацию о пользователе по uid или по имени входа, и вы получаете всю информацию, включая домашний каталог по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...