Qual é a diferença entre os seguintes comandos:
su
sudo -s
sudo -i
sudo bash
Eu sei, pois su
preciso saber a senha do root e sudo
preciso estar no sudoers
arquivo, 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 da execução su
, mas meu diretório pessoal ainda é /home/myname
posterior sudo -s
. Mas suspeito que isso seja apenas um sintoma de uma diferença subjacente que estou perdendo.
sudo su -
Desse modo, você não precisa da senha root e-
garante que o diretório pessoal esteja definido corretamente.Respostas:
Com
su
, você se torna outro usuário - root por padrão, mas potencialmente outro usuário. Se você dissersu -
, seu ambiente também será substituído pelo ambiente de login desse usuário, de modo que o que você vê é indistinguível de efetuar login como esse usuário. Não há como o sistema saber o que você faz enquanto fazsu
com outro usuário as ações desse usuário quando ele faz login.As coisas são muito diferentes com
sudo
:Os comandos que você executa
sudo
executam como o usuário de destino - root por padrão, mas podem ser alterados com-u
- mas registram 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 tem permissão para executar, por exemplo. Comsu
, é tudo ou nada.Esse recurso geralmente é usado para definir funções. Por exemplo, você pode definir um grupo de "backups" com permissão para execução
dump
etar
, cada um deles precisa de acesso root para fazer o backup adequado do disco do sistema.Menciono isso aqui porque significa que você pode dar
sudo
privilégios a alguém sem dar a elessudo -s
ousudo bash
habilidades. Eles têm apenas as permissões necessárias para realizar seu trabalho, enquantosu
executam todo o sistema. Porém, você deve ter cuidado com isso: se você der a alguém a capacidade de dizersudo vi
, por exemplo, ela pode se livrarvi
e ter efetivamente o mesmo poder que comsudo -s
.Como leva a senha do sudoer em vez da senha root,
sudo
isola a permissão entre vários sudoers.Isso resolve um problema administrativo com o
su
qual é que, quando a senha root muda, todos aqueles que precisavam conhecê-lasu
deveriam ser informados.sudo
permite que as senhas dos sudoers sejam alteradas independentemente. De fato, é comum bloquear com senha a conta do usuário root em um sistemasudo
para forçar a execução de todas as tarefas sysadminsudo
. Em uma organização grande com muitos sudoers confiáveis, isso significa que quando um dos administradores do sistema sai, você não precisa alterar a senha root e distribuí-la aos administradores que permanecerem.A principal diferença entre
sudo bash
esudo -s
é que-s
é mais curta e permite passar comandos para executar no shell padrão do usuário de duas maneiras:Você pode dizer
sudo -s some-command
qual é executadosome-command
sob o seu shell. É basicamente uma abreviação desudo $SHELL -c some-command
.Em vez disso, você pode passar os comandos para a entrada padrão do shell, como
sudo -s < my-shell-script
. Você pode usar isso com um heredoc para enviar vários comandos para uma únicasudo
chamada, evitando a necessidade de digitarsudo
repetidamente.Ambos os comportamentos são opcionais. Muito mais comumente, você cede
-s
sozinho, por isso apenas executa o shell do usuário interativamente. Nesse modo, ele difere desudo bash
que pode executar um shell diferente do quebash
, uma vez que parece primeiro naSHELL
variável de ambiente e, em seguida, se não estiver definido, na configuração do shell de login do usuário, normalmente em/etc/passwd
.O shell executado
sudo -s
herda seu ambiente de usuário atual. Se o que você realmente deseja é um ambiente limpo, como você obtém logo após o login, o que você deseja ésudo -i
uma adição relativamente recente aosudo
. Grosso modo,sudo -i
é osudo -s
quesu -
ésu
: redefine todas, exceto algumas variáveis-chave do ambiente, e envia de volta ao diretório inicial do usuário. Se você também não der comandos para executar sob esse shell via entrada padrão ousudo -i some-command
, ele será executado como um shell de logon interativo, para que os scripts de inicialização do shell do usuário (por exemplo.bash_profile
) sejam executados novamente.Tudo isso torna
sudo -i
consideravelmente mais seguro quesudo -s
. Por quê? Porque se alguém puder modificar seu ambiente antessudo -s
, poderá causar a execução de comandos não intencionais. O caso mais óbvio é a modificaçãoSHELL
, mas também pode acontecer menos diretamente, como viaPAGER
se você disserman foo
enquanto está abaixosudo -s
.Você pode dizer: "Se eles podem modificar
PAGER
, eles podem modificarPATH
e, em seguida, podem simplesmente substituir umsudo
programa maligno ", mas alguém suficientemente paranóico pode dizer/usr/bin/sudo /bin/bash
para evitar essa armadilha. Você provavelmente não é tão paranóico que também evita as armadilhas em todas as outras variáveis de ambiente suscetíveis. Você também se lembrou de verificarEDITOR
, por exemplo, antes de executar qualquer comando VCS ? Assimsudo -i
.Como
sudo -i
também altera o diretório de trabalho para o diretório inicial do usuário, você ainda pode querer usásudo -s
-lo nas situações em que sabe que deseja permanecer no mesmo diretório em que estavacd
quando executousudo
. Ainda é mais segurosudo -i
e decd
volta para onde você estava.fonte
vi
, digite:sh
e pressione Enter. Agora você está em um sub-shell, com todos os privilégios dovi
processo que gerou esse shell. Sevi
estiver executando com privilégios de root, o shell também. Ou, você pode executar algo diferente de um shell via:!cmd
, ler a saída de um comando no buffer de edição via:r !cmd
etc. Se todos estiverem bloqueados, osMakefile
destinos são scripts de shell e o Vim possui o:make
comando, o que efetivamente permite executar shell arbitrário scripts de dentro do editor. As possibilidades de travessuras são imensas demais para que essa caixa de comentários seja mantida./usr/bin/sudo
PATH
não é o único problema.De um post do ubuntuforums que fiz há um tempo:
Considere o seguinte experimento:
Aqui estão as diferenças que encontrei:
Com
sudo -s
:Com
sudo su
:Observe a diferença em
$HOME
. Ser root e ter$HOME
definido 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 pelo root. Isso causa problemas normais ao usuário posteriormente, como não conseguir executar certos aplicativos gráficos por meio do cron.Para resumir:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
provavelmente definido por/etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
A linha inferior
sudo -i
é o comando apropriado para executar quando você deseja um shell raiz que não seja contaminado pelo ambiente do usuário.fonte
sudo
(nos/etc/sudoers
arquivos e nos arquivos relacionados) também. Definições de configuração, comoalways_set_home
,env_reset
,env_keep
,env_check
eenv_reset
, e estes podem variar dependendo do usuário e de comando. Consulte a seção 'Ambiente de comando' e a seção SUDOERS OPTIONS da página de manual sudoers (5) .sudo -Hs
quando quero um ambiente não contaminado pelas minhas configurações, porque uso o zsh e todas as contas de aplicativos que talvez esteja mudando para usar o bash. Isso permite que um certo número de variáveis de ambiente passe sem ser resolvido, mas normalmente acho que as que são importantes são sobrescritas por /etc/profile.d/*.su
( S bruxa u Ser ou s ubstitute u ser) permite alternar usuário.su
basicamente inicia outra instância do shell com os privilégios do usuário pretendido. Por padrão, ele muda para oroot
usuário, se quisermos mudar para um usuário específico, precisamos passar o usuário da seguinte forma:su -
significa que as variáveis de ambiente serão redefinidas para raiz esu
significa variáveis de ambiente como usuário antigo.por exemplo: diretório inicial da raiz, se você usar,
su -
ou diretório inicial do usuário antigo, se você usarsu
.sudo ( s uper u Ser não ) é um utilitário de linha de comando que permite aos usuários executar programas com os privilégios de outro usuário de segurança, 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íficassudo deve ser lido como / ˈsuːduː / . sintaxe,
sudo command
isto é, que você usa e execute este comando.su
é equivalentesudo -i
e simula um login na conta raiz. Seu diretório de trabalho será/root
, e ele lerá o root,.profile
etc. O prompt mudará de $ para #, indicando que você tem acesso root.sudo -s
lança um shell como root, mas não altera seu diretório de trabalho.sudo bash
ondebash
é o comando para executarsudo
. Este comando é executadobash
como um super usuário.sudo
pode ser registrado tudo o que alguém faz.sudo
evita que um usuário precise saber a senha root.sudo
podemos limitar os comandos têm permissão para executar.fonte