su user -l e su user -l -c "cmd" não dão o mesmo resultado

su user -l e su user -l -c "cmd" não dão o mesmo resultado

Preciso executar o comando do rootusuário, mas no gameserviceusuário. Infelizmente, o diretório bin PATHnão está hidratado NVMe, portanto, nodenão é um comando.

Consegui fazer funcionar exportando PATHdiretamente no comando assim, mas é feio.

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"

Mas quando tento brincar com as coisas, posso provar que tanto os meus arquivos .profilequanto os meus .bashrcsão executados.

Se eu apenas fizer login como usuário de roote su gameservice -l, echo $PATHtenho o diretório nvm bin dentro.

Acho que estou perdendo alguns conhecimentos básicos de como o bash está funcionando. Alguém pode identificar meu erro, por favor?

Responder1

O problema aqui é que bashele é invocado como um shell não interativo. De acordo com a bashpágina de manual:

Um shell interativo é iniciado sem argumentos sem opção (a menos que -s seja especificado) e sem a opção -c cuja entrada padrão e erro estão conectados aos terminais (conforme determinado por isatty(3)), ou iniciado com o - eu opção. PS1 está definido e $- inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.

No Ubuntu, o padrão .bashrccomeça com estas linhas:

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

então .bashrcé executado, mas decide sair imediatamente. Se você remover essas linhas, a PATHvariável será definida como o que está no .bashrcarquivo e você poderá executar o nodecomando.

Uma abordagem melhor, na minha opinião, é escrever um script no qual você configura todo o ambiente necessário, executa o comando necessário e, em seguida, executa esse script em nome do usuário. Isso funcionará de qualquer maneira e você não dependerá de nenhum arquivo de inicialização no diretório do usuário.

informação relacionada