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 到远程服务器并检查文件是不是存在的主要内容,如果未能解决你的问题,请参考以下文章