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.
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?
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.
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.
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.
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
É 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
. tee
grava uma cópia da entrada na saída, mas a entrada está vazia. 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.
Aqui está outra alternativa - caso você esteja procurando por uma ...
sudo cp /dev/null /path/to/soon/to/be/truncated/file