Это определенно вопрос sudo
и GNU/Linux
, а не вопрос Python
. Когда вы запускаете sudo foo arg1 arg2
система сначала запускает оболочку (установленную для root, а не вы), которая запускается от имени root
а затем "запускает" foo arg1 arg2
. Это не то же самое, что войти в систему с root
и ввести foo arg1 arg2
в командной строке, но закрыть. Существуют исполняемые файлы, которые не позволяют пользователю sudo работать или выполнять какие-то действия, а также некоторые дополнительные переменные среды, которые вы можете увидеть, если вы запустите sudo env
. Вы увидите что-то вроде:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env
И если оболочкой является bash, подоболочка, скорее всего, прочитала содержимое /root/.bashrc
если оно существует. Кроме того, оболочка my_user
bash будет выполнять расширение псевдонима для первого элемента (т.е. sudo в sudo foo arg1 arg2
), а не для второго (foo). Поэтому, если foo
также является псевдонимом, он не будет раскрыт, и поэтому подоболочка, выполняемая от имени пользователя root
будет пытаться запустить foo
как литерал, а не как foo
как псевдоним, созданный вами в my_user
. Есть несколько способов "исправить" вашу проблему. Определите псевдоним для sudo
с завершающим пробелом:
alias='sudo '
Как объясняется здесь, это приведет к тому, что то, что придет после sodo
будет также расширено псевдонимом перед отправкой его в подоболочку для запуска.
Другой вариант - отредактировать файл /root/.bashrc
или эквивалентный файл и выполнить одно из следующих действий:
- Предварительно добавьте местоположение нужного питона к
$PATH
используя что-то вроде export PATH=/path/to/foo:$PATH
- Определите псевдоним (ы), который вы хотите там
Или вы можете сделать что-то (мягко) рискованно и лениво, но очень эффективно и просто запустить sudo (cd /root && ln -s /home/my_user/.bashrc)
и root
всегда будет просто исходить из файла my_user/.bashrc
.