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:

  1. Ele deve ser executado como usuário diferente (user_b). Senha necessária aqui.
  2. É 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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top