Estou trabalhando em uma máquina onde não tenho root, mas há uma lista de sudo
comandos permitidos. Um desses comandos é /bin/su - foouser
. Então posso digitar sudo su - foouser
e recebo um shell interativo como base. Então posso executar algumas coisas como foouser
.
O problema é que foouser
é um usuário/shell compartilhado usado para gerar certos processos de produção importantes. Não consigo personalizá-lo ou configurá-lo facilmente da maneira que desejo. E eu não deveria trabalhar nisso de forma consistente, o que divide meus terminais e histórico de comandos entre aqueles onde estou logado como eu mesmo e aqueles onde 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 em meu shell como um comando normalmente faria e, em seguida, retornar comigo ainda logado 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, em seguida, me coloque de volta em meu shell.
Posso pedir aos administradores de sistema para alterar as permissões. Por exemplo, eles poderiam adicionar bar
à lista sudo, e então eu poderia usar (eu acho) su -c
para executar bar da maneira que descrevi. Mas aí, se no dia seguinte eu quiser fugir bar2
, tenho que falar com eles novamente.
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.
Responder1
sudo su - foouser <command>
requer que você tenha pelo menos acesso root limitado para executar su - foouser <command>
como root.
sudo -u foouser <command>
pode fazer o que quiser em uma única etapa. Mas requer que o administrador do sistema lhe conceda sudo
acesso à foouser
conta desta forma:
ignacio ALL=(foouser) ALL
em vez desta forma:
ignacio ALL=(root) su - foouser
Configurar sudo
desta forma permitirá que você defina, por exemplo, um alias como você imaginou:
as_foo='sudo -u foouser'
E evitando o su -
, você poderá continuar usando suas próprias personalizações: usar sudo
desta forma altera apenas a identidade do usuário, mas mantém HOME
seu valor anterior, lendo quaisquer scripts de inicialização do shell e outras personalizações deseudiretório inicial em vez de foouser
's.
(É claro que esses scripts também devem ser legíveis por esse outro usuário, e é melhor que qualquer script compartilhado que você possa executar se refira foouser
explicitamente ao diretório inicial de como /home/foouser
em vez de apenas $HOME
.)
No entanto, existem algumas sudo
configurações que podem impedir que essa solução funcione: se a always_set_home
opção sudo estiver definida no arquivo sudoers, ou se env_reset
a opção for definida sem adicionar HOME
à env_keep
lista, HOME
será redefinida de qualquer maneira. Em tal situação, tente adicionar a -E
opção ao sudo
comando para solicitar explicitamente a manutenção do seu ambiente.
E quando você realmente quiser executar algo foouser
com o ambiente definido exatamente como está quando conectado como foouser
(ou seja, o equivalente a sudo su - foouser
), adicione a -i
opção para solicitar isso especificamente. O mesmo sudo -i -u foouser
ocorre com uma substituição 100% precisa de sudo su - foouser
.
Se você encontrar algum sistema com uma versão tão antiga sudo
que não tenha essa -i
opção, use a -H
opção com sudo: não é um substituto perfeito, mas pode ser suficiente. Uma versão tão antiga sudo
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 está definido e quais opções do sudo (também conhecidas como entradas padrão) estão em vigor para você.
Responder2
Passe argumentos adicionais para su
.
sudo su - foouser sh -c 'echo $USER'