Não é possível gravar no arquivo com permissão de gravação

5

Eu tenho este arquivo:

$ ls -lrta ~/.bash_profile
-rwxr-x---. 1 xxx xxx 904 May 23 15:36 /home/xxx/.bash_profile
$

Sou o proprietário do arquivo e tenho permissão de gravação. Quando tento editar (apague a última linha, por exemplo) o arquivo recebi um erro,

$ sed -i '$ d' .bash_profile
sed: cannot rename ./sedxkZezg: Operation not permitted
$

Anexar um texto usando cat pode gravar com sucesso no arquivo.

$ cat >> .bash_profile
  writing
  ^D
$

Eu vi o texto anexado assim,

$ cat .bash_profile
... <some text> ...
writing
$

O erro também ocorre quando edito o arquivo usando um editor de texto (vi).

Alguém pode explicar por que não consigo escrever o arquivo apesar de ter permissão de gravação?

Aqui estão algumas informações do sistema que estou usando:

$ uname -svr
Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012

UPDATE :

Aqui está o que eu tentei até agora:

$ sed -i '$ d' .bash_profile > file && mv file .bash_profile
sed: cannot rename ./sedm89Ym2: Operation not permitted

$ lsattr ~/.bash_profile
lsattr: Inappropriate ioctl for device While reading flags on /home/xxx/.bash_profile

$ getfact ~/.bash_profile
getfacl: Removing leading '/' from absolute path names
# file: xxx/xxx/.bash_profile
# owner: xxx
# group: xxx
user::rwx
group::r-x
other::---
$
    
por e19293001 23.05.2013 / 11:11

3 respostas

3

sed -i ... file

na verdade faz algo como:

sed ... file > some-temp-file &&
  mv some-temp-file file

Esse último mv faz um rename . Isso é sed -i não edita o arquivo no lugar, ele o substitui por uma cópia modificada de si mesmo.

Aqui está a renomeação que está bloqueada. Ele não está bloqueado devido a problemas de permissão (você receberia uma mensagem de erro permissão negada se estivesse), mas parece que há alguma restrição administrativa para desvincular o inode do seu ~ / .bash_profile ( como algum tipo de controle de acesso obrigatório do SELinux) ou para o caminho para esse arquivo (como algum tipo MAC do AppArmor).

Provavelmente você pode encontrar mais pistas em algum lugar dos registros.

getfattr -dm- ~/.bash_profile

listaria todos os atributos estendidos (ACLs, contextos de segurança) do arquivo.

lsattr ~/.bash_profile

para potencialmente mais atributos do Linux.

    
por 23.05.2013 / 11:51
3

O '.' no final da saída das permissões ls , há dados estendidos de algum tipo. chattr(1) fornece a lista de atributos para ext? sistemas de arquivos, lsattr(1) lista os atuais. Além disso, verifique a ACL do arquivo ( getfacl(1) ). Uma política de segurança (como o SELinux) também pode proibir algumas operações no arquivo.

    
por 23.05.2013 / 15:43
0

Provavelmente você não tem permissão de gravação do diretório pai (o que é estranho porque é a sua casa)

De qualquer forma, você pode fazer:

$ ls -la ~
    
por 23.05.2013 / 11:31