从 shell 脚本调用时授予对 Perl 脚本的写入权限,无论用户如何

Grant write permission to a Perl script when it is called from a shell script regardless of user

我在 Bash shell 脚本中有一个函数,该函数在脚本启动时调用。该函数对数据文件执行排序,然后调用 Perl 脚本,该脚本检查是否需要执行脚本和数据文件的备份,如果需要,Perl 脚本会进行备份,然后压缩备份目录中的所有备份。 Bash 和 Perl 脚本在我 运行 Bash 脚本时工作正常,但其他用户收到从 Perl 脚本返回的错误,表明他们没有写入文件的权限。 如何提升 Perl 脚本的权限,以便任何用户都可以写入目录?我有要写入文件的目录,所有用户都具有读写权限,但用户在打开 Bash 脚本时仍然会收到此错误。

tar: /absolute/path/to/file/location/filename.tar.gz: Cannot >open: Permission >denied tar: Error is not recoverable: exiting now

这是 Bash 脚本中调用 Perl 脚本的函数

sourcefile(){
# sorts the script source file in alphabetical order each time the script runs.
sort /absolute/path/to/data-file.txt -o /absolute/path/to/data-file.txt
#
# Calls a perl script to run backups of the script and data files.
/absolute/path/to/location/./scrpt_maint.prl
#       
}  

这是创建备份的 Perl 脚本

#!/usr/bin/perl 
##
use strict; 
use warnings;
## 
use File::stat;
use Time::localtime;
use Time::Local;
use File::Copy;
##
my $source = "/PATH/PATH/PATH/backup/FILENAME.sh.bak";
my $today = time;
my $modtime = (stat($source)->mtime);
my $interval = 86400; #- =24 hours in seconds
my $delta = ($today - $modtime);
#
# my $interval = 30; #- =30 second intervals for testing
# 
my $SRC_SCRIPTS = "/PATH/PATH/PATH/";
my $TARGET_SCPTS = "/PATH/PATH/PATH/backup/";
#
###############################

if ( $delta >= $interval ) {
                &backup;
                system "tar -czf     /PATH/PATH/PATH/backup/compressed/FILENAME.tar.gz -C /     /PATH/PATH/PATH/backup/compressed";


}
#
sub backup {
#
opendir(my $SCRIPTS, $SRC_SCRIPTS ) || die "can't opendir $SRC_SCRIPTS: $!"    ;

my @SCRIPTS = readdir($SCRIPTS);

foreach my $t (@SCRIPTS)
{ 
        if( -f "$SRC_SCRIPTS/$t" ) {
                copy "$SRC_SCRIPTS/$t", "$TARGET_SCPTS/$t.bak" || warn "Copy     of $t to $TARGET_SCPTS failed: $!";
                }
}

}
#
exit;

我绝不是 Shell 或 Perl 专家,所以如果这些内容草率或不是最佳实践,那就是原因。我不是管理员,没有 linux 服务器的根访问权限。我在 Red Hat Enterprise Linux AS release 4

中写这篇文章

谢谢

好的,根据评论,您的问题是:

drwxrw-rw- 2 USERNAME ncs 4096 May 14 12:46 compressed 

Filename.tar.gz 的权限是,-rw-r--r-- 我只是将它们更改为 -rw-rw-rw

解决方案是:

chmod a+x compressed
chmod a+rw Filename.tar.gz

为什么多个用户必须 运行 这个备份过程? ...根据之前的评论,我认为问题确实出在结果文件上 compressed/FILENAME.tar.gz

您的压缩目录的权限是 drwxrw-rw- 这很好 => 任何人都可以在其中写入文件。将创建的文件(假设由 user1 创建)将由 user1 拥有,并具有由 umask 为 user1 设置定义的权限,通常为:

[~]=> umask -S
u=rwx,g=rx,o=rx

然后,如果另一个用户(假设 user2)正在 运行创建脚本,则此文件已经创建且无法更改

解决问题的几种方法

  1. 您可以在 tar 命令后添加 chmod 777 compressed/FILENAME.tar.gz。不是我喜欢的原因,任何人都可以错误地删除这个文件。
  2. 限制此脚本 运行 只能由一个用户使用
  3. 或使用像 FILENAME20150514-0830.tgz 这样基于时间的更改文件名,然后组织清理旧文件以仅保留最后 n 个备份(这将是一个好主意)

我会选择 3,如果你有 space 约束,你总是可以说 n=1

额外的优势还在于,每当您的进程崩溃时,您总会有一些有效的备份