sudo как другой пользователь с их окружением

$ whoami admin $ sudo -S -u otheruser whoami otheruser $ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME' /home/admin 

Почему $HOME не установлен в /home/otheruser хотя bash вызывается в качестве оболочки входа?

В частности, /home/otheruser/.bashrc не используется. Кроме того, /home/otheruser/.profile не используется. – ( /home/otheruser/.bash_profile не существует)

EDIT: Точная проблема на самом деле https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails

2 Solutions collect form web for “sudo как другой пользователь с их окружением”

Чтобы вызвать оболочку входа, используя sudo просто используйте -i . Когда команда не указана, вы получите приглашение командной строки, иначе вы получите результат своей команды.

Пример (оболочка входа):

 sudo -i 

Пример (с указанным пользователем):

 sudo -i -u user 

Пример (с помощью команды):

 sudo -i -u user whoami 

Пример (печатать пользовательские $HOME ):

 sudo -i -u user echo \$HOME 

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

Я только что проверил последний пример с strace, который точно говорит вам, что происходит. На следующем рисунке показано, что оболочка вызывается с --login и с указанной командой, как и в вашем явном вызове bash, но, кроме того, sudo может выполнять свою собственную работу, например, устанавливать $HOME .

 # strace -f -e process sudo -S -i -u user echo \$HOME execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0 ... [pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0 ... 

Я заметил, что вы используете -S и я не думаю, что это вообще хорошая техника. Если вы хотите запускать команды как другой пользователь без проверки подлинности с клавиатуры, вы можете использовать SSH вместо этого. Он работает как с localhost хостом, так и с другими хостами и обеспечивает аутентификацию с открытым ключом, которая работает без какого-либо интерактивного ввода.

 ssh user@localhost echo \$HOME 

Примечание. Вам не нужны специальные опции с SSH, так как SSH-сервер всегда создает клиентскую оболочку для доступа к SSH-клиенту.

Вы даете Башу слишком много кредитов. Вся «оболочка входа» означает, что Bash – это файлы, которые загружаются при запуске и завершении работы. Переменная $HOME не фигурирует в ней.

Документы Bash объясняют еще кое-что, что означает оболочка для входа: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

На самом деле, Bash не делает ничего, чтобы установить $HOME вообще. $HOME устанавливается любым вызовом оболочки (login, ssh и т. Д.), И оболочка наследует ее. Независимо от того, что начало вашей оболочки, поскольку admin устанавливает $HOME а затем exec-ed bash , sudo по дизайну не изменяет среду, если только не спрошено или не настроено на это, так что bash поскольку otheruser унаследовал ее от вашей оболочки.

Если вы хотите, чтобы sudo обрабатывал больше окружающей среды так, как вы ожидаете, посмотрите на ключ -i для sudo. Пытаться:

 sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME' 

Страница man для sudo описывает это более подробно, хотя и не очень хорошо, я думаю: http://linux.die.net/man/8/sudo

  • Невозможно использовать sudo и другие приложения
  • Как заставить sudo запомнить мой пароль дольше?
  • Почему корневой вывод bash окрашен, но `sudo ls` нет?
  • su или sudo сохранение / удаление определенных переменных среды
  • Запустить nvm (функция bash) через sudo
  • Solaris sulog при использовании sudo
  • Почему в папку рабочего стола не загружается «sudo bash && cd desktop»?
  • Я случайно удалил файл sudoers в Mac OS X; есть ли способ его восстановить?
  • Система не запрашивает моего согласия при использовании sudo несколько раз
  • Передавать аргументы команде, запущенной другим пользователем
  • / etc / sudoers - Оскорбления - Как добавить список оскорблений?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.