如何允许服务器上的任何用户编辑特定文件?

How to allow any user on the server to edit a specific file?

我创建了这段代码,允许用户更改特定文件中的端口,

#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 的情况下使它工作,但我没有做到。

有什么建议吗?

我收到这个错误 -

Can't remove /etc/ports.txt: Permission denied, skipping file.

虽然看起来问题更多是关于系统管理而不是关于编程,但它实际上是关于 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 的写入权限,当然您不能将其授予任何用户。

所以我想您不需要尝试使用就地编辑,因为它总是与删除或重命名文件相关,而是获取文件的内容,进行必要的更改,然后将其写回同一个文件。

您不能对 /etc 内的 666 文件进行就地编辑,因为 -i 开关会生成新文件并删除目录内的旧文件。

由于用户没有足够的权限访问 /etc 中的 add/delete 文件(这样做也不是个好主意),您必须一次读取所有文件内容,更改它, 并写回同一个文件。使用临时文件也是一个可行的解决方案。