Executando o script interativo do shell em nome de outro usuário
Pergunta
No meu script de shell (Bash), quero ligar para outros scripts de shell.
Eu executo meu script como user_a. Um desses scripts precisa de manuseio especial:
- Ele deve ser executado como usuário diferente (user_b). Senha necessária aqui.
- É interativo, mas não apenas faz perguntas, mas executa outro script em nome de outro usuário (user_c) usando su. Eu tenho que inserir uma senha aqui também.
Eu posso usar o SU chamando esse script, mas suas perguntas devem ser respondidas de alguma forma. Não posso entrar em nada porque ele imprime para cada mistons "Stty :: não é uma máquina de escrever"
Estou chamando o script especial dessa maneira
su user_B << ABC
...
special_script
...
ABC
Solução
#!/bin/bash
main_for_root(){
:
}
# ------------------------------------------------------------------------------
abs_path="$(readlink -f `dirname $0`)/$(basename $0)"
# if [ `id -u` != 0 ] ; then
if [ `whoami` != 'root' ] ; then
echo "[su -] run as root"
su -c"/bin/bash $abs_path $@"
exit 0
else
main_for_root $@
fi
Funciona para 1 usuário, então agora adicione 'se ...' para o segundo usuário
Outras dicas
Outra opção para executar scripts como outros usuários é o comando 'sudo', pense nisso como 'o superusuário:' para fins de legibilidade. O parâmetro -u fornece informações sobre nome de usuário. Então:
sudo -u user_B special_script
Solicitará a senha para user_b. Nunca tive um problema em executar programas interativos usando -o. Você pode gerenciar quem pode sudo a quem através do comando visudo.
Você pode usar sudo e criar um arquivo sudoers que permita que o user_a execute o script como user_b.
uma linha como:
user_A ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
permitiria a user_a fazer algo como
sudo -u user_B /usr/share/stuff/ABC
sem pedir uma senha
su
tenta obter uma senha do terminal e precisa de um dispositivo TTY para que possa ligar ioctl
para desligar o eco -chave. Como a entrada padrão é proveniente de um "documento aqui" (ABC), uma tentativa de ligar para o IOCTL no descritor de arquivo 0 rende "Não é um TTY".
Se você deve usar um documento aqui em vez de um genuíno script, faça:
cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
Você pode querer usar expect
. É projetado para interação com script.