2015-07-04 2 views
1

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

#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: Разрешение отказано, пропуск файла.

+0

Это ошибка «Не удается удалить /etc/ports.txt: Разрешить отказ, пропустить файл». – Harsh

+0

Это похоже на проблему xy. Вы спрашиваете о perl, когда проблема связана с разрешениями. – Sobrique

+0

Да, я знаю, что его о разрешении, не совсем уверен, как его исправить:/ – Harsh

ответ

0

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

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

+0

Для минимального усилия от вашего имени вы можете сделать символическую ссылку в/etc в какой-либо каталог/файл, где ваши пользователи имеют достаточные разрешения, то есть. 'ln -s /some_folder/ports.txt/etc /' –

+0

Это все еще не работает, я попытался /ports.txt, я попытался /var/ports.txt по-прежнему ту же ошибку Не удается удалить /var/ports.txt: Разрешение отклонено, пропуская файл. – Harsh

+0

@ Сначала сначала убедитесь, что ваши пользователи могут писать в каталог. Я очень сомневаюсь, что '/' и '/ var' являются одним из них. –

0

Хотя может показаться, что вопрос скорее связан с системным администрированием, чем с программированием, на самом деле это примерно что-то вроде 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 , которые, конечно же, вы не можете дать никому.

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

+0

Он по-прежнему не работает, я попытался /ports.txt, я попробовал /var/ports.txt по-прежнему ту же ошибку Не удается удалить /var/ports.txt: разрешение отклонено, пропущен файл. также я требую этого, потому что это полностью автоматизированный скрипт, и это небольшая его часть, которую я должен запускать без sudo или root. – Harsh

+0

Вы пропустили точку доступа к каталогам.Ваш скрипт должен работать без изменений, если вы используете, например, '/ var/tmp/ports.txt', поскольку у каждого есть доступ на запись к'/var/tmp'. Но если вы хотите использовать каталог не-777, измените свой сценарий, чтобы избежать редактирования на месте ('perl -i'). – afenster

Смежные вопросы