Ответ 1
Обновление. Основываясь на этом вопросе, люди, кажется, приходят сюда , просто ищут способ найти другой домашний каталог пользователя без необходимости олицетворять этого пользователя,
В этом случае самым простым решением является использование расширения tilde с интересующим именем пользователя в сочетании с eval
(что необходимо, потому что имя пользователя должно быть задано как некотируемый литерал для расширения тильды):
eval echo "~$different_user" # prints $different_user home dir.
Примечание. обычный оговорки относительно использования eval
применяются; в этом случае предполагается, что вы управляете значением $different_user
и знаете, что это просто имя пользователя.
В отличие от этого, оставшаяся часть этого ответа касается выдачи себя за пользователя и выполнения операций в этом домашнем каталоге пользователя.
Примечание:
- Администраторы по умолчанию и другие пользователи, если они авторизованы через файл
sudoers
, могут выдавать себя за других пользователей черезsudo
. - Ниже приведена конфигурация по умолчанию
sudo
- изменение конфигурации может привести к поведению по-другому - см.man sudoers
.
базовая форма выполнения команды как другого пользователя:
sudo -H -u someUser someExe [arg1 ...]
# Example:
sudo -H -u root env # print the root user environment
Примечание:
- Если вы не укажете
-H
, процесс выдачи (процесс, вызванный в контексте указанного пользователя) будет сообщать исходный домашний каталог пользователя в$HOME
. - Процесс выдачи будет иметь тот же рабочий каталог, что и процесс вызова.
- Выдающийся процесс выполняет без расширений оболочки в строковых литералах, переданных в качестве аргументов, так как никакая оболочка не участвует в процессе олицетворения (если только
someExe
не является оболочкой) - разложения вызывающей оболочкой - до перехода к выдающему себя процессу - очевидно, все еще может произойти.
Необязательно, вы можете выполнить выдающийся процесс как или с помощью (n impersonating) оболочки, путем префикса someExe
либо с помощью -i
, либо -s
- не указывая someExe ...
создает интерактивную оболочку:
-
-i
создает логин дляsomeUser
, что подразумевает следующее:-
someUser
Пользовательский профиль оболочки, если он определен, загружен. -
$HOME
указывает на домашний каталогsomeUser
, поэтому не требуется-H
(хотя вы все еще можете указать его) - Рабочий каталог для олицетворяющей оболочки - это домашний каталог
someUser
.
-
-
-s
создает оболочку без входа:- профиль оболочки не загружен (хотя файлы инициализации для интерактивных оболочек нелогического типа, например,
~/.bashrc
) - Если вы не укажете
-H
, процесс выдачи будет сообщать исходный домашний каталог пользователя в$HOME
. - Выдающаяся оболочка будет иметь тот же рабочий каталог, что и процесс вызова.
- профиль оболочки не загружен (хотя файлы инициализации для интерактивных оболочек нелогического типа, например,
Использование оболочки означает, что строковые аргументы, переданные в командной строке, могут быть подвержены расширениям оболочки - см. различия в платформе ниже - с помощью олицетворяющей оболочки (возможно, после первоначального расширения вызывающей оболочкой); сравните следующие две команды (которые используют одинарные кавычки для предотвращения преждевременного расширения вызывающей оболочкой):
# Run root shell profile, change to root home dir.
sudo -u root -i eval 'echo $SHELL - $USER - $HOME - $PWD'
# Don't run root shell profile, use current working dir.
# Note the required -H to define $HOME as root`s home dir.
sudo -u root -H -s eval 'echo $SHELL - $USER - $HOME - $PWD'
Вызывается какая оболочка определяется "переменной среды SHELL, если она установлена, или оболочкой, указанной в passwd (5)" (в соответствии с man sudo
). Обратите внимание, что при -s
важна вызывающая пользовательская среда, тогда как с -i
это олицетворяемый пользовательский интерфейс.
Обратите внимание, что существуют различия в платформе относительно поведения, связанного с оболочкой (с -i
или -s
):
-
sudo
в Linux, по-видимому, принимает только исполняемое имя или встроенное имя в качестве первого аргумента, следующего за-s
/-i
, тогда как OSX позволяет передавать всю командную строку оболочки; например, OSX принимает непосредственноsudo -u root -s 'echo $SHELL - $USER - $HOME - $PWD'
(нет необходимости вeval
), тогда как Linux не имеет значения (изsudo 1.8.95p
). -
Старые версии
sudo
в Linux НЕ применяют расширения оболочки для аргументов, передаваемых оболочке; например, с помощьюsudo 1.8.3p1
(например, Ubuntu 12.04),sudo -u root -H -s echo '$HOME'
просто отсылает строковый литерал "HOME" вместо расширения ссылки на переменную в контексте пользователя root. По меньшей мереsudo 1.8.9p5
(например, Ubuntu 14.04) это было исправлено. Поэтому, чтобы обеспечить расширение Linux даже с более старыми версиямиsudo
, передайте всю команду как единственный аргументeval
; например:sudo -u root -H -s eval 'echo $HOME'
. (Хотя это не обязательно для OSX, это тоже будет работать.) -
root
переменная$SHELL
$SHELL
содержит/bin/sh
в OSX 10.9, тогда как она находится в/bin/bash
на Ubuntu 12.04.
Если процесс олицетворения включает оболочку или нет, в ее окружении будут установлены следующие переменные, отражающие вызывающего пользователя и команду: SUDO_COMMAND
, SUDO_USER
, SUDO_UID=
, SUDO_GID
.
См. man sudo
и man sudoers
для многих других тонкостей.
Совет шляпы для @DavidW и @Andrew для вдохновения.