Quão universal é o sudo?

26

Eu estava escrevendo algumas instruções sobre como instalar algo (relacionado ao TeX - se você não perguntar, não vou estragar o seu dia fornecendo mais detalhes) e usado sudopara instalar em todo o sistema. Alguém comentou que achava que não sudoestava disponível em todas as distribuições Linux (ou Unix).

Existem distribuições Unix que não possuem sudoe, em caso afirmativo, quais são? Existe um comando universalmente reconhecido "Get me superusuário privilégios" que é em todos os sistemas?

Espaço em loop
fonte

Respostas:

34

sudo não pode ser considerado universal:

  • Red Hat Enterprise Linux : sudoé instalado por padrão no Red Hat Enterprise Linux e seus derivados 1 , mas instala apenas pronto para uso no RHEL 7 e mais recente.

    O Red Hat Enterprise Linux 7 adicionou uma nova opção à tela de instalação onde você cria o primeiro usuário não root , uma caixa de seleção chamada "Tornar este usuário administrador". Seu objetivo não está documentado nessa página do guia de instalação, mas um de seus efeitos é permitir que esse usuário execute qualquer comando sudo. Isso é feito adicionando esse usuário ao wheelgrupo, que pode executar qualquer comando na sudoconfiguração do pacote de ações .

    O Red Hat Enterprise Linux 3 a 6 também é instalado sudopor padrão, 2 mas até o RHEL 7, ele é enviado configurado de forma que só rootpode executar comandos através dele. A maneira mais fácil de corrigir isso é adicionar um ou mais usuários ao wheelgrupo, depois executar visudocomo root e descomentar a %wheel ALL=(ALL)...linha.

  • Debian : A partir do Debian 9, uma instalação mínima inclui sudo.

    No Debian 7 e 8, você tinha que selecionar o pacote " Utilitários de sistema padrão " definido durante a instalação para obter sudo. Se você instalar sudodessa maneira, o instalador do SO adicionará automaticamente o usuário não administrativo que você criou anteriormente no processo de instalação ao sudogrupo, que tem permissão para executar todos os comandos.

    No Debian 6 e versões anteriores, você tinha que instalar sudovia apt-getapós a instalação e configurá-lo manualmente para conceder aos usuários não-root a capacidade de usá-lo.

  • FreeBSD : sudonão está instalado por padrão no FreeBSD. Você precisa construí-lo a partir de portas.

  • NetBSD : Igual ao FreeBSD.

  • OpenBSD : sudousado para ser instalado por padrão no OpenBSD, mas eles ligado a doaspartir de 5.8, lançado em outubro 2015 . doasnavios desativados por padrão.

    Para obter sudoas versões atuais, você deve instalá-lo a partir do repositório de pacotes. O sudopacote do OpenBSD está configurado de maneira semelhante ao RHEL 3 a 6, de modo que somente ele rootpode executar comandos através dele, o que acaba com o objetivo de sudo. Se você adicionou um não rootusuário durante a instalação, ele foi adicionado ao wheelgrupo, portanto, a maneira mais simples de ser sudoútil em um sistema OpenBSD é descomentar a %wheel ALL=(ALL)...linha visudo.

  • Solaris : sudoé instalado por padrão no Solaris 11, mas o Solaris 10 e mais antigo usam o mesmo, mas não exatamente o mesmo pfexec.

    Você pode obter sudosistemas mais antigos, mas os padrões são importantes. O Solaris 10 e mais antigo estará conosco por anos; portanto, se você tiver o Solaris em seu ambiente e não estiver pessoalmente no controle desses sistemas e assim garantir que ele sudoesteja lá, não poderá contar com ele.

Quanto mais antigo o sistema, maior a chance de ele não ter sudo. Embora sudoseja muito antigo , não começou a se tornar popular até meados dos anos 2000. É improvável que existam sistemas mais antigos do que isso sudo. As caixas Unix tendem a viver muito tempo, por isso não é inconcebível que você ainda se deparasse com esse sistema hoje.

Eu só conto com sudosistemas que eu pessoalmente gerencio, ou como Ubuntu, macOS ou openSuSE, onde é a única maneira de obter privilégios de root, por padrão.

suestá mais próximo de um comando universal "obtenha-me privilégios de superusuário" sudo, mas você tem sistemas como Ubuntu e macOS nos quais a conta raiz é bloqueada por padrão especificamente para forçá-lo a usar em sudovez de su. Então, você também não pode chamar de suuniversal.


Notas de rodapé :

  1. CentOS, Oracle Linux, Linux Científico ...

  2. Sim, mesmo em instalações mínimas.

Warren Young
fonte
9

sudoé um utilitário disponível em quase todos os sistemas Linux.
No entanto, ele não é fornecido por padrão em todas as distribuições. Porém, todas as principais distribuições são agrupadas por padrão.

Distribuições Linux como Arch Linux, Gentoo, LFS, etc., que permitem ao usuário total customização, não possuem sudo por padrão.

No Arch Linux, o sistema base não vem com o sudoinstalado. O usuário deve baixar sudoe editar manualmente o arquivo sudoers.
O mesmo vale para o Gentoo e o LFS. Não conheço nenhuma outra grande distribuição sem sudo.

E não, não acho que exista algo mais universal do que sudoconceder privilégios de superusuário. Ou seja, além de realmente fazer login como root.

darnir
fonte
11
sudopode ser agrupado na maioria das distribuições, mas nem todas configuram todos os usuários como capazes de executá-las.
Jsbillings
Outro bom ponto. Depende do que o arquivo sudoers diz.
darnir
7

A distribuição mais usada, o Ubuntu, usa sudocomo o método recomendado para se tornar root (ao usar a linha de comando - os usuários que aderem à GUI receberão uma solicitação de senha sem entender ou se preocupar com o que acontece sob o capô). Outras distribuições podem ou não incentivar a instalação do sudo e podem ou não ser enviadas. Por outro lado, suestá disponível em qualquer lugar e pode ser usado na maioria dos sistemas, exceto naqueles em que apenas sudoestá disponível porque o usuário não terá a senha de root.

Entre sue sudo, você cobrirá quase todos os seus usuários. O exótico poucos que precisam califeou opou pfexecsaber o que fazer já. Mesmo se não o fizerem, um sistema que usa nem sunem sudoé provável que tenha arquivos em lugares desconhecidos e bastante coisas que você não tenha pensado que as instruções provavelmente não vai funcionar de qualquer maneira.

Gilles 'SO- parar de ser mau'
fonte
6

Para responder à sua pergunta, com mais precisão, não sudoé considerado universal. Na verdade, todo o conceito de "universal" é frequentemente um arenque vermelho. Isso é especialmente verdade no que diz respeito à compatibilidade entre distros. Uma vez que você joga na multiplicidade de versões diferentes de software, a universalidade se torna semi-irrealista. Script por natureza é pragmático, se fosse pedante, escrever scripts portáteis seria praticamente impossível.

Normalmente, avalio meu ambiente de execução pretendido, uma distribuição Linux semi-moderna, espero um shell POSIX com o GNU Utils comum. Para scripts que podem ser executados fora do Linux, espero apenas o padrão POSIX completo. Obviamente, muitos scripts são específicos para Linux, ou específicos para distribuição, de modo que muitas vezes diminuem o escopo da portabilidade.

Para abordar seu caso de script específico,

#!/bin/sh


## Exit Point
die() {
    [ -n "$2" ] && echo "$2"
    exit $1
}


## Require SuperUser Execution, Otherwise Re-Execute
[ `id -u` -ne 0 ] && {

    command -v lsb_release > /dev/null && {
        DISTRO="`lsb_release -is`"
        [ "$DISTRO" = "Ubuntu" ] && SUPERUSER='sudo'
    }
    SUPERUSER="${SUPERUSER:-su}"

    case "$SUPERUSER" in
        su)
            su -c "$0"
            ;;
        sudo)
            sudo "$0"
            ;;
    esac
}

## Require SuperUser Execution
[ `id -u` -ne 0 ] && die 78




echo 'Script Executed by UID'
id -u




## Clean Up
die 0

esse script colado é um elogio do shell POSIX, eu sempre escrevo compatível com Dash.

JM Becker
fonte
Mas seu script não exige que o sudo esteja instalado? Existe alguma maneira de obter acesso de superusuário sem o uso do sudo? Através de scripts simples?
darnir
@arnarn: Não, o script colado não precisa sudoser instalado. Requer execução de superusuário e pode ser usado sudose estiver disponível. Se sudonão estiver disponível, o script deverá ser executado como usuário root ou será die.
JM Becker
@arnarn: Além disso, realmente não há nada chamado "script simples". Quase tudo, excluindo os shell embutidos, é feito através de binários regulares. Esse é o objetivo do shell, chamar outros comandos, sejam interativos ou automatizados. É essa característica definidora, que separa o shell das linguagens de programação de uso geral. Portanto, independentemente de como você adquire superusuário, você está fazendo isso através de comandos externos ..., assumindo que você não codifica com interfaces brutas de kernel.
JM Becker
11
@varesa: Curiosamente, o Ubuntu é exatamente o oposto nas configurações padrão do sudo / su. Você pode verificar quais permissões do sudo um usuário possui, executando sudo -l. Infelizmente, é inutilizável nessa situação, pois pode exigir entrada de senha. Pensando nisso com mais cuidado, acho que todo o conceito pode ser melhor alcançado através de um teste por distribuição. Usando, a su -cmenos que esteja executando uma sudistribuição padrão desativada; nesse caso, usando sudo su -c. Como outros já mencionaram, é melhor deixar a elevação do superusuário para o usuário, eu consideraria qualquer script em torno de uma conveniência.
JM Becker
11
@varesa: Eu atualizei o script colado, para reduzir a chance de usar um não configurado sudo. Isso deve ser executado corretamente na maioria das distros, assumindo as configurações su/ padrão sudo. Eu sei que um Ubuntu desatualizado, pré lsb_release, precisaria ser resolvido ... Mas isso realmente é apenas um exemplo, e obviamente poderia ser estendido.
JM Becker