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

时间:2015-05-14 15:03:12

标签: bash perl shell permissions

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

  

tar:/absolute/path/to/file/location/filename.tar.gz:无法>打开:权限>拒绝   tar:错误无法恢复:现在退出

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

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服务器的root访问权限。我在Red Hat Enterprise Linux AS第4版中写这篇文章

由于

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

为什么有几个用户必须运行此备份过程? ...我正在根据以前的评论思考问题确实存在于结果文件compressed/FILENAME.tar.gz

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

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

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

解决问题的几种方法

  1. 您可以在tar命令后添加chmod 777 compressed/FILENAME.tar.gz。不是我的偏好原因,任何人都可以错误地删除此文件。
  2. 限制此脚本仅由一个用户运行
  3. 或根据时间FILENAME20150514-0830.tgz使用更改的文件名,然后组织清除旧文件以仅保留最后n个备份(这将是一个好主意)
  4. 我会选择3,如果你有空间限制,你总是可以说n = 1

    另外一个好处是,无论何时您的进程崩溃,您总能拥有一些有效的备份