Как найти домашний каталог произвольного пользователя из Grails? В Linux это часто /home/user. Однако на некоторых ОС, например OpenSolaris, путь/export/home/user.
Как найти домашний каталог пользователя на linux или unix?
Ответ 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.