那是使用rsync命令的正确方法吗?

时间:2018-08-23 12:29:46

标签: linux perl unix rsync

$var = "/nfs/sc/disks/darshils/scripts/";

这里$var是一个字符串

system 'rsync -av $var/.*pl /scripts/';

在perl lang中使用系统命令,我可以执行任何unix命令

那样可以在rsync命令中使用$ var吗? 或以其他方式在rsync命令中使用$ var?

3 个答案:

答案 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模块。