SSH使用Perl脚本在远程站点中创建目录

Tan*_*Wei 2 linux ssh perl

以前我曾问一个问题,这里就如何确定路径是否是使用SSH目录或不远程站点。如果路径不是目录,则希望创建目录。我尝试用两种方法遵循代码,但似乎无法正常工作。谢谢大家的帮助。

use File::Path;

my $destination_path = "<path>";
my $ssh = "usr/bin/ssh";
my $user_id = getpwuid( $< );
my $site = "<site_name>";
my $host = "rsync.$site.com";

if (system("$ssh $user_id\@$host [ -d $destination_path ]") == 0) {
    print "It is a directory.\n";   

} else {
    print "It is not a directory.\n";

    #First Way
    if(system("$ssh $user_id\@$host [ make_path ($d_path_full) ]") == 0{

    #Second Way
    if(system("$ssh $user_id\@$host [ mkdir -p $d_path_full ]") == 0{
       print "Create directory successfully.\n";

    } else {
       print "Create directory fail.\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

括号(单个[或成对[ ])是一个内置函数,bash其中包含一个测试运算符(请参阅参考资料man test),并且最后一次使用是不正确的。但是您不需要它来建立目录

use warnings;
use strict;
use feature 'say';

my $ssh = '/usr/bin/ssh';

my $user_id = ...
my $host    = ...

my $to = quotemeta $user_id.'@'.$host;

my $cmd = 'mkdir -p TEST_MKDIR_OVER_SSH';

system("$ssh $to $cmd") == 0  or die "Can't mkdir: $!";
Run Code Online (Sandbox Code Playgroud)

mkdir是安静,-p如果目录已经存在,它会返回更迭什么也违背了目的[ ](如果是这样的意图)。但是实际的错误- 存在具有该名称的文件,路径上没有权限等-确实会按照您的意愿返回脚本,并且包含错​​误消息的字符串,$!因此请进行测试这个。

如果您只是想知道该目录是否存在,请放回您的测试分支,或者仅忽略-p并分析该 $!消息在系统上的含义。

至于第二次尝试:要执行的命令在远程系统上运行,并且与该脚本无关(除插值变量外)。因此,该脚本中的Perl函数或库对该命令毫无意义。

对于下一步,我建议研究用于(准备和)运行外部命令的模块,这些模块比裸命令有用得多system

从简单到更强大的一些工具:IPC :: System :: SimpleCapture :: TinyIPC :: Run3IPC :: Run。另请参见String :: ShellQuote,以准备命令并避免引用问题,shell注入错误以及其他问题。最近的帖子中有一些例子。寻找更多。