Подтвердить что ты не робот

Как найти домашний каталог пользователя на linux или unix?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

private String getUserHome(String userName) throws IOException{
    return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}

Ответ 4

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

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Вот реальный мир и решение:

У вас есть script, который пользователь должен выполнить через sudo. script должен получить доступ к домашней папке пользователя. Вы не можете ссылаться на ~/.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

Красота заключается в том, что если script не запускается как sudo, тогда $SUDO_USER пуст, так что это в основном то же самое, что и "echo ~". Он по-прежнему работает так, как вы ожидаете.

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

Ответ 8

Я предполагаю, что вы хотите найти домашний каталог РАЗЛИЧНОГО пользователя. Очевидно, что получение свойства 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 и использовать точки.

Ответ 9

Чтобы найти домашний каталог пользователя FOO в системе UNIX-ish, используйте ~FOO. Для текущего пользователя используйте ~.

Ответ 10

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

Ответ 11

eval echo ~ $SUDO_USER

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

Ответ 12

Можете ли вы разобрать /etc/passwd?

например:.

 cat /etc/passwd | awk -F: '{printf "User %s Home %s\n",  $1, $6}'

Ответ 13

Префикс userdir (например, '/home' или '/export/home') может быть элементом конфигурации. Затем приложение может добавить произвольное имя пользователя к этому пути.

Предостережение. Это не разумно взаимодействует с ОС, поэтому вам не повезло, если бы это была система Windows с userdirs на разных дисках или в Unix с макетом домашней директории, например/home/f/foo,/home/b/bar.