원격 서버에 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;

따라서 아래 세 줄을 실행하기 전에(그리고 다음 명령을 사용하여 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";
}

관련 정보