Em uma máquina, eu ( tlous
) recebi acesso para abrir um shell como outro usuário ( serviceAccount
)
Executing: sudo su - serviceAccount
tem o efeito desejado de abrir um shell como este serviceAccount
usuário. Até agora tudo bem.
Isso é bom, mas quero executar um comando como esse usuário sem abrir um shell.
Digamos que o comando sejawhoami
Eu tentei:
sudo -u serviceAccount whoami
Desculpe, o usuário tlous não tem permissão para executar '/usr/bin/whoami' como serviceAccount ...
sudo su - serviceAccount -c whoami
Desculpe, o usuário tlous não tem permissão para executar '/bin/su - serviceAccount -c whoami' ...
E outras variações. o que estou perdendo? Isso pode ser feito em um oneliner? A razão é que eu realmente quero executar isso como um comando ssh:
ssh -t [email protected] sudo su - serviceAccount -c whoami
Provavelmente, o
sudoers
arquivo no lado remoto especifica o comando exato que você pode executar e ésu - serviceAccount
. Uma ou mais opções adicionais (como-c
) farão com que o comando não se qualifique. Qualquer solução deve usar osu - serviceAccount
comando exato.Existe uma maneira de fazer algo sobre isso, mas não é perfeito. Comece executando isso no servidor:
(
sudo
sem-S
usará o terminal para solicitar sua senha (se necessário) apesar do redirecionamento).Para tornar a abordagem mais geral, crie um script no servidor:
Salve-o como
su-ser
e torne-o executável. Agora você pode testar estes:Observe que essas aspas não se propagam para o shell gerado por
su
. Cada vez queprintf
constrói um comando a partir de argumentos que o script obtém, isso é passado como uma string e depois analisado pelo shell final, com divisão de palavras, globbing e outros. Isso significa todos essesvai imprimir
1 2 3
. Para passar uma string entre aspas , você precisa colocar aspas, por exemplo:A próxima etapa é acionar esse script remoto do seu computador local:
Você precisa
-t
casosudo
peça a senha. Pelossh
comando no corpo da sua pergunta, posso dizer que você provavelmente entende isso.Note também cria uma string
ssh
de comando . A citação acima funcionaria mesmo se contivesse espaços. Por outro lado, se o caminho estiver sem espaços (e sem caracteres como , ), um totalmente sem aspas também funcionará./path/to/su-ser
;
*
ssh … /path/to/su-ser whoami
A citação adequada não é uma tarefa trivial neste momento. Vamos analisar o que acontece com o comando.
ssh
obtém seus argumentos como uma matriz. As aspas usadas pelo shell não vão tão longe.ssh
decide quais argumentos devem ser passados para o lado remoto e constrói uma string (de maneira semelhante aoprintf
nosso script remoto).sshd
no servidor). O shell remoto usa as (agora) maioria das aspas externas (se houver) para analisá-lo corretamente.su-ser
obtém seus argumentos como uma matriz. As aspas usadas pelo shell remoto não vão tão longe.su-ser
constrói uma cadeia.su
no servidor). O shell usa as (agora) mais aspas externas (se houver) para analisá-lo corretamente.Isso significa que às vezes você precisa de três níveis de cotações para obter o resultado correto. Um comando local descomplicado como
torna-se
onde as aspas duplas sem escape são removidas pelo shell local, as aspas simples são removidas pelo shell remoto; finalmente, as aspas duplas com escape (que de fato se tornam sem escape assim que o shell local remove as sem escape) informam ao shell gerado por
su
que a string com vários espaços é um único argumento paraecho
. Desta forma a saída éOutro problema é que o script remoto passa comandos para stdin do shell final, então você não pode facilmente usar seu stdin para outra finalidade. Por exemplo
cat; whoami
, (tente) deve imprimir de volta todas as linhas que você digitar (termine com Ctrl+ D), então a saída dewhoami
. No entanto, se você executar isso no servidor:cat
terminará imediatamente. Isso deve funcionar:(Novamente, use Ctrl+ Dpara encerrar
cat
). Agora compare o comportamento disso:para isso:
O mesmo fluxo alimenta
cat
e a concha; não é uma coisa boa. Estabelecer canais separados para comandos reais e o stdin real pode não ser fácil porquesudo
, por padrão, fecha descritores de arquivo adicionais e define um novo ambiente mínimo. Acho que uma engenhoca usando arquivos temporários/fifos funcionaria, mas isso é tão complicado que nem vou tentar.Portanto, o script pode ou não ser suficiente para você; depende dos comandos que você precisa executar. Agora você conhece algumas de suas limitações. Boa sorte.