Eu escrevi um script que usa, como argumento, uma string que é uma concatenação de um nome de usuário e um projeto. O script deve mudar (su) para o nome de usuário, cd para um diretório específico com base na sequência do projeto.
Eu basicamente quero fazer:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
O problema é que uma vez que eu faço um su ... ele apenas espera lá. O que faz sentido desde que o fluxo de execução passou para a mudança para o usuário. Depois que eu saio, o restante das coisas é executado, mas não funciona como desejado.
Anexei su ao comando svn, mas o comando falhou (ou seja, não atualizou o svn no diretório desejado).
Como escrevo um script que permite ao usuário alternar entre usuários e chamar svn (entre outras coisas)?
fonte
chsh
para os outros usuários. Meu problema está listado aqui em stackoverflow.com/q/15307289/80353 Como adapto sua resposta à minha situação?sudo
ousu
é de importância secundária,sudo
é muito mais seguro e conveniente.Muito mais simples: use
sudo
para executar um shell e use um heredoc para alimentá-lo.(resposta originalmente no SuperUser )
fonte
-i
para obtersomeuser
o ambiente esperado.sudo
pode ser conveniente, mas não é bom se não estiver pronto para uso (como no AIX).su -c 'commands'
é a resposta correta.Use um script como o seguinte para executar o restante ou parte do script em outro usuário:
fonte
whoami
vez doid
qual retornará o nome em vez do idsudo
pode ser conveniente, mas não é bom se não estiver pronto para uso (como no AIX).su -c 'commands'
é a resposta correta.Você precisa executar todos os comandos de diferentes usuários como seu próprio script. Se for apenas um ou alguns comandos, o inline deve funcionar. Se houver muitos comandos, provavelmente é melhor movê-los para seu próprio arquivo.
fonte
su -s /bin/bash
.Aqui está outra abordagem, que era mais conveniente no meu caso (eu só queria eliminar privilégios de root e fazer o resto do meu script de usuário restrito): você pode fazer com que o script seja reiniciado automaticamente a partir do usuário correto. Vamos supor que ele seja executado como root inicialmente. Então ficará assim:
fonte
runuser -u $user -- "$@"
, como diz su (1)exec su "$user" "$0" -- "$@"
--
é realmente útil.Use em
sudo
vez dissoEdição : Como apontou Douglas, você não pode usar
cd
,sudo
pois não é um comando externo . Você precisa executar os comandos em um subshell para fazer ocd
trabalho.Você pode ser solicitado a inserir a senha desse usuário, mas apenas uma vez.
fonte
sudo
pode ser conveniente, mas não é bom se não estiver pronto para uso (como no AIX).su -c 'commands'
é a resposta correta.Não é possível alterar o usuário dentro de um script de shell. Soluções alternativas usando o sudo descritas em outras respostas provavelmente são sua melhor aposta.
Se você é louco o suficiente para executar scripts perl como root, pode fazer isso com as
$< $( $> $)
variáveis que contêm uid / gid real / eficaz, por exemplo:fonte
Isso funcionou para mim
Dividi meu "provisionamento" da minha "inicialização".
então no meu start_env.sh
fonte
Inspirado na idéia da @ MarSoft, mas mudei as linhas da seguinte maneira:
Eu usei
sudo
para permitir uma senha menos execução do script. Se você deseja inserir uma senha para o usuário, remova osudo
. Se você não precisar das variáveis de ambiente, remova-E
do sudo.Os
/usr/bin/bash -l
garante, que osprofile.d
scripts são executados em um ambiente inicializado.fonte
sudo
pode ser conveniente, mas não é bom se não estiver pronto para uso (como no AIX).su -c 'commands'
é a resposta correta.sudo
. De fato, o sudo não é tão simples, em muitos casos você precisa mesmosudo -E
e uma entrada de configuração no sudoers.d para permitir a execução sem o tty with!requiretty
. Mas existem muitos casos em que o sudo é necessário para scripts chamados automaticamente, em que um diálogo de senha pode interferir. Portanto, eu não o removeria de uma solução padrão."$@"
dentro de uma string significa que os argumentos anteriores ao primeiro são anexados a uma string separada, não incluída no-c
argumento. Se você quiser torná-lo seguro, você podeprintf -v arg_q '%q ' "$0" "$@"
e, em seguida, usarsu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
resolve o problema com-c
. Argumentos com espaços não eram um problema antes, mas eu implementei sua boa entrada. Eu só tinha que fazer algumas experiências para fazê-lo funcionar. editei a pergunta e espero não ter colado outro bug. Obrigado pelo seu comentário, humilhante, mas necessário.