su vs sudo -s vs sudo -i vs sudo bash

74

Qual é a diferença entre os seguintes comandos:

su
sudo -s
sudo -i
sudo bash

Eu sei para su Eu preciso saber a senha do root, e para sudo eu tenho que estar no arquivo sudoers , mas uma vez executado o que é diferença?

Eu sei que há uma diferença entre su e sudo -s porque meu diretório pessoal é /root depois que eu executo su , mas meu diretório pessoal ainda é /home/myname após sudo -s . Mas suspeito que isso seja apenas um sintoma de uma diferença subjacente que estou perdendo.

    
por Snitse 29.03.2012 / 21:27

3 respostas

97

Com su , você se torna outro usuário - root por padrão, mas potencialmente outro usuário. Se você disser su - , seu ambiente também será substituído pelo ambiente de login desse usuário, para que o que você vê seja indistinguível do login como aquele usuário. Não há como o sistema saber o que você faz enquanto su 'd para outro usuário a partir de ações desse usuário quando fizerem login.

As coisas são muito diferentes com sudo :

  • Comandos que você executa por sudo executar como o usuário de destino - raiz por padrão, mas alterável com -u - mas registra os comandos executados, marcando-os com seu nome de usuário para que a culpa possa ser atribuída posteriormente. :)

  • sudo é muito flexível. Você pode limitar os comandos que um determinado usuário ou grupo de usuários pode executar, por exemplo. Com su , é tudo ou nada.

    Esse recurso é normalmente usado para definir funções. Por exemplo, você pode definir um grupo de "backups" com permissão para executar dump e tar , cada um dos quais precisa de acesso root para fazer backup do disco do sistema.

    Eu mencionei isso aqui porque significa que você pode dar a alguém sudo privileges sem dar a eles sudo -s ou sudo bash habilidades. Eles têm apenas as permissões necessárias para fazer seu trabalho, enquanto que com su eles executam todo o sistema. Você tem que ter cuidado com isso, porém: se você der a alguém a habilidade de dizer sudo vi , por exemplo, eles podem gastar vi e ter efetivamente o mesmo poder que com sudo -s .

  • Como a senha do sudo é usada em vez da senha raiz, sudo isola a permissão entre vários sudoers.

    Isso resolve um problema administrativo com su , que é quando a senha do root muda, todos os que precisam saber para usar su precisam ser informados. sudo permite que as senhas dos sudoers mudem de forma independente. Na verdade, é comum bloquear com senha a conta do usuário raiz em um sistema com sudo para forçar todas as tarefas do administrador a serem feitas via sudo . Em uma grande organização com muitos sudoers confiáveis, isso significa que, quando um dos administradores de sistema sai, você não precisa alterar a senha de root e distribuí-la para os administradores que permanecem.

A principal diferença entre sudo bash e sudo -s é que -s é menor e permite que você passe comandos para executar no shell padrão do usuário de duas maneiras:

  1. Você pode dizer sudo -s some-command , que executa some-command em seu shell. É basicamente uma abreviação de sudo $SHELL -c some-command .

  2. Você pode passar os comandos para a entrada padrão do shell, como sudo -s < my-shell-script . Você poderia usar isso com um heredoc para enviar vários comandos para uma única chamada sudo , evitando a necessidade de digitar sudo repetidamente.

Ambos os comportamentos são opcionais. Muito mais comumente, você atribui -s sozinho, então ele executa a shell do seu usuário interativamente. Nesse modo, ele difere de sudo bash em que ele pode executar um shell diferente de bash , pois ele fica em primeiro lugar na variável de ambiente SHELL e, se isso não for definido, na configuração do shell de login do usuário, normalmente em /etc/passwd .

O shell executado por sudo -s herda seu ambiente de usuário atual. Se o que você realmente quer é um ambiente limpo, como ocorre após o login, o que você deseja é sudo -i , uma adição relativamente recente a sudo . Grosso modo, sudo -i é para sudo -s como su - é para su : redefine todas, exceto algumas variáveis-chave de ambiente, e envia de volta para o diretório inicial do usuário. Se você também não der comandos para executar sob esse shell via entrada padrão ou sudo -i some-command , ele executará esse shell como um shell de login interativo, para que os scripts de inicialização do shell de seu usuário (por exemplo, .bash_profile ) sejam executados novamente. / p>

Tudo isso torna sudo -i consideravelmente mais seguro que sudo -s . Por quê? Porque se alguém puder modificar seu ambiente antes de sudo -s , eles poderão causar comandos não intencionais a serem executados. O caso mais óbvio é modificar SHELL , mas também pode acontecer menos diretamente, como por meio de PAGER se você disser man foo enquanto estiver sob sudo -s .

Você pode dizer: "Se eles puderem modificar o PAGER , poderão modificar o PATH e poderão substituir um programa malvário sudo ", mas alguém suficientemente paranoico poderá dizer /usr/bin/sudo /bin/bash para evitar essa armadilha . Você provavelmente não é tão paranoico que também evita as armadilhas em todas as variáveis de ambiente suscetíveis outras . Você também se lembrou de verificar EDITOR , por exemplo, antes de executar qualquer comando VCS ? Assim sudo -i .

Como sudo -i também altera seu diretório de trabalho para o diretório inicial do usuário, talvez você ainda queira usar sudo -s nas situações em que você sabe que deseja permanecer no mesmo diretório em que estava cd d em quando você correu sudo . Ainda é mais seguro voltar a sudo -i e cd para onde você estava.

    
por 29.03.2012 / 22:59
25

De um post do ubuntuforums que fiz há um tempo atrás:

Considere o seguinte experimento:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Aqui estão as diferenças que encontrei:

com sudo -s :

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

com sudo su :

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Observe a diferença em $HOME . Ser root e ter $HOME definido para a casa do usuário normal pode causar problemas. Por exemplo, se você executar um aplicativo gráfico, o usuário normal ~/.Xauthority poderá ser substituído por root. Isso faz com que os problemas normais do usuário mais tarde, como não ser capaz de executar determinados aplicativos gráficos através do cron.

Para resumir:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. %código%     provavelmente definido por PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
  2. /etc/environment

A linha inferior é PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin é o comando adequado para ser executado quando você deseja um shell raiz que não é contaminado pelo ambiente do usuário.

    
por 29.03.2012 / 22:30
4

su ( s u ser ou s ubstitute u ser) permite alternar usuário. su basicamente inicia outra instância de shell com os privilégios do usuário pretendido. Por padrão, você muda para o usuário root , se quisermos mudar de usuário específico, precisamos passar o usuário da seguinte forma:

$ su bob  # switches to bob (requires bob's password)

su - significa que as variáveis de ambiente serão redefinidas para root e su significa variáveis de ambiente como usuário antigo.

por exemplo: o diretório pessoal do root se você usar su - ou o diretório home do usuário antigo se usar su .

O sudo ( s uper u ser do ) é um utilitário de linha de comando que permite aos usuários executar programas com privilégios de segurança de outro usuário, por padrão é superusuário ou seja, root . Ele usa um arquivo de configuração /etc/sudoers , que lista quais usuários têm direitos para ações específicas

sudo deve ser lido como / ˈsuːduː / . sintaxe sudo command i.e. s s u ser e fazer este comando.

  • su é equivalente a sudo -i e simula um login na conta raiz. Você trabalhando O diretório será /root e lerá .profile etc do root.

  • sudo -s inicia um shell como root, mas não altera seu funcionamento diretório.

  • sudo bash em que bash é o comando a ser executado com sudo . Este comando é executado bash como superusuário.

  • Usar sudo pode ser registrado em log tudo que alguém faz.
  • O uso de sudo impede que um usuário tenha que saber a senha do root.
  • Usando sudo , podemos limitar os comandos que podem ser executados.
por 17.09.2016 / 11:33

Tags