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
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.
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
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.