У меня есть сценарий, когда несколько пользователей подключены к серверу с использованием SSH. У меня есть файл, который читают и пишут все пользователи.

Файл содержит цифры, как это -

14554
14887
23451
15135
15154
15165
1236
1516
15616
9821
98715

Теперь, когда файл был создан пользователем X а пользователь Y попытался выполнить следующую команду, он получил ошибку:

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

Файл разрешений читается как -

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

Однако, если пользователь Y открывает файл, его можно читать / записывать в файл. Я думаю, что нет никаких прав, чтобы удалить или переименовать файл, созданный другим пользователем.

Удастся ли удалить эту строку, имеющую номер 14554 , без удаления или переименования файла.

Примечание : Sed был хорош, потому что он предоставил бы мне атомарный доступ в случае, если несколько пользователей пытаются прочитать или записать один и тот же файл. Это одна из причин, мне также не хотелось бы, чтобы циклы for в скрипте bash редактировали этот файл.

Спасибо !

2 ответа2

1

У вас есть доступ к файлу rwx, что означает, что вы можете редактировать его содержимое. Однако то, что вы пытаетесь сделать с помощью sed, - это сохранить вещи во временный файл, а затем переименовать файл sedtm3Vhx.txt в file.txt. Вы не изменяете содержимое файла file.txt, вы изменяете запись каталога для file.txt, чтобы он указывал на содержимое файла sedtm3Vhx.txt, и для этого требуется доступ на запись в родительскую папку.

Кроме того, если вы используете действительно /tmp а это не пример, вам нужно бороться со специальными разрешениями, так как /tmp/ по умолчанию является липким

ОБНОВЛЕНИЕ: Относительно липкого и комментариев ниже. Если вы находитесь в /tmp , я не могу воспроизвести вашу проблему. Вот:

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

Так что либо вы можете изменить содержимое файла и заменить его на sed, либо вы не можете ничего сделать ...

1

Мигель прав в этом вопросе. Я воспроизвел вашу проблему в /tmp/ . Не удаляйте липкий бит из /tmp . Просто работайте на один уровень глубже в /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

Это не удается, так как «>» пытается открыть файл с доступом RW и обрезать его, а затем записать текст, но USERY не имеет разрешения на запись в файл. Но sed будет работать:

    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

Хорошая проблема, чтобы понять Unix файл / каталог разрешений.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .