$var = "/nfs/sc/disks/darshils/scripts/";
这里$var
是一个字符串
system 'rsync -av $var/.*pl /scripts/';
在perl lang中使用系统命令,我可以执行任何unix命令
那样可以在rsync命令中使用$ var吗? 或以其他方式在rsync命令中使用$ var?
答案 0 :(得分:3)
您可以让您的system
通话更加安全。
system
有两种形式。字符串形式为system
提供一个参数。然后,shell解释该字符串以弄清楚该怎么做。这可能与插值变量的目的不同。 $var
是什么,类似于; rm -rf
? ;
结束了该命令,并允许您启动一个新命令。
列表形式比较安全。 shell不会对命令后的所有参数进行特殊处理。如果$var
中有一个shell元字符,它就是这种形式的文字自我:
system 'rsync', '-av', "$var/.*pl", '/scripts/';
Perl还具有“污点检查”功能,可以标记来自程序外部的数据(用户输入,文件等)。受污染的数据具有病毒性。将其与未污染的数据一起使用,您将获得更多的污染数据。当您尝试使用受污染的数据在程序外部执行某项操作(例如system
)时,会出现错误。
签出perlsec。我在Mastering Perl中也有一章。祝你好运!
答案 1 :(得分:1)
否,但是有使用引号的正确方法。
在Perl中,字符串$var
插在双引号(以及双引号构造qq{...}
)内,但在单引号(和q{...}
)内按字面意义对待。因此,您只想将system
呼叫更改为
system "rsync -av $var/.*pl /scripts/";
答案 2 :(得分:1)
尝试使用Perl File::Rsync模块。