リモートサーバーにSSHで接続できることを確認するPerlスクリプト

リモートサーバーにSSHで接続できることを確認するPerlスクリプト

実際には、SSHを実行する前にサーバーにSSHで接続できることを最初に確認したいPerlスクリプトがあります。したがって、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;

したがって、以下の3行を実行する前に(そして次のコマンドを使用して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`;

どうやってこれを達成できますか?ところで、Slack URLが変更され、セキュリティの問題が発生しました。

以下に提案されたコードを追加しましたが、まだ機能していないようです。

    ...
    while( my $hostname = <$info>)  {
    chomp( $hostname );
    my $ssh_ping = `$ssh_cmd\'@\'$hostname true`;
    if ( `$ssh_ping true`){
    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);
            } 
       }
    } #end $ssh_ping if
} #end while

答え1

次のことができます。

`ssh $hostname true`;

if ($? == 0) {
    ...;
} else {
    die "ssh failed";
}

関連情報