我在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版中写这篇文章
由于
答案 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)正在运行该脚本,则此文件已经创建且无法更改
解决问题的几种方法
chmod 777 compressed/FILENAME.tar.gz
。不是我的偏好原因,任何人都可以错误地删除此文件。 FILENAME20150514-0830.tgz
使用更改的文件名,然后组织清除旧文件以仅保留最后n个备份(这将是一个好主意)我会选择3,如果你有空间限制,你总是可以说n = 1
另外一个好处是,无论何时您的进程崩溃,您总能拥有一些有效的备份