Я створив цей код, який дозволить користувачеві змінити порт у певному файлі,
#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
, які, звичайно, ви не можете надати жодному користувачеві.
Тож, гадаю, вам просто не потрібно намагатися використовуватиредагування на місці, оскільки воно завжди пов'язане з видаленням або перейменуванням файлів, але замість цього отримуємо вміст файлу, вносимо необхідні зміни та записуємо назад у той самий файл.