Perl SSH 到远程服务器并检查文件是不是存在

Posted

技术标签:

【中文标题】Perl SSH 到远程服务器并检查文件是不是存在【英文标题】:Perl SSH to remote server and check file existsPerl SSH 到远程服务器并检查文件是否存在 【发布时间】:2020-06-23 15:53:12 【问题描述】:

我开发了一个脚本,它应该登录到远程服务器并进行某些操作。

在远程服务器中,它会检查sample_file.txt 文件是否存在,如果是,那么它应该在home 路径中创建带有特定数据集的create_user_file.txt 文件。

这里的事情是我可以通过下面的脚本对远程机器执行 ssh,但无法检查文件,因为我不知道如何打开远程会话并执行所有操作。

下面是我的代码:

#!/usr/bin/perl 

use Net::OpenSSH;

.
.
.

foreach my $ip( @list_of_ips) 
    print "Connecting to $ip...\n";
    my $ssh = OpenSSH_Connection( $ip, $user, $passwd );
    print "Connected!\n";

    $dir = "/remote/server/home/path/";
    $file = $dir."sample_file.txt";

    if (-e $file) #if sample_file.txt exists then create user file
        open(my $fh, '>', $dir."create_user_file.txt") || die "Couldn't open file $!";;
        print $fh "ID=123&PW=Passw0rd";
        close $fh;
    

    last if($ssh); #if connection is success no need to login into another server
    $ssh->close();


sub OpenSSH_Connection 
    my ( $host, $user, $passwd ) = @_;

    my $ssh = Net::OpenSSH->new("$user:$passwd\@$host");
    $ssh->error and die "Couldn't establish SSH connection: ". $ssh->error;

    return $ssh;

这里的代码,下面的部分代码应该在远程服务器上执行。但它一直在检查我正在执行此脚本的文件。

if (-e $file) #if sample_file.txt exists then create user file
        open(my $fh, '>', $dir."create_user_file.txt") || die "Couldn't open file $!";;
        print $fh "ID=123&PW=Passw0rd";
        close $fh;

我怎样才能保持打开服务器的远程会话并执行上面的代码,或者我们是否有任何 Perl 模块可以从本地服务器执行这种操作。 TIA。

【问题讨论】:

您根本没有使用$ssh 对象。您正在 本地 机器上评估 -e,而不是在远程机器上运行命令 $ssh->system$ssh->capture 可用于在远程机器上执行 shell 命令。例如,它可以是 Perl 单行代码。 我不明白这个问题? shell 命令必须遵守正在使用的 shell 的语法(可能是 bourne shell)。如果该命令执行 Perl 程序,则提供的 Perl 程序必须遵守 Perl 程序的语法。 你可以使用 SFTP 吗?可能比与远程 shell 交互更容易。 正如@truth 所说,为此使用SFTP,Net::OpenSSH 确实通过Net::SFTP::Foreign 支持它:$ssh->sftp->test_e($path) 【参考方案1】:

您认为Net::SSH 将使远程资源在本地可用的假设是不正确的。

SSH 为远程系统创建加密通道,然后将您放入 shell,或运行远程命令(例如 perl/shell 脚本),或允许复制/检索文件。

您可以在远程shell中打开SSH通道并像在本地计算机上一样运行命令,但是如果您想检查远程系统上是否存在文件,则必须通过远程shell或perl脚本进行通信。

您所追求的可能是SSH FS,它可以使远程文件在本地可用。

我必须注意,本地和远程系统上的用户在系统级别上可以有不同的id,这可能不是您想要的(操作不同用户的文件)。如果您的本地和远程id 相同并且属于您,则此方法可能会很好地工作。

我想最简单的方法是在远程系统上编写 perl 脚本并将一些参数传递给它。远程系统上的脚本将完成剩下的部分工作。

在这种情况下,您可以使用Net::SSH2 与远程shell 建立连接,然后使用参数运行远程perl 脚本。

为了更好地了解它是如何工作的,而无需创建长篇文章,我将您推荐给PerlMonks Net::SSH2 demo。

其他更困难的方式是编写足够的 perl 代码,以通过 SSH2 协议与远程系统建立连接,以“翻译”本地命令的远程 perl 脚本

$chan->command($argument)

进入远程 perl 代码块以执行特定任务。

Net::SSH2

【讨论】:

Net::OpenSSH 几乎总是比Net::SSH2 更好的选择。它更健壮、功能更丰富且更易于使用。

以上是关于Perl SSH 到远程服务器并检查文件是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

使用 ssh 检查远程主机上是不是存在文件

ssh:检查隧道是不是存在

Perl LWP::Simple::getstore 如何检查文件是不是存在于目标目录中

如何检查远程文件是不是存在于代理后面

检查 ip:port 在远程主机上是不是打开

cmd dos 检查远程FTP文件夹是不是存在