非root linux用户拥有一个文本文件,该文件位于/等
,其中非root linux用户没有创建文件的权限。非root linux用户可以通过vi手动编辑文件,而不会出现问题。通过编程和手动尝试使用替换文件中的文本字符串sed-i
,perl-i型
,以及其他目录内临时文件方法由于非root linux用户运行文本重新放置脚本时的权限问题而失败。我在Perl Cookbook(后面会提到)中找到了一个解决方案,但它涉及到警告,而且目前看起来有点超出我的能力。有人能建议一个更简单的选择吗?
服务器信息:
cat/etc/os释放
:Oracle Linux服务器8.9
找到对应内核版本
:Linux server01.domain.com 5.4.17-2136.322.6.4.el8uek.x86_64
perl语言:(v5.26.3)为x86_64-linux-thread-multi构建
标准偏差:(基于GNU)4.5
awk(哇):GNU Awk 4.2.1,API:2.0(GNU MPFR 3.1.6-p2,GNU MP 6.1.2)
不及物动词:VIM-Vi IMproved 8.0(2016年9月12日,编译于2022年8月5日07:42:15)
要编辑的文件位置:/等
上的权限/等
:
drwxr-xr-x 130根12288 6月21日11:50等
要编辑的文本文件:/etc/targetfile(等/目标文件)
-rw-rw-r--1 justauser组1 1864年6月19日10:52目标文件
文件长度/etc/targetfile(等/目标文件)
最多可以有200行,每行大约50个字符。
示例/缩写/etc/targetfile(等/目标文件)
内容:
f1112:/dir1/dir2/59.35:N#注释f3332:/dir1/dir2/59.35:N#注释f4442:/dir1/dir2/59.35:N#注释f555:/dir1/dir2/59.35:N#注释f666s2:/dir1/dir2/59.35:N#注释f777s2:/dir1/dir2/59.35:N#注释
目标:在/etc中的targetfile中,以编程方式将/dir1/dir2/59.35更改为/dir1/dir2/59.77,其中运行脚本的非root用户是“justauser”,他没有在/etc.中创建文件的权限。
约束条件:
- 无法更改/etc上的权限。
- 无法升级现有的服务器程序/实用程序。
- 所有程序/命令都必须从bash shell脚本中调用。
- bash shell脚本必须以“justauser”而不是root身份执行。
- 强烈建议不要使用sudo。
其他:
以linux用户“justauser”身份登录时,命令行编辑/etc/targetfile(等/目标文件)
使用vi很好。命令,如sed-i
和perl-i型
失败,因为“justauser”在/etc中缺少创建临时文件的写入权限。
perl-i-p-e的/f4442:\/dir1\/dir2\/59.35:N/f4442:\/dir1\\/dir2\\/59.77:N/g’/etc/targetfile--无法删除/etc/targetfile:权限被拒绝,正在跳过文件。sed-i的/f4442:\/dir1\/dir2\/59.35:N/f4442:\/dir1\\/dir2\\/59.77:N/'/etc/targetfile--sed:sed:无法打开临时文件/etc/sedO2SLSF:权限被拒绝
粗略的预期用途示例(静态值替换变量):#!/垃圾桶/垃圾桶...函数编辑配置(_E){echo“正在编辑目标文件…”perl-i-p-e的/f4442:\/dir1\/dir2\/59.35:N/f4442:\/dir1\\/dir2\\/59.77:N/g’/etc/targetfile如果[$?-ne 0]然后echo“_editConfig函数出错。正在终止程序”退出代码=1fi(菲涅耳)}...
看到的选项:
Perl Cookbook 7.10在不使用临时文件的情况下就地修改文件:
open(F,“+<$infile”)或die“无法读取$infile:$!”;$out=“”;同时(<F>){s/DATE/localtime/eg;$out.=$;}seek(F,0,0)或die“无法查找$infe:$的开头!”;打印F$out或死亡“无法打印到$infile:$!”;truncate(F,tell(F))或die“无法截断$infe:$!”;close(F)or die“无法关闭$infile:$!”;...“这种方法是为真正有决心的人准备的。它更难写,占用更多内存(可能更多),不保留备份文件,并且可能会混淆其他尝试读取正在更新的文件。因此,在大多数情况下,我们认为这可能不值得。”
最终意见:
是否有一个就地编辑选项不使用比Perl Cookbook示例更简单的目录内临时文件?
对于Perl初学者来说,Perl Cookbook示例有点难理解,它还需要一些修改/转换。。。我想。。。在bash脚本的主体中工作。