Como posso cancelar a gravação do arquivo protegido pelo tee?

1

Eu tenho um pequeno programa e quero garantir que ele funcione tanto em arquivos protegidos contra gravação quanto em arquivos não-protegidos. Portanto, em vez de usar echo $text > $file ou echo $text >> $file , sou forçado a usar echo $text | sudo tee $file e echo $text | sudo tee --append $file , respectivamente. Quando eu uso sudo tee , mesmo se eu alterar as permissões, sempre que eu usar rm no arquivo, ele me pede assim:

$ ls
someFile writeProtectedFile
$ rm someFile
$ ls
writeProtectedFile
$ rm writeProtectedFile
rm remove write-protected regular file 'writeProtectedFile'? yes
$ ls

Eu, então, procurei na web, procurando possíveis soluções para o meu dilema. Havia apenas dois que eu poderia encontrar: permissões incorretas ou um conjunto alterado de permissões. Eu sabia que o caso de permissões estava incorreto, porque eu poderia facilmente alterar as permissões executando sudo chmod xxx filename , o que resultaria em uma alteração de permissões bem-sucedida. Eu assumi então que havia um problema com os atributos de arquivo, então eu corri lsattr no arquivo e ele produziria -------------e-- , o mesmo que todos os outros arquivos no diretório.

Atualizar

O motivo pelo qual eu estava usando tee foi ecoar texto para gravar arquivos protegidos, mas como efeito colateral ele também escreve arquivos regulares protegidos ... Meu objetivo era, na verdade, fazer algo como sudo echo "whatever" >> /etc/someFile , que não funciona, então encontrei uma solução em echo "whatever" | sudo tee /etc/someFile .

    
por Interesting... 22.07.2015 / 13:36

3 respostas

4

O comando tee , quando passou um arquivo não existente como parâmetro, criará esse arquivo antes de gravar a saída nele. Ao prefixar esse comando com sudo , você está pedindo ao shell para executar o comando tee como root . A consequência é que o arquivo criado por tee é de propriedade do usuário que está iniciando o comando: root e, portanto, é somente leitura para outros usuários. Você mesmo poderá ver isso se executar ls -l e examinar as colunas user e group .

$ rm -f writeProtectedFile # Removing the file in case it already exists
$ echo $text | sudo tee writeProtectedFile
yourtext
$ ls -l
total 4
-rw-r--r-- 1 root root 9 22.07.2015 14:26 writeProtectedFile

Existem várias opções para superar isso:

  • Crie o arquivo como um usuário padrão antes de solicitar que tee grave nele. tee truncará ou simplesmente --append , sem alterar a propriedade:

    $ touch writeProtectedFile # creates the file as standard user
    $ echo $text | sudo tee writeProtectedFile
    $ rm writeProtectedFile
    
  • Altere a propriedade do arquivo antes de tentar excluí-lo:

    $ echo $text | sudo tee writeProtectedFile
    $ sudo chown $(whoami) writeProtectedFile # 'whoami' returns the current user name
    $ rm writeProtectedFile
    
  • Diga a rm para ignorar o fato de que o arquivo está protegido contra gravação, usando -f, --force :

    $ echo $text | sudo tee writeProtectedFile
    $ rm --force writeProtectedFile
    
por 22.07.2015 / 14:33
0

Se o arquivo que você está criando estiver em /etc , você não poderá removê-lo mesmo assim. Ou seja, se somos usuários regulares, e fazemos isso:

$ sudo touch /etc/foobar
$ rm /etc/foobar

O touch funcionará, mas o rm falhará, porque não temos permissões de gravação para o diretório /etc .

No nível do kernel do sistema operacional, as permissões de gravação em um arquivo são irrelevantes em relação à sua exclusão (ou renomear / mover). O aviso sobre a exclusão de um arquivo protegido contra gravação é apenas um recurso no nível do aplicativo criado no programa rm . Quando você diz y para o prompt, rm faz uma chamada para o sistema operacional (provavelmente a função unlink ) para explodir o arquivo, sem alterar suas permissões primeiro. (Observe que, como você não possui o arquivo, alterar suas permissões nem é permitido!)

No entanto, qualquer coisa que altere o conteúdo de um diretório (como adicionar ou remover um arquivo) requer permissões de gravação para o diretório.

Então, em resumo, a coisa a fazer aqui é:

$ sudo rm -f /etc/foobar

O sudo a ser raiz, para ter acesso de gravação necessário a /etc e -f para suprimir o prompt de rm .

    
por 24.07.2015 / 00:19
-1

Você diz que sua meta é o equivalente a

sudo echo "whatever" >> /etc/someFile

mas com o redirecionamento >> também deu privilégios de root. Você já considerou esta alternativa

sudo sh -c "echo 'whatever' >> /etc/someFile"

Eu usei aspas duplas em torno da expressão para que as variáveis do shell (se houver) sejam interpoladas antes de sudo sh ser chamado, em vez de tentar atrasar a avaliação do sh . Isso ocorre principalmente porque sudo reduz o ambiente, portanto algumas variáveis podem não existir e outras podem ter sido redefinidas. Por exemplo, $$ apresentará o pid do chamador em vez daquele do sh .

    
por 24.07.2015 / 00:01