Estou trabalhando em uma máquina onde não tenho root, mas existe uma lista de sudo
comandos permitidos. Um desses comandos é /bin/su - foouser
. Assim, posso digitar sudo su - foouser
e obtenho um shell interativo como foouser. Então eu posso executar algumas coisas como arquivos foouser
.
O problema é que foouser
é um usuário/shell compartilhado usado para gerar certos processos de produção importantes. Não posso personalizá-lo facilmente ou configurá-lo da maneira que desejo. E eu não deveria estar trabalhando nele de forma consistente, o que divide meus terminais e o histórico de comandos entre aqueles em que estou conectado como eu mesmo e aqueles em que estou foouser
.
O que eu realmente gostaria de fazer é ter uma maneira de executar um único comando como foouser
, bloqueá-lo, imprimir stdout e stderr no meu shell como um comando normalmente faria e, em seguida, retornar comigo ainda conectado como eu mesmo (e não foouser
). Isso poderia, por exemplo, ser encapsulado em um script para que as_foo bar
execute o comando bar
, como foouser
, imprima stdout e stderr, retorne o código de retorno de bar
, e então me coloque de volta em meu shell.
Posso pedir aos administradores do sistema para alterar as permissões. Por exemplo, eles poderiam adicionar bar
à lista sudo e eu poderia usar (eu acho) su -c
para executar a barra da maneira que descrevi. Mas aí se no dia seguinte eu quiser correr bar2
, tenho que falar com eles de novo.
Existe alguma saída para esse dilema? Parece um tanto bobo porque obviamente posso me tornar foouser
e executar quantos comandos quiser, então não há diferença em termos de segurança que eu possa ver. Simplesmente não consigo encontrar nenhuma maneira óbvia e conveniente de tornar isso possível.
sudo su - foouser <command>
requer que você tenha pelo menos acesso root limitado para executarsu - foouser <command>
como root.sudo -u foouser <command>
pode fazer o que quiser em uma única etapa. Mas requer que o administrador do sistema tenha concedidosudo
acesso àfoouser
conta desta maneira:em vez desta forma:
A configuração
sudo
dessa maneira permitirá que você defina, por exemplo, um alias como você imaginou:E, evitando o
su -
, você pode continuar usando suas próprias personalizações: usarsudo
dessa maneira altera apenas a identidade do usuário, mas mantémHOME
seu valor anterior, lendo qualquer script de inicialização do shell e outras personalizações de seu diretório pessoal em vez defoouser
's.(Claro, esses scripts devem ser lidos por esse outro usuário também, e qualquer script compartilhado que você possa executar é melhor referir-se ao
foouser
diretório inicial explicitamente como/home/foouser
em vez de apenas$HOME
.)No entanto, existem algumas
sudo
configurações que podem impedir que essa solução funcione: se aalways_set_home
opção sudo estiver definida no arquivo sudoers ou se aenv_reset
opção for definida sem adicionarHOME
àenv_keep
lista,HOME
será redefinida de qualquer maneira. Em tal situação, tente adicionar a-E
opção desudo
comando para solicitar explicitamente a manutenção de seu ambiente.E quando você realmente deseja executar algo como
foouser
com o ambiente definido exatamente como quando está conectado comofoouser
(ou seja, o equivalente asudo su - foouser
), adicione a-i
opção para solicitar isso especificamente. Portanto,sudo -i -u foouser
é uma substituição 100% precisa desudo su - foouser
.Se você encontrar algum sistema com uma versão tão antiga
sudo
que não tenha a-i
opção, use a-H
opção com sudo: não é um substituto perfeito, mas pode ser o suficiente. Uma versão tão antiga dosudo
provavelmente também terá alguns bugs conhecidos sensíveis à segurança, então valeria a pena atualizá-la de qualquer maneira.Você pode usar
sudo -l
como você mesmo para ver exatamente como seu acesso ao sudo é definido e quais opções de sudo (também conhecidas como entradas padrão) estão em vigor para você.Passe argumentos adicionais para
su
.