Comando su: diferença entre su e su -, sudo su e sudo -i, e como trocar de conta

Ambiente de testeFamília RHELAlmaLinux 9.8util-linux 2.37conta rootDebian 12 · util-linux 2.38 conta comumVerificado em 2026-11-05
Comandos de usuários · grupossuLocalização/usr/bin/su
Executar comandos com outra conta

Para executar comandos com outra conta no Linux sem sair da conta atual, você usa o comando su. Ao executar su a partir da conta root de um servidor AlmaLinux 9 para daemon, uma conta de sistema que não pode fazer login, um único hífen mudou a pasta de trabalho e o PATH, e foi preciso indicar um shell para o comando rodar.

A saída abaixo vem de um servidor AlmaLinux 9.8 (conta root) e de um servidor Debian 12 (conta comum). As telas que pedem senha e o sudo não foram executados em um servidor em produção e estão resumidos com base nos manuais oficiais; parte do valor de PATH e o número da versão de patch do util-linux no simulador foram trocados por valores de exemplo.

1️⃣ Como usar o comando su

  • ↪️ Forma básica e como voltar com exit

A forma básica é [su nome_da_conta], e se você omitir o nome da conta, o su troca para root. Se você digitar exit no novo shell, esse shell termina e você volta ao shell da conta original que executou o su.

Ao executar a partir de uma conta comum, você digita a senha da conta de destino na linha Password: (com base na configuração padrão do PAM). Neste servidor, o /etc/pam.d/su pula a autenticação quando quem executa é root, por isso nenhuma senha foi pedida ao trocar da conta root para daemon.

su --help

Usage:
 su [options] [-] [<user> [<argument>...]]

Change the effective user ID and group ID to that of <user>.
A mere - implies -l.  If <user> is not given, root is assumed.

Options:
 -m, -p, --preserve-environment      do not reset environment variables
 -w, --whitelist-environment <list>  don't reset specified variables

 -g, --group <group>             specify the primary group
 -G, --supp-group <group>        specify a supplemental group

 -, -l, --login                  make the shell a login shell
 -c, --command <command>         pass a single command to the shell with -c
 --session-command <command>     pass a single command to the shell with -c
                                   and do not create a new session
 -f, --fast                      pass -f to the shell (for csh or tcsh)
 -s, --shell <shell>             run <shell> if /etc/shells allows it
 -P, --pty                       create a new pseudo-terminal

 -h, --help                      display this help
 -V, --version                   display version

For more details see su(1).

Como diz a ajuda, o hífen [-] é a opção de login, igual a [-l], e os argumentos escritos depois do nome da conta são passados ao shell da conta de destino. No servidor AlmaLinux 9 o su vinha do pacote util-linux 2.37, e no servidor Debian 12, do pacote 2.38.

su --version
su from util-linux 2.38.1

Para saber se a conta para a qual você quer trocar consegue abrir um shell, veja o último campo da linha dela em getent passwd.

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

O shell de daemon era /sbin/nologin. Uma conta que tem nologin no lugar de um shell de login não abre um shell, mesmo depois de trocar para ela com su.

2️⃣ Diferença entre su e su -

  • ↪️ Shell de login e variáveis de ambiente

Com um hífen (-), o su abre o mesmo shell que você teria ao fazer login com a conta de destino. Na pasta /tmp, o mesmo comando foi executado uma vez sem hífen e outra com hífen.

su -s /bin/sh -c pwd daemon
/tmp
su - -s /bin/sh -c pwd daemon
/usr/sbin

Sem hífen, a pasta de trabalho continuou sendo /tmp, enquanto [su -] foi para a pasta pessoal de daemon, /sbin. Neste servidor /sbin é um link para /usr/sbin, por isso o pwd mostrou /usr/sbin.

Nas variáveis de ambiente, foram comparadas só cinco linhas da saída do env: HOME, USER, SHELL, PATH e LOGNAME.

su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
su - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

HOME, USER e LOGNAME mudaram para os valores de daemon nos dois casos. Sem hífen, o PATH manteve o valor de root, que executou o su, e com [su -] ele foi definido de novo pela configuração de login.

Segundo o manual oficial, o su sem hífen muda só HOME e SHELL, e muda também USER e LOGNAME só quando a conta de destino não é root. Por isso, se você trocar para root a partir de uma conta comum sem hífen, USER continua com o nome da conta original.

[$0], que mostra o nome do shell, também foi diferente.

su -s /bin/sh -c 'echo $0' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

Com [su -], um hífen foi colocado na frente do nome do shell e apareceu -sh. Um shell cujo nome começa com hífen funciona como shell de login e lê os arquivos de configuração de login (segundo o manual oficial). As diferenças entre as duas formas estão abaixo.

Comparaçãosusu -
Pasta de trabalhoSem mudança (/tmp)Pasta pessoal da conta de destino (/usr/sbin)
HOME, USER, LOGNAMEValor de daemonValor de daemon
PATHValor de root, que executou o suDefinido de novo pela configuração de login
Nome do shell ($0)sh-sh (shell de login)
Outras variáveis de ambienteContinuam como estãoApagadas, exceto algumas como TERM (segundo o manual oficial)

O manual oficial recomenda sempre adicionar a opção de login para que os ambientes não se misturem, e escrever [--login] em vez do hífen. O su sem hífen mantém a pasta atual e o PATH, então, se você quiser conferir um comando com a configuração de outra conta, o resultado pode ser diferente do de [su -].

3️⃣ Opções su -c e su -s

  • ↪️ Executar um único comando e indicar o shell

Para executar só um comando com outra conta sem abrir um shell, escreva o comando depois de -c. Ao executar id com [su -c] na conta com nologin, apareceu uma mensagem de recusa no lugar da saída do comando.

su -c id daemon
This account is currently not available.

O comando passado com -c também é recebido e executado pelo shell da conta, então, se o shell for nologin, o comando nunca chega a rodar. Nesse caso, indique com -s o shell que será executado.

su -s /bin/sh -c id daemon
uid=2(daemon) gid=2(daemon) groups=2(daemon)

Com /bin/sh indicado, o id rodou com o UID 2 de daemon. Use essa forma para conferir permissões de arquivos ou resultados de comandos com uma conta de serviço.

Se o shell da conta de destino for um shell restrito que não está em /etc/shells, como o nologin, só o root pode trocar o shell com -s. Segundo o manual oficial, nesse caso -s e a variável SHELL indicados por um usuário que não seja root são ignorados.

Se o comando depois de -c tiver espaços, coloque-o entre aspas para passá-lo como um bloco só. O su devolve o código de saída do comando executado como ele é, 126 se não conseguiu executar o comando e 127 se não o encontrou (segundo o manual oficial).

📌 Principais opções: resultados deste artigo

OpçãoTarefaResultado neste artigo
-Abre o mesmo shell de um login com a conta de destino e vai para a pasta pessoal dessa contaEm /tmp, sem hífen o pwd foi /tmp e com hífen /usr/sbin, e echo $0 mostrou -sh
-c comandoExecuta um comando com o shell da conta de destino sem abrir um shellAo executar su -c id daemon na conta com nologin daemon, apareceu [This account is currently not available.]
-s shellExecuta o shell indicado no lugar do que está na conta; em contas com shell restrito, só rootsu -s /bin/sh -c id daemon mostrou uid=2(daemon) gid=2(daemon) groups=2(daemon)
--helpMostra o uso e a lista de opçõesLinha Usage e lista de opções -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V
--versionMostra as informações de versãosu from util-linux 2.38.1 no servidor Debian 12

📎 Outras opções: segundo o manual oficial

OpçãoTarefa
-lOpção de login igual ao hífen (-); nome longo --login
-mMantém as variáveis de ambiente e não muda HOME, SHELL, USER nem LOGNAME; ignorada junto com a opção de login (igual a -p)
-w listaMantém as variáveis escritas com vírgulas quando a opção de login limpa o ambiente; HOME, SHELL, USER, LOGNAME e PATH são definidos de novo
-g grupoDefine o grupo principal; só root
-G grupoDefine grupos suplementares; só root; sem -g, o primeiro grupo suplementar vira o grupo principal
-fPassa -f ao shell; opção usada no csh e no tcsh
-PCria um novo pseudoterminal para não compartilhar o terminal com a sessão original
--session-command comandoIgual a -c, mas sem criar uma nova sessão; o manual não recomenda

🔲 Simulador do comando su

O simulador abaixo começa na conta comum user1, e você pode testar por conta própria su, [su -] e sudo e voltar com exit. Contas e senhas são valores de exemplo.

Simulador do comando suutil-linux 2.37
[user1@server1 ~]$
Funciona só dentro do navegador; contas e senhas são valores de exemplo, e com ↑↓ você chama de volta comandos anteriores (as senhas não ficam no histórico).

4️⃣ Diferença entre sudo su e sudo -i

  • ↪️ Qual senha é pedida e como a pasta muda

sudo su é a forma de executar o su com privilégios de root por meio do sudo. Como quem executa o su é o root, a senha de root não é pedida, e antes disso o sudo pede a senha de quem o executa (segundo a documentação oficial).

As contas que podem executar sudo são definidas na configuração do /etc/sudoers. Se uma conta sem permissão executar sudo, ela é recusada com [user1 is not in the sudoers file.] (segundo a mensagem do programa).

Para cada comando que abre um shell de root, a senha pedida e a pasta de trabalho estão abaixo. Os comandos desta seção não foram executados em um servidor em produção e estão resumidos com base nos manuais su(1) e sudo(8).

ComandoSenha pedidaShell executadoPasta de trabalho
surootShell de rootinalterado
su -rootShell de login de root/root
sudo suConta que executouShell de rootinalterado
sudo su -Conta que executouShell de login de root/root
sudo -iConta que executouShell de login de root/root
sudo -sConta que executouShell da variável SHELL (privilégios de root)inalterado

[sudo -i] e [sudo su -] terminam os dois em um shell de login de root. Com [sudo -i], o sudo executa o shell de root direto como shell de login, enquanto [sudo su -] passa pelo su mais uma vez no meio do caminho.

[sudo -s] executa o shell da variável SHELL com privilégios de root e não vai para a pasta pessoal. Depois que você digita a senha certa uma vez, o sudo não pede de novo no mesmo terminal por 5 minutos, por padrão (segundo o manual do sudoers).

A diferença entre su e sudo é como a diferença entre pegar emprestada a chave de uma casa e escrever seu nome na portaria para entrar.

5️⃣ Erros do comando su

  • ↪️ This account is currently not available · Authentication failure

Se você trocar para uma conta que não pode fazer login, o nologin é executado no lugar de um shell e aparece [This account is currently not available.]. Ao executar [su daemon] como root, só essa linha apareceu, e o código de saída foi 1.

su daemon
This account is currently not available.

Essa mensagem é mostrada pelo programa nologin que está no último campo da linha da conta, e o mesmo texto foi encontrado dentro de /usr/sbin/nologin no servidor. Se você for root, pode indicar um shell com -s e executar comandos com essa conta.

Se a senha estiver errada, aparece [su: Authentication failure]. Esse texto é a mensagem que a biblioteca PAM devolve quando a autenticação falha. Segundo o manual oficial, se o su falhar antes de executar o comando, o código de saída é 1.

Se o su recusar mesmo com a senha da sua conta digitada certa, confira primeiro se o que está sendo pedido é a senha da conta de destino. O sudo pede a senha de quem o executa, e o su pede a senha da conta para a qual você está trocando.

Se você digitar um nome de conta que não existe, aparece [su: user user9 does not exist or the user entry does not contain all the required fields] (segundo a mensagem do programa). A causa e o que conferir em cada erro estão abaixo.

SaídaCausaO que conferir
This account is currently not available.O shell da conta de destino é nologinÚltimo campo da linha da conta em getent passwd; como root, indique um shell com -s
su: Authentication failureSenha erradaSe é a senha da conta de destino (o sudo pede a sua)
su: user user9 does not exist …Não existe conta com esse nomegetent passwd nome_da_conta
user1 is not in the sudoers file.Conta sem permissão para usar sudoConfiguração do sudoers e grupo wheel

🔢 FAQ & conteúdo recomendado

O manual oficial descreve o su principalmente como um comando para usuários comuns e, para scripts executados pelo root, recomenda o comando runuser, que não passa por autenticação. A forma é [runuser -u conta -- comando].

Se você escrever depois de -w (--whitelist-environment) os nomes das variáveis que quer manter, separados por vírgulas, o [su -] mantém essas variáveis ao limpar o ambiente. Segundo o manual oficial, HOME, SHELL, USER, LOGNAME e PATH são definidos de novo mesmo que estejam na lista.

Segundo o manual oficial, o su sempre registra as tentativas de login que falharam no arquivo btmp e não grava no arquivo lastlog. Os registros do btmp são vistos com o comando lastb.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 9   +   4   =