Como o root pode fazer isso, mas o sudo não pode? [duplicado]

1

Eu estou configurado como sudoer na minha máquina Debian, e eu uso o tempo todo para instalar o software, etc ... Eu me deparei com essa situação interessante que estou coçando minha cabeça:

Eu tentei ativar a barra de progresso no apt usando este comando:

sudo echo 'Dpkg::Progress-Fancy "1";' > /etc/apt/apt.conf.d/99progressbar

Eu tenho problemas com permissões:

/etc/apt/apt.conf.d/99progressbar: Permission denied

No entanto, se eu su , em seguida, execute o comando, tudo simplesmente funciona.

Por que isso acontece?

    
por Questionmark 18.03.2016 / 20:12

3 respostas

9

Porque

 sudo cmd > file

é interpretado como

(sudo cmd) > file

pelo seu shell. Ou seja o redirecionamento é feito como seu próprio usuário.

A maneira como eu entro nisso é usando

cmd | sudo tee file

Adição: Isso também mostrará a saída de cmd no seu console, se você não quiser que você tenha que redirecioná-lo.

    
por 18.03.2016 / 20:20
2

Até onde eu sei, > é o comando por shell em si (o redirecionamento é feito pelo próprio shell não root) Quando você usa su , ele é executado como um shell raiz que lhe permite redirecionar para arquivos de propriedade da raiz

    
por 18.03.2016 / 20:25
1

sudo tem problemas porque executa a parte do comando. Após o redirecionamento, sudo não é mais efetivo.

Você pode fazer isso em vez disso:

sudo bash -c "Your commands here > output_file"

Escolhendo cuidadosamente as aspas simples ou duplas nos comandos entre aspas, na ordem de aninhamento que você usa.

EDITAR:

Explicação em detalhes um pouco mais detalhados

Quando você executa um script, você está criando um novo sub-shell e seu script é executado neste sub-shell, mas a saída retorna ao shell atual. Seu novo sub-shell no qual você executa esse script é executado com sudo privileges, portanto, os scripts são executados efetivamente como root. Mas quando a corrida termina, o shell sai e seu sudo vai * pooof *. A saída retorna ao seu shell atual sem privilégios. Se você espera que ele seja escrito em um local privilegiado, isso não acontecerá. Portanto, executar o novo shell e toda a enchilada, dentro de um shell bash bem definido, torna isso possível. Porque, neste momento, seu comando e saída são todos manipulados pelo shell sudo ativado, não na metade do que no caso original.

    
por 18.03.2016 / 20:20