【发布时间】:2014-05-21 20:03:14
【问题描述】:
我一直在寻找这个,但找不到满意的答案。
我有一个 perl 脚本需要将文件从一台主机复制到另一台主机,本质上
sub copy_file{
my($from_server, $from_path, $to_server, $to_path, $filename) = @_;
my $from_location = "$from_server:\"\\\"${from_path}${filename}\\\"\"";
my $to_location = $to_path . $filename;
$to_location =~ s/\s/\\\\ /g;
$to_location = "${to_server}:\"\\\"${to_location}\\\"\"";
return system("scp -p $from_location $to_location >/dev/null 2>&1"");
}
问题是,我的一些文件名看起来像这样:
BLAH;BLAH;BLAH.TXT
Some really nicely named file( With spaces, prentices, &, etc...).xlx
我已经在处理空格了,其代码非常难看,因为在每一端,文件可以是本地的或远程的,并且 scp 调用的 from 和 to 部分的转义是不同的。
我真正想要的是要么以某种方式转义所有可能的特殊字符,要么以某种方式通过使用 POSIX 系统调用完全绕过 shell 扩展。如果需要,我可以编写 XS 模块。
我在 .ssh 目录中设置了正确的密钥 另外,我也不确定哪些特殊字符会引起问题,哪些不会引起问题。我想支持所有合法的文件名字符。
【问题讨论】:
-
你不能使用 SFTP 吗?这是摆脱中间壳的最简单方法