【问题标题】:How to allow any user on the server to edit a specific file?如何允许服务器上的任何用户编辑特定文件?
【发布时间】:2015-07-04 10:50:36
【问题描述】:

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

#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:权限被拒绝,正在跳过文件。

【问题讨论】:

  • 这是错误“无法删除 /etc/ports.txt:权限被拒绝,正在跳过文件。”
  • 这感觉像是一个 xy 问题。当您的问题是权限时,您正在询问 perl。
  • 是的,我知道它与权限有关,不确定如何修复它:/
  • 两者都试过了,我无法设置 sudo,因为我要求所有用户都使用它,因为 chmod 我试过 777 仍然无法工作。
  • 这个问题可能更适合superuser.comunix.stackexchange.com

标签: linux perl permissions sudo


【解决方案1】:

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

由于用户没有足够的权限从/etc 添加/删除文件(这样做也不是好主意),您必须一次读取所有文件内容,更改它,然后写回同一个文件。使用临时文件也是一种可行的解决方案。

【讨论】:

  • 为了您的努力,您可以在 /etc 中创建一个符号链接到您的用户具有足够权限的某个目录/文件,即。 ln -s /some_folder/ports.txt /etc/
  • 还是不行,我试过 /ports.txt,我试过 /var/ports.txt 还是一样的错误 Can't remove /var/ports.txt: Permission denied, skipping file.
  • @Harsh 首先确保您的用户可以写入目录。我非常怀疑//var 是其中之一。
  • 非常感谢 ^_^...创建了一个名为 /port 的新文件夹并将其更改为 777
【解决方案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的写入权限,当然您不能将其授予任何用户。

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

【讨论】:

  • 它仍然无法工作,我尝试了 /ports.txt,我尝试了 /var/ports.txt 仍然是同样的错误无法删除 /var/ports.txt:权限被拒绝,正在跳过文件。我也需要这个,因为它是完全自动化的脚本,它只是其中的一小部分,我需要在没有 sudo 或 root 的情况下运行
  • 您错过了有关目录权限的要点。如果您使用例如/var/tmp/ports.txt,您的脚本应该无需更改即可运行,因为每个人都可以写入/var/tmp。但如果您想使用非 777 目录,请更改脚本以避免就地编辑 (perl -i)。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多