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

标签 linux perl ssh

之前我问过question这里介绍如何使用 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";
    }
}

最佳答案

方括号,单个 [ 或一对 [ ],是 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: $!";

如果目录已经存在,mkdir 会用 -p 安静,它返回成功,这也违背了 [ ] 的目的(如果那是意图)。但是一个实际的错误——存在一个具有该名称的文件,路径上没有权限等——确实会返回到脚本,如你所愿,以及一个带有错误的字符串消息在 $! 中,所以请对此进行测试。

如果您只是想知道该目录是否存在,请放回您的测试分支,或者只是省略 -p 并分析 $! 以了解该消息的内容你的系统。

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

对于下一步,我建议研究用于(准备和)运行外部命令的模块,这比裸露的系统更有帮助。

一些,从简单到更强大:IPC::System::Simple , Capture::Tiny , IPC::Run3 , IPC::Run .另见 String::ShellQuote , 准备命令并避免引用问题、shell 注入(inject)错误和其他问题。这个最近post是一个很好的例子,还有很多。

关于linux - SSH 使用 Perl 脚本在远程站点创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877483/

相关文章:

Java 拒绝启动 - 无法为对象堆保留足够的空间

linux - 我在哪里可以找到 struct Qdisc 的定义?

linux - Linux 未选择正确版本的 Ant

正则表达式:刚果共和国,但不是刚果民主共和国

bash - SSH Bash脚本,易于连接

linux - 如何终止/停止不断刷新其 PID 的进程?

linux - 如何在 perl 中将 ulimit 设置为无限制?

perl - 在 perl 中, 'use strict' 禁用重要警告

linux - 运行简单 shell 脚本时出错

ssh - 没有密码的CentOS scp无法正常工作