Как найти домашний каталог пользователя в Linux или Unix?
Как найти домашний каталог произвольного пользователя из Grails? В Linux это часто /home/user. Однако на некоторых ОС, например OpenSolaris, путь/export/home/user.
Можете ли вы быть более конкретным? Вы ищете домашний каталог пользователя, который запускает grails, или домашний каталог произвольного пользователя, чье имя или UID у вас есть?
13 ответов
Для UNIX-подобных систем вам может потребоваться выполнить » echo ~username » с помощью оболочки (поэтому используйте Runtime.exec() для запуска ).
Выдача «echo ~ username» кажется лучшим ответом. Я вижу так много людей, которые набирают «cd / home / username» вместо «cd ~ username» . Конечно, вы никогда не должны выкладываться, если вам не нужно.
Но поскольку Java не предоставляет API для этого, единственной альтернативой, которую я могу придумать, является JNI, что даже хуже, чем вызов оболочки.
Запуск echo ~ похоже, поможет, если вы вошли в систему как пользователь, чей домашний каталог вы ищете.
Чтобы быть сверхточным здесь — /bin/sh в POSIX гарантированно является Bourne-совместимой оболочкой, но расширение тильды ( ~ и ~user ) не является одной из обязательных функций такой оболочки. В дистрибутивах Linux BASH используется как /bin/sh , для которого работает расширение тильды. Если вы запустите echo ~ используя /bin/sh в другой ОС UNIX, вы можете получить только тильду (например, «~» ) вместо пути к домашней директории.
Это не отвечает на вопрос. Они не спрашивали, как найти свой домашний каталог, они спрашивали, как найти домашний каталог пользователя.
@JoachimSauer Ах, хорошо, моя ошибка. Я не осознавал, что «имя пользователя» было заполнителем для имени пользователя, путь к каталогу которого вы хотите получить. Я просто попробовал это в моей системе, и это сработало. Благодарю.
Обычно вы используете оператор
String userHome = System.getProperty( "user.home" );
чтобы получить домашний каталог пользователя на любой платформе. См. Документацию по методу getProperty, чтобы узнать, что еще вы можете получить.
Возможно, проблемы с доступом могут быть устранены с помощью этого обходного пути (с использованием файла политики безопасности)
Сервер приложений будет работать как рабочий пользователь и находиться, например, в / opt. Это может или не может работать, в зависимости от того, как настроен производственный учет. Следовательно, запрос домашнего каталога рабочего пользователя может не быть ответом.
ОП спрашивал дом произвольного пользователя. Но user.home является одним из текущего пользователя. Всегда ли работает этот метод, если вы перейдете из дома текущих пользователей к родителю, а затем в каталог с указанным именем пользователя?
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[]).getInputStream())).readLine(); >
Если вы пытаетесь сделать это для имени пользователя, которое вы не можете жестко закодировать, это может быть сложно. Конечно 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 > $HOME/.ssh/authorized_keys
Красота заключается в том, что если script не запускается как sudo, тогда $SUDO_USER пуст, так что это в основном то же самое, что и «echo ~». Он по-прежнему работает так, как вы ожидаете.
Если вы используете set -o nounset , который вы должны использовать, вы хотите выполнить экспорт до что.
В чем смысл тройки
@BBrown, я рада, что ты нашел это. Здесь строки — это способ избежать ненужных подоболочек. Я удивлен, что они не упоминаются в наградах «Бесполезное использование эха». partmaps.org/era/unix/award.html#echo Теперь, когда вы знаете о Herestrings (например, heredocs), представьте, как бы это было невозможно прочитать без него . export HOME=$(echo «echo ~$SUDO_USER» | bash) «эхо эхо? что?»
Если вы хотите найти конкретный домашний каталог пользователя, я не думаю, что вы можете сделать это напрямую.
Когда мне нужно было сделать это раньше с Java, мне пришлось написать некоторый собственный код JNI, который завершал семейство вызовов UNIX getpwXXX() .
Для этого вы можете использовать переменную окружения $HOME .
Я предполагаю, что вы хотите найти домашний каталог РАЗЛИЧНОГО пользователя. Очевидно, что получение свойства user.home было бы самым простым способом получить текущий домашний каталог пользователя.
Чтобы получить произвольный домашний каталог пользователя, в командной строке требуется немного утонченности:
String[] command = ; //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 и использовать точки.
How to Find User’s Home Directory in Linux or Unix
Under a Linux operating system distribution environment, a created/existing system user is associated with a Home directory. The configuration of the Home directory ensures that the files belonging to the currently active Linux user are only accessible to that user unless this user switches to another user account where they will access the Home directory of that switched user.
The files under a Linux Home user directory are specific to the currently active users. The base directory of the Linux operating system is the root (/) directory.
It is from the root (/) directory that we should be able to access the Home (/home) directory.
If you only have a single active user on your Linux operating system environment, dealing with the Home directory is straightforward. The latter statement implies that every created/existing Linux user will have their system username as a directory name under this Linux Home directory.
For instance, listing the directories in the above Home directory lists three other directories to imply that the Linux operating system in question hosts 3 three users.
If we decide to navigate into either of the above Linux user folders, we should first be able to meet the following prerequisite.
It is only by being a sudoer/root user that we can be able to navigate into other Linux users’ Home directories without bumping into permission/access barriers.
From the above display, we have managed to navigate to the Home directory and list the files, folders, and directories associated with user dnyce whose user directory exists within the Home (/home) directory.
The above screen capture also reveals to us the different file permissions associated with the listed files, folders, and directories. The file permissions starting with – e.g – rw-rw-r— , imply that we are dealing with a file and the file permissions starting with d e.g drwxr-xr-x , imply that we are dealing with a folder or directory.
Ways to Find User’s Home Directory in Linux
Before we look at some viable approaches to finding a user’s home directory in Linux, it is important to understand why the Home directory exists. This directory helps differentiate system-wide data from user data such that we do not have to deal with redundancy. Also, important file backup operation becomes flawless.
Navigating to the Home Directory Traditionally
You first need to be sure that the Linux user exists. This approach is a summary of the above-discussed content.
The tilde (~) symbol indicates that we are at the home directory of the currently active user.
The Linux user’s home directory contains directories like Documents, Downloads, Music, Pictures, and Public.
Find User’s Home Directory Using Cd Command
Executing the cd (change directory) command alone should take you to the home directory of the current Linux user.
Another approach is to use cd + tilde (~) should navigate us to the Home directory of the currently logged-in user.
You can also use $HOME command, which takes you to the Home directory as a variable.
Not only do we understand the concept of the Linux user’s home directory, but we can navigate to it from any directory path.