Como posso imitar 'sudo su - user' em um script?

3

Eu preciso implantar meu aplicativo no servidor chamado lovelyplace por um script Fabric . Infelizmente, a configuração do servidor é horrível, mas não posso fazer nada sobre isso - tenho que viver com isso.

Existe um usuário não-root que eu posso usar para coisas comuns, vamos chamá-la de alice . Então, há outro usuário, vamos chamá-lo de bob . bob tem privilégios de root. O administrador que preparou o servidor instalou todas as coisas em lugares onde se pode operar apenas como root, então bob é necessário para praticamente tudo que eu faço.

Eu tenho uma senha somente para a conta alice . Eu não tenho nenhuma senha para bob , mas me disseram que eu posso usar seus poderes digitando sudo su - bob e depois fazendo coisas. E isso é verdade - em um shell eu posso fazer isso (sem prompts de senha!) E então eu estou logado como bob e eu posso fazer qualquer coisa. No entanto, eu preciso fazer isso de forma não interativa, em um script. Algo como sudo su - bob && whoami .

Mas não consegui encontrar outra maneira de ganhar o poder de bob :

Por exemplo sudo su -c whoami bob resulta em [sudo] password for alice: e, em seguida, em Sorry, user alice is not allowed to execute '/bin/bash' as bob on lovelyplace.

Eu tentei muitas combinações de su , sudo , etc., mas o resultado é sempre o mesmo - prompt de senha e depois disso, rejeição.

Eu preciso encontrar o caminho para programaticamente fazer o login no servidor como alice e depois executar o material como bob . Eu preciso de um liner não interativo similar a sudo whoami , que imprimiria bob . Caso contrário, não posso implantar meu aplicativo por script.

Alguma sugestão de como imitar este estranho sudo su - bob no script?

UPDATE: bob não tem os mesmos poderes que o root. Ele não pode ler sudoers, etc., então ele tem mais privilégios que alice , mas aparentemente não tanto para ajustar as configurações de raiz.

    
por Honza Javorek 14.07.2013 / 21:54

2 respostas

1

Você deve ser capaz de passar os comandos a serem executados para o stdin do comando sudo su - bob (e, portanto, para o shell que ele cria):

sudo su - bob <<ENDCOMMANDS
echo "Running as:"
whoami
echo "done now...
ENDCOMMANDS
    
por 19.09.2013 / 17:41
0

Parece que o privilégio kung-fu no seu servidor é um trabalho bastante interessante. Há duas coisas que você pode tentar, mas como só podemos adivinhar o que Alice e Bob podem ou não fazer, YMMV.

Por que tem que ser um script que é executado como alice? Porque é algum acesso automatizado? Bem, se houver algum daemon cron, você pode ter um cron job para bob que regularmente executa algum script bash. Se esse script bash é gravável por alice você encontrou um método para executar scripts como bob sem a necessidade de su (do)? vodu. No entanto, suaviza um pouco a segurança ...

Outra abordagem, eu nunca tentei, segue as linhas de uma concha de fundo com stdin e ligada a canos. Deve ser possível enviar sudo su - bob\n para o stdin pipe e ele deve fazer com que o shell de background execute esse comando. Todos os comandos subseqüentes enviados para o shell de segundo plano devem ser executados como bob. Um esboço é o seguinte:

mkdir -p /tmp/backshell
mkfifo /tmp/backshell/stdin
mkfifo /tmp/backshell/stdout
mkfifo /tmp/backshell/stderr

bash -l >/tmp/backshell/stdout 2>/tmp/backshell/stderr </tmp/backshell/stdin &

cat /tmp/backshell/stdout &
cat /tmp/backshell/stderr >&2 &

echo "sudo su - bob" >> /tmp/backshell/stdin
echo "whoami" >> /tmp/backshell/stdin

No entanto, ele tem a falha que, após o primeiro echo , o stdin pipe está fechado e, consequentemente, o backshell também. Portanto, você deve encontrar uma maneira de impedir que o stdin pipe seja fechado ou implementá-lo usando algo um pouco mais sofisticado. Eu acho que python é um ótimo módulo para subshells e interage com eles.

    
por 14.07.2013 / 23:29

Tags