我创建了这段代码,允许用户更改特定文件中的端口,
#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 :(得分: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
目录,当然,您无法向任何用户提供。
所以我想你不需要尝试使用就地编辑,因为它总是与删除或重命名文件有关,而是获取文件的内容,进行必要的更改然后写它回到同一个文件。
答案 1 :(得分:0)
您无法对666
内的/etc
文件进行现场编辑,因为-i
开关生成新文件并删除目录中的旧文件。
由于用户没有足够的权限来添加/删除/etc
中的文件(这也不是一个好主意),您必须立即读取所有文件内容,进行更改并回写到同一个文件。使用临时文件也是一种可行的解决方案。