Excluindo linha do arquivo usando o SED no caso de vários usuários

0

Eu tenho um cenário em que vários usuários estão conectados a um servidor usando o SSH. Eu tenho um arquivo que é lido e escrito por todos os usuários.

O arquivo contém números como este -

14554
14887
23451
15135
15154
15165
1236
1516
15616
9821
98715

agora é o arquivo que foi criado pelo usuário X e o usuário Y tentou executar o seguinte comando ele recebe um erro:

sed -i '/14554/d' /tmp/file.txt
sed: cannot rename /tmp/sedtm3Vhx: Operation not permitted

As permissões de arquivo são lidas como -

ls -l /tmp/file.txt
-rwxrwxrwx. 1 USERX USERX 63 Apr 25 11:58 /tmp/file.txt

No entanto, se o usuário Y abrir o arquivo, é possível ler / gravar no arquivo. Eu acho que não há permissões para excluir ou renomear o arquivo criado por outro usuário.

Será possível remover esta linha que possui o número 14554 , sem excluir ou renomear o arquivo.

Nota : Sed foi bom porque me daria acesso atômico no caso de vários usuários tentarem ler ou escrever o mesmo arquivo. Esta é uma das razões, eu também não gostaria que o for loops no script bash editasse este arquivo.

Obrigado!

    
por knowledge_seeker 25.04.2013 / 11:48

2 respostas

1

Miguel está certo com o pedaço grudento. Eu reproduzi seu problema em /tmp/ . Não remova o bit adesivo de /tmp . Apenas trabalhe um nível mais profundo em /tmp :

    USERX$ mkdir /tmp/work
    USERX$ chmod a+rwx /tmp/work
    USERX$ echo "aaabbbcccddd" >/tmp/work/file
    USERX$ ls -l /tmp/workdir/file
    -rw-rw-r-- 1 USERX USERX 13 Apr 25 14:59 /tmp/workdir/file

    USERY$ echo "xxx" >/tmp/work/file
    bash: /tmp/workdir/file: Permission denied

Isso falha como '>' tenta abrir o arquivo com acesso RW e truncá-lo e, em seguida, gravar o texto, mas USERY não tem permissão de gravação no arquivo. Mas o sed funcionará:

    USERY$ sed -i 's/a/x/g' /tmp/workdir/file
    USERY$ cat /tmp/workdir/file
    xxxbbbcccddd
    USERY$ ls -l /tmp/workdir/file
    -rw-rw-r-- 1 USERY USERY 13 Apr 25 14:59 /tmp/workdir/file

Bom problema para entender as permissões de arquivo / diretório do Unix.

    
por 25.04.2013 / 14:56
1

Você tem acesso rwx no arquivo, o que significa que você pode editar seu conteúdo. No entanto, o que você está tentando fazer com o sed é armazenar as coisas em um arquivo temporário e renomear o arquivo sedtm3Vhx.txt para o arquivo.txt. Você não está alterando o conteúdo de file.txt, você está alterando a entrada de diretório para file.txt para apontar para o conteúdo de sedtm3Vhx.txt e que requer acesso de gravação ao pai pasta.

Além disso, se você está usando realmente /tmp e isso não é um exemplo, você precisa lidar com permissões especiais, já que /tmp/ é por padrão pegajoso

ATUALIZAÇÃO: Quanto pegajoso e os comentários abaixo. Se você está em /tmp , não consigo reproduzir seu problema. Aqui:

tester@mypc:/tmp$ echo "hi" > text.txt
tester@mypc:/tmp$ chmod a+w text.txt 
tester@mypc:/tmp$ ls -l text.txt 
-rw-rw-rw- 1 tester tester 3 Apr 25 13:57 text.txt
tester@mypc:/tmp$ exit
miquel@mypc:/tmp$ echo bye > text.txt 
miquel@mypc:/tmp$ sed -i s/bye/hello/ text.txt 
miquel@mypc:/tmp$ ls -l text.txt 
-rw-rw-rw- 1 miquel miquel 6 Apr 25 13:58 text.txt
miquel@mypc:/tmp$ ls -ld /tmp
drwxrwxrwt 11 miquel miquel 3551232 Apr 25 13:58 /tmp

Então você pode alterar o conteúdo do arquivo e substituí-lo por sed, ou você não pode fazer nada ...

    
por 25.04.2013 / 12:03

Tags