/ / Як дозволити будь-якому користувачеві на сервері редагувати певний файл? - linux, perl, дозволи, sudo

Як дозволити будь-якому користувачеві на сервері редагувати певний файл? - linux, perl, permissions, sudo

Я створив цей код, який дозволить користувачеві змінити порт у певному файлі,

#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

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

Я спробував усе, що мені відомо, щоб змусити його працювати без судо, але мені це не вдалося.

Будь-яке пропозицію?

Я отримую цю помилку -

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

Відповіді:

0 для відповіді № 1

Ви не можете робити редагування на місці 666 файли всередині /etc як -i switch робить новий файл і видаляє старий у каталозі.

Оскільки користувачі не мають достатніх дозволів на додавання / видалення файлів з /etc (також не було б гарною ідеєю це зробити), вам потрібно прочитати весь вміст файлу одночасно, змінити його та записати назад у той самий файл. Використання тимчасового файлу також є дієвим рішенням.


0 для відповіді № 2

Хоча може здатися, що питання полягає більше в системному адмініструванні, а не в програмуванні, насправді це дещо про 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, які, звичайно, ви не можете надати жодному користувачеві.

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