Как разрешить любому пользователю на сервере редактировать определенный файл?

Я создал этот код, который позволит пользователю изменить порт в определенном файле,

#Change Port
IRSSIPORT1=`head -n 1 /etc/ports.txt | tail -n 1`
sudo perl -pi -e "s/^$IRSSIPORT1.*\n$//g" /etc/ports.txt
sudo perl -pi -e "s/web_port = 8081/web_port = $IRSSIPORT1/g" .sickbread/config.ini
echo "sickbread Port: $IRSSIPORT1" | sudo tee -a $HOME/private/SBinfo.txt

Что делает этот код, так это то, что он берет число из файла, а затем помещает его в файл конфигурации, где требуется изменить, и удаляет это число из исходного файла, откуда он его взял, но для этого требуется доступ для чтения, а также доступ для записи ,

Я перепробовал все, что знал, чтобы заставить его работать без sudo, но мне это не удалось.

Любое предложение?

Я получаю эту ошибку -

Невозможно удалить /etc/ports.txt: доступ запрещен, файл пропущен.


person Harsh    schedule 04.07.2015    source источник
comment
Это ошибка Невозможно удалить /etc/ports.txt: Отказано в доступе, пропуск файла.   -  person Harsh    schedule 04.07.2015
comment
Это похоже на проблему xy. Вы спрашиваете о Perl, когда ваша проблема заключается в разрешениях.   -  person Sobrique    schedule 04.07.2015
comment
Да, я знаю, что речь идет о разрешении, не совсем уверен, как это исправить :/   -  person Harsh    schedule 04.07.2015
comment
попробовал оба, я не могу установить sudo, так как я требую, чтобы все пользователи использовали его, что касается chmod, который я пробовал, 777 все еще не работает.   -  person Harsh    schedule 04.07.2015
comment
Этот вопрос больше подходит для superuser.com или unix.stackexchange.com   -  person TLP    schedule 04.07.2015


Ответы (2)


Вы не можете выполнять редактирование на месте 666 файлов внутри /etc, поскольку переключатель -i создает новый файл и удаляет старый внутри каталога.

Поскольку у пользователей нет достаточных прав для добавления/удаления файлов из /etc (да и не было бы хорошей идеей делать это), вы должны читать все содержимое файла сразу, изменять его и записывать обратно в тот же файл. Использование временного файла также является рабочим решением.

person mpapec    schedule 04.07.2015
comment
Для минимальных усилий с вашей стороны вы можете сделать символическую ссылку в /etc на какой-либо каталог/файл, где у ваших пользователей есть достаточные разрешения, т.е. ln -s /some_folder/ports.txt /etc/ - person mpapec; 04.07.2015
comment
Это все еще не работает, я пробовал /ports.txt, я пробовал /var/ports.txt, все та же ошибка. Не могу удалить /var/ports.txt: Отказано в доступе, пропуск файла. - person Harsh; 04.07.2015
comment
@Harsh сначала убедитесь, что ваши пользователи могут писать в каталог. Я очень сомневаюсь, что / и /var являются одними из них. - person mpapec; 04.07.2015
comment
БОЛЬШОЕ СПАСИБО ^_^... Отлично сработало, создал новую папку с именем /port и выполнил команду chmod 777. - person Harsh; 05.07.2015

Хотя может показаться, что вопрос скорее о системном администрировании, чем о программировании, на самом деле он в некоторой степени касается perl, так что это может быть подходящим местом для него здесь.

Выполнение chmod 666 /etc/ports.txt предоставляет всем пользователям доступ для чтения и записи к этому конкретному файлу (конечно, вам не нужно ставить 777, поскольку это не исполняемый файл или скрипт). Так что любой желающий сможет открыть этот файл для записи и поместить в него любое содержимое.

Но когда вы делаете perl -pi -e ... /etc/ports.txt, вы не только записываете в этот файл. Вместо этого perl захочет удалить, а затем воссоздать этот файл, как показано здесь в выводе strace:

# strace perl -pi -e 's/a/b/' /etc/ports.txt 2>&1 | grep /etc/ports.txt
...
open("/etc/ports.txt", O_RDONLY)        = 3
unlink("/etc/ports.txt")                = 0
open("/etc/ports.txt", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4

Для удаления файла ему нужно будет иметь доступ на запись не к самому файлу, а к директории /etc, которую вы, конечно же, не можете дать ни одному пользователю.

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

person afenster    schedule 04.07.2015
comment
Это все еще не работает, я пробовал /ports.txt, я пробовал /var/ports.txt, все та же ошибка. Не могу удалить /var/ports.txt: Отказано в доступе, пропуск файла. также мне это нужно, потому что это полностью автоматизированный скрипт, и это небольшая его часть, которую мне нужно запустить без sudo или root - person Harsh; 04.07.2015
comment
Вы пропустили пункт о правах доступа к каталогам. Ваш скрипт должен работать без изменений, если вы используете, например, /var/tmp/ports.txt, так как у всех есть доступ на запись к /var/tmp. Но если вы хотите использовать каталог, отличный от 777, измените свой сценарий, чтобы избежать редактирования на месте (perl -i). - person afenster; 05.07.2015