Comando su: diferença entre su e su -, sudo su e sudo -i, e como trocar de 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
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 --versionsu from util-linux 2.38.1Para 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 daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinO 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 -
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/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinSem 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/binsu - -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/sbinHOME, 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' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shCom [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ção | su | su - |
|---|---|---|
| Pasta de trabalho | Sem mudança (/tmp) | Pasta pessoal da conta de destino (/usr/sbin) |
| HOME, USER, LOGNAME | Valor de daemon | Valor de daemon |
| PATH | Valor de root, que executou o su | Definido de novo pela configuração de login |
| Nome do shell ($0) | sh | -sh (shell de login) |
| Outras variáveis de ambiente | Continuam como estão | Apagadas, 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
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 daemonThis 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 daemonuid=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ção | Tarefa | Resultado neste artigo | |
|---|---|---|---|
| - | Abre o mesmo shell de um login com a conta de destino e vai para a pasta pessoal dessa conta | Em /tmp, sem hífen o pwd foi /tmp e com hífen /usr/sbin, e echo $0 mostrou -sh | |
| -c comando | Executa um comando com o shell da conta de destino sem abrir um shell | Ao executar su -c id daemon na conta com nologin daemon, apareceu [This account is currently not available.] | |
| -s shell | Executa o shell indicado no lugar do que está na conta; em contas com shell restrito, só root | su -s /bin/sh -c id daemon mostrou uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Mostra o uso e a lista de opções | Linha Usage e lista de opções -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Mostra as informações de versão | su from util-linux 2.38.1 no servidor Debian 12 |
📎 Outras opções: segundo o manual oficial
| Opção | Tarefa | |
|---|---|---|
| -l | Opção de login igual ao hífen (-); nome longo --login | |
| -m | Manté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 lista | Manté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 grupo | Define o grupo principal; só root | |
| -G grupo | Define grupos suplementares; só root; sem -g, o primeiro grupo suplementar vira o grupo principal | |
| -f | Passa -f ao shell; opção usada no csh e no tcsh | |
| -P | Cria um novo pseudoterminal para não compartilhar o terminal com a sessão original | |
| --session-command comando | Igual 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.
4️⃣ Diferença entre sudo su e sudo -i
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).
| Comando | Senha pedida | Shell executado | Pasta de trabalho |
|---|---|---|---|
| su | root | Shell de root | inalterado |
| su - | root | Shell de login de root | /root |
| sudo su | Conta que executou | Shell de root | inalterado |
| sudo su - | Conta que executou | Shell de login de root | /root |
| sudo -i | Conta que executou | Shell de login de root | /root |
| sudo -s | Conta que executou | Shell 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
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 daemonThis 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ída | Causa | O 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 failure | Senha errada | Se é a senha da conta de destino (o sudo pede a sua) |
| su: user user9 does not exist … | Não existe conta com esse nome | getent passwd nome_da_conta |
| user1 is not in the sudoers file. | Conta sem permissão para usar sudo | Configuração do sudoers e grupo wheel |
🔢 FAQ & conteúdo recomendado
Permissões · propriedade
Permissões do Linux (4,2,1) e propriedade | comandos chmod, chown, umask
Artigo sobre como ver e mudar as permissões de leitura, gravação e execução e o dono de arquivos e diretórios.
Usuários e acesso
Comandos who e w do Linux & comando user
Comandos que mostram quais usuários estão conectados ao servidor agora e o que estão executando.
Rede e acesso
Comando SSH: opções e como usar
Artigo sobre a forma básica e as opções do comando ssh, que se conecta a um servidor remoto com uma conta de usuário.
ℹ️ 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.