【问题标题】:Grant write permission to a Perl script when it is called from a shell script regardless of user当从 shell 脚本调用 Perl 脚本时,授予对 Perl 脚本的写入权限,无论用户如何
【发布时间】:2015-05-14 15:03:11
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 目录结构/PATH/PATH/PATH/backup/compressed/FILENAME.tar.gz的权限是什么?因为这里发生的事情是您的脚本正在使用 tar 命令,这意味着您的 perl 很好。
  • drwxrw-rw- 2 USERNAME ncs 4096 May 14 12:46 压缩
  • 好的。尝试在该目录上设置a+x。我认为这将是问题所在。
  • 对不起 Sobrique,我看错了你的问题。 Filename.tar.gz 的权限是 -rw-r--r-- 我只是将它们修改为 -rw-rw-rw-。我曾尝试将写入权限添加到/compressed/文件夹,以为文件夹中的文件会继承权限,不是这样吗?
  • Sobrique,我在文件夹上添加了 a+x,在其中的所有文件上添加了 a+w,脚本运行没有错误,备份工作正常!谢谢!!

标签: perl permissions


【解决方案1】:

好的,根据 cmets,您的问题是:

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

【讨论】:

    【解决方案2】:

    为什么多个用户必须运行此备份过程? ...我根据以前的 cmets 认为问题确实出在结果文件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 个备份(这将是一个好主意)

    我会选择 3,如果你有空间限制,你总是可以说 n=1

    另一个好处是,每当您的进程崩溃时,您总是有一些有效的备份

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2023-03-17
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多