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

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

13 ответов


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


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

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

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

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


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

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

для произвольного пользователя, а на сервер:

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

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


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

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


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

вот реальный случай и решение:

у вас есть скрипт, который пользователь должен запустить через судо. Скрипт должен получить доступ к домашней папке пользователя. Вы не можете ссылаться ~/.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_USER пуст, поэтому это в основном то же самое, что делать "echo ~". Он по-прежнему работает так, как вы ожидаете.

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


Я предполагаю, что вы хотите найти домашний каталог другого пользователя. Очевидно, получение "пользователя".главная " свойство будет самый простой способ получить текущий домашний каталог пользователя.

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

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 и мог бы использовать очки.


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


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


eval echo ~$SUDO_USER

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


можете ли вы проанализировать /etc / passwd?

например:

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

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

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