Erro no FreeBSD sed - Eu tenho permissões, mas “Permission denied”

0

Permissões:

ls -al file
-rwxrwxr-x  1 root  wheel 

Grupo de usuários:

groups
wheel 

Se eu fizer isso:

sed -i'' -e '/Marker/i\'$'\n''text string'$'\n' file 

Eu recebo um erro:

sed: ../file: Permission denied

Mas ao mesmo tempo eu posso ler, escrever e executar este arquivo. Como mostrado nas permissões.

Por que o sed não está funcionando? Eu uso o mesmo usuário e o mesmo arquivo. Ok, o proprietário é root, mas eu li e escrevo permissões

 uname -a
FreeBSD srv 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016     [email protected]:/usr/obj/usr/src/sys/GENERIC  amd64
    
por Родинка 15.01.2018 / 08:28

2 respostas

0

Portanto, o problema foi com o caminho pai, onde o script está localizado. Eu acho (eu realmente não sei como sed funciona), sed tentou criar um arquivo clon para adicionar uma seqüência de texto e não pode por causa de 755 caminho permissões. 775 resolveu o problema.

    
por 15.01.2018 / 12:36
2
sed -i'' -e ... file 

O BSD sed requer um argumento para -i , ao contrário do GNU sed que aceita um argumento opcional para ele.

Página do man do FreeBSD sed :

-i    extension     

Edit files in-place similarly to -I

vs. Página man do GNU sed :

  -i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if SUFFIX supplied)

Observe os colchetes ou a falta deles.

Além disso, no shell -i'' é o mesmo que apenas -i , as aspas em torno de uma string vazia são removidas.

Então, o que sed acha que você está pedindo é criar um arquivo de backup com a extensão -e e, a menos que tenha permissão de gravação para o diretório, você não poderá fazer isso. / p>

Mesmo sem um argumento ou com um argumento vazio para -i , sed provavelmente criará um arquivo temporário onde grava a saída resultante antes de movê-la para o nome original. Pelo menos o GNU sed cria o arquivo temporário no mesmo diretório que o original, então, novamente, você precisa ter permissão de escrita para esse diretório.

$ strace -etrace=open,rename sed -i -e '1d' foo
[...]
open("foo", O_RDONLY)                   = 3
open("./sedD9J9tV", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedD9J9tV", "foo")            = 0

Para contornar isso, você pode criar um arquivo temporário em outro lugar e depois mover seu conteúdo para o local:

$ sed -e '...' file > /tmp/file.tmp
$ cat /tmp/file.tmp > file && rm /tmp/file.tmp
    
por 15.01.2018 / 08:35