Esvaziar um arquivo para usuário root não funciona [duplicado]

20

Eu uso o comando abaixo para esvaziar um arquivo

> file.txt

Funciona perfeitamente bem! Mas existem alguns arquivos com root de permissões de usuário. Então eu tentei

sudo > different-file.txt

e eu tenho abaixo verbose

usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s]
        [<command>]
usage: sudo -e [-AknS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] file ...

Isso sugere que há algum erro de sintaxe no meu comando.

O que está errado?

    
por Hussain Tamboli 09.09.2014 / 15:26

7 respostas

28

Para esvaziar um arquivo como root, você também pode usar o comando truncate :

$ sudo truncate -s0 file.txt

O -s0 define o tamanho do arquivo como 0, efetivamente esvaziando-o.

    
por 09.09.2014 / 16:30
9

Use sudo -i para se tornar root (com um shell raiz) primeiro.

sudo é usado para executar comandos como root, mas > não é um comando, mas um redirecionamento dentro do shell - nenhum dos quais é executado pelo root.

Digamos que você execute sudo cat foo > bar ...

cat é executado como root e pode acessar e fazer qualquer coisa - incluindo a abertura "foo" mesmo se pertencesse a outro usuário que você e todas as permissões de leitura estivessem desativadas. / p>

Mas > faz parte do shell sudo cat é executado e é executado como você (não raiz) e suas permissões normais. E o arquivo "bar" também é acessado (pelo shell) como seu usuário normal (não-root), então seu usuário normal deve 1) ter permissão de escrita para o diretório ou 2) possuir o arquivo . Se o diretório ou arquivo pertencer a outro usuário (incluindo root), você não poderá acessá-lo.

    
por 09.09.2014 / 15:37
5

Eu criei um novo arquivo chamado new , que agora pertence ao usuário root, como visto abaixo.

ls -lat new
-rw-r--r-- 1 root root 42 Sep  9 13:37 new

Agora, eu entrei como usuário normal e a partir daí tentei apagar o conteúdo deste arquivo usando o comando abaixo.

sudo sh -c " > /root/new"

Agora, posso verificar se o conteúdo foi apagado, fazendo o login novamente como root.

ls -lat new
-rw-r--r-- 1 root root 0 Sep  9 13:42 new

Referências

Esta resposta tem o seguinte a dizer.

Alternatively, you can run sudo sh -c "echo 'text' >> /file.txt", which also works, but is a bit of a hassle with all the interpolation/escaping that can interfere if you have complicated expressions.

No entanto, como você está apenas esvaziando o arquivo, acredito que não haverá complicações no seu caso.

    
por 09.09.2014 / 20:43
3

sudo > different-file.txt lança sudo sem argumentos e redireciona a saída padrão para different-file.txt . (Sudo provavelmente não gera nada para stdout quando nenhum argumento é dado, portanto, se você tivesse permissões para sobrescrever, provavelmente truncaria o arquivo se ele existisse).

Tente cat /dev/null > different-file.txt (a partir de um prompt raiz).

Torne-se root por sudo -i ou sudo /bin/bash

    
por 09.09.2014 / 15:38
3

É difícil e confuso obter sudo e redirecionamento juntos para o trabalho, mas há uma alternativa mais clara:

printf '' | sudo tee file.txt

Não há nada de especial, na verdade:

  • tee trunca os arquivos de saída por padrão sem a opção -a .
  • Grava a entrada de stdin no arquivo.
  • A entrada é a string vazia, portanto, o arquivo é deixado em branco.
  • tee grava uma cópia da entrada na saída, mas a entrada está vazia.
por 09.09.2014 / 15:54
2

sudo deseja executar um programa para você, mas > file.txt não contém um comando. É simplesmente um redirecionamento de saída implícito (aliás, isso não funciona como dado em tcsh , zsh e provavelmente outros).

Mesmo se você passar sudo de um comando válido, como echo ou : (o comando nulo interno), o que você está tentando fazer não funcionará como esperado. Quando você apertar ENTER , seu shell percebe o redirecionamento de saída e tenta abrir o arquivo de destino para gravação, como seu usuário atualmente logado . Se você não tiver permissão de gravação no arquivo, isso falhará, porque o redirecionamento está configurado fora do escopo de sudo .

Para truncar o arquivo, você precisa fazer o redirecionamento em um shell de root.

    
por 09.09.2014 / 15:40
2

Aqui está outra alternativa - caso você esteja procurando por uma ...

sudo cp /dev/null /path/to/soon/to/be/truncated/file
    
por 09.09.2014 / 20:04

Tags