A execução do comando de alias como outro usuário falha

2

Não tenho certeza do que estou fazendo de errado aqui.

User2 cria um arquivo em seu .bash_profile para definir aliases específicos do ambiente.

# .bash_profile
source $HOME/set_environment_shortcuts

Dentro de $ HOME / set_environment_shortcuts (há muitos aliases aqui). Exemplo:

alias startservices="verylongcommand"

Agora gostaria de iniciar os serviços de outro usuário.

[User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

O comando runuser produz o mesmo resultado.

[User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

Os aliases não funcionam dessa maneira?

Note que, ao ignorar completamente o alias, o comando funciona.

    
por Motorahead 25.09.2017 / 21:56

2 respostas

5

Os aliases não são expandidos quando o shell não é interativo, a menos que a opção expand_aliases shell esteja definida com shopt -s expand_aliases .

Os aliases são uma ferramenta de atalho para uso interativo. Para qualquer tipo de script, use uma função de shell:

startservices () {
    # commands go here
}

As funções do shell são muito mais flexíveis do que os aliases de várias maneiras. Eles são capazes de aceitar argumentos como um script de shell, para iniciantes:

startservices () {
    user="$1"
    service="$2"
    # code to start service "$service" as user "$user"
}

Você não precisa fornecer o .bash_profile do outro usuário explicitamente. Use sudo -i em vez disso. Isso iniciará um shell de login, que lerá .bash_profile ao iniciar:

$ sudo -i -u User2 startservices

Isso requer que startservices seja um script ou outro utilitário externo no $PATH de User2 , uma função shell definida nos arquivos de inicialização do shell de User2 ou um alias (com o shell sendo executado com expand_aliases set) definido nos arquivos de inicialização do shell de User2 .

Veja também Há sempre um bom razão para executar o sudo su?

    
por 25.09.2017 / 22:12
0

O alias é definido no .bash_profile do user1. Quando você usa "su -l user2", na verdade limpa todas as variáveis de ambiente para user1 e carrega as variáveis do user2, onde nenhum alias "startservices" é definido.

Você pode usar a opção "su -p", que preservará o ambiente atual, mas, nesse caso, o usuário2 precisa ter permissão de leitura no arquivo .bashrc do usuário1.

    
por 25.09.2017 / 23:54

Tags