Passar argumentos para um comando executado por outro usuário

2

Eu tenho um script bash que deve levar alguns argumentos e, em seguida, ser executado em um usuário diferente: test.sh

#!/bin/bash
sudo su user2 <<'EOF'
echo $1
EOF

No entanto, ele imprime em branco:

$ ./test.sh haha

Eu entendo que é porque a variável de ambiente é redefinida (?). Como posso passar esse argumento? Em termos de segurança, ouvi que não devo desabilitar a reinicialização do ambiente. A única maneira que me vem à mente para resolver isso é escrever $1 em um arquivo e, em seguida, lê-lo novamente pelo usuário2. Mas eu acho que deveria haver uma maneira muito melhor.

    
por Seperman 19.09.2014 / 03:18

3 respostas

6

Se você quiser que todo o script seja executado como outro usuário, minha técnica usual para fazer isso é adicionar algo semelhante ao seguinte no topo do script:

target_user="foo"
if [ "$(whoami)" != "$target_user" ]; then
  exec sudo -u "$target_user" -- "$0" "$@"
fi

Observe que eu uso sudo aqui e não su . su torna estupidamente difícil transmitir argumentos corretamente, enquanto sudo não tem esse problema.

Se você deseja apenas executar um pequeno código, pode fazer algo como:

target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
  echo "$@"
EOF

Isso lançará sh , passará os argumentos do script atual e executará o script fornecido por meio do heredoc.

    
por 19.09.2014 / 05:13
1

Isso pode funcionar:

#!/bin/bash
su - user2 -c 'echo "$0" "$@"' -- "$@"

Use aspas simples ' para passar o argumento do comando para su , para que você não tenha que escapar das aspas duplas " .

Referências:

Escapando argumentos da função bash para uso por su -c - Stack Overflow

bash - Passando argumentos para o shell fornecido - Unix & Troca de pilha do Linux

    
por 27.04.2015 / 11:06
1

Colocando o EOF entre aspas, você está efetivamente citando o "aqui documento" ( echo $1 ), tal que $1 é interpretado pelo shell user2 . Mas esse shell não possui nenhum parâmetro posicional. Não posso testar isso agora, mas aqui estão algumas abordagens que podem funcionar:

  • Não cite EOF :

    sudo su user2 << EOF
    echo $1
    EOF
    
  • Passar valores pelo ambiente:

    export my_val="$1"
    sudo su user2 << 'EOF'
    echo "$my_val"
    EOF
    
por 19.09.2014 / 04:07