su user -l и su user -l -c "cmd" не дают одинаковый результат

su user -l и su user -l -c "cmd" не дают одинаковый результат

Мне нужно запустить команду от rootпользователя, но на gameserviceпользователя. К сожалению, PATHне гидратируется с NVMкаталогом bin и, таким образом, nodeне является командой.

Мне удалось заставить это работать, экспортировав PATHнапрямую в команду, как здесь, но это некрасиво.

su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"

Но когда я пытаюсь поиграться с чем-то, я могу доказать, что и мои, .profileи мои .bashrcфайлы исполняются.

Если я просто войду в систему как пользователь с rootпомощью su gameservice -lи echo $PATH, у меня внутри будет каталог nvm bin.

Думаю, мне просто не хватает некоторых базовых знаний о том, как работает bash. Может ли кто-нибудь указать мне на мою ошибку?

решение1

Проблема здесь в том, что bashвызывается как неинтерактивная оболочка. Согласно bashman-странице:

Интерактивная оболочка запускается без аргументов non-option (если не указано -s) и без опции -c, стандартный ввод и вывод ошибок которой подключены к терминалам (как определено isatty(3)), или запускается с опцией -i. Устанавливается PS1, а $- включает i, если bash является интерактивной, что позволяет скрипту оболочки или файлу запуска проверять это состояние.

В Ubuntu по умолчанию все .bashrcначинается со следующих строк:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

so .bashrcвыполняется, но решает сразу же выйти. Если вы удалите эти строки, переменная PATHбудет установлена ​​на то, что находится в .bashrcфайле, и вы сможете выполнить nodeкоманду.

Лучший подход, по моему мнению, это написать скрипт, в котором вы настраиваете всю необходимую среду, и запустить нужную вам команду, а затем выполнить этот скрипт от имени пользователя. Это будет работать в любом случае, и вы не будете зависеть ни от каких файлов запуска в каталоге пользователя.

Связанный контент