我有一个perl脚本,我想首先检查是否可以在实际执行ssh之前ssh到服务器。因此,如果可以ssh,那么继续ssh到该服务器,否则适当地处理这个异常。
所以我有这个脚本通过带有数据库列表的文本文件,并尝试ssh到每个服务器执行bash命令,检查服务器是否正在执行MySQL SST:
#!/usr/bin/perl -w
use strict;
use warnings;
use 5.010;
use DBI;
use Encode;
use IO::File;
use JSON;
use utf8;
BEGIN {
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
}
my $time = localtime();
my $file = '/opt/db-servers/db.txt';
open my $info, $file or die "Could not open $file: $!";
while( my $hostname = <$info>) {
chomp( $hostname );
my $xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`;
my $role_check = `ssh $hostname ps -ef |grep mysql | grep donor`;
my $error_log = `ssh $hostname ps -ef |grep mysql`;
if ( $xtrabk_check ne "" ){
if ( $role_check ne "" ){
my $cmd ="curl -vs -o /dev/null -X POST --data-urlencode 'payload={\"channel\": \"#db-wsrep-status-log\", \"username\": \"db-wsrep-status-log\", \"text\": \"$time: $hostname: --role Donor \n```$error_log```\", \"icon_emoji\": \":scorpion:\"}' 2>&1 /dev/null https://hooks.slack.com/services/GVadasdd/B6LSMF5GV/BIApnzoIldfdsrw343wf";
system($cmd);
}
else {
my $cmd ="curl -vs -o /dev/null -X POST --data-urlencode 'payload={\"channel\": \"#db-wsrep-status-log\", \"username\": \"db-wsrep-status-log\", \"text\": \"$time: $hostname: State transfer in progress, setting sleep higher mysqld \n```$error_log```\", \"icon_emoji\": \":scorpion:\"}' 2>&1 https://hooks.slack.com/services/GVadasdd/B6LSMF5GV/BIApnzoIldfdsrw343wf";
system($cmd);
}
}
}
close $info;
所以可能在执行下面的三行之前,我希望能够知道该服务器是否已关闭(因此不能ssh进入它)(然后使用下面的命令ssh进入它):
my $xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`;
my $role_check = `ssh $hostname ps -ef |grep mysql | grep donor`;
my $error_log = `ssh $hostname ps -ef |grep mysql`;
我怎样才能实现这个目标?顺便说一句,松弛的网址已被改变,因此安全性令人担忧。
答案 0 :(得分:1)
到目前为止,确定是否可以ssh到服务器的最可靠的方法是实际尝试ssh到它。只是尝试连接,如果失败,则报告失败并中止任何进一步的尝试:
use Try::Tiny;
# Declaring them here so they don't disappear at the end of the try block
my ($xtrabk_check, $role_check, $error_log);
try {
$xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`;
$role_check = `ssh $hostname ps -ef |grep mysql | grep donor`;
$error_log = `ssh $hostname ps -ef |grep mysql`;
} catch {
die "Failed to connect to ssh: $_";
}
答案 1 :(得分:0)
不要直接运行ComboBox
,而是使用支持SSH的任何Perl模块(例如,Net::OpenSSH)。这将允许您连接到远程主机并在该单个连接上运行所需数量的命令,它将检测任何连接错误并正确报告。
您还可以使用Net::OpenSSH::Parallel并行操作。