LoginSignup
0
2

More than 3 years have passed since last update.

expect(+ shell script)を使用してLinux Serverのプロセス状態確認を1コマンドで

Last updated at Posted at 2019-10-30

やりたいこと

・LinuxサーバへのLoginからprocess確認までを1コマンドで
・expect(+shell script)を利用して、リモートのLinuxサーバへLogin&プロセス状態確認 (今回はsystemdで起動されたhttpd)
・引き数は1つだけ取る (プロセスを確認したいホストのIPアドレスを指定)
・実logはshell実行ディレクトリにlogsというディレクトリを作成して保存

前提条件

①script実行サーバでexpectがインストールされていること
②リモートサーバへのPWベースのssh接続が可能であること

事前準備

①sript実行サーバにてexpectインストール

[root@server1 ~]# yum install expect
読み込んだプラグイン:fastestmirror
Determining fastest mirrors
(snip)
...
依存性関連をインストールしました:
  tcl.x86_64 1:8.5.13-8.el7                                                                                                           

完了しました!

②リモートサーバへのPWベースのssh接続許可
以下の設定を有効(行頭の#を削除)にし

/etc/ssh/sshd_config
PasswordAuthentication yes

config変更後にsshd restart

[root@server2 ~]# systemctl restart sshd

script

scriptの詳細はコメント参照
パスワードはベタ書き

test.sh
#!/bin/bash
#================================================#
#SHELL SCRIPT TITLE
#
#v01 DATE NAME
#
#================================================#

#### PROCESS CHECK
PROCESS_STATUS_CEHCK(){
        expect -c "
        # expectのtimeout時間を10秒で指定
        set timeout 5
        # session開始(プロセス生成)
        spawn $CONNECT
        expect {
                    password:   {send \"$PASS\n\"}
                    no)     {send \"yes\n\";exp_continue} # finger print対策
                    default {exit 3}                      # 異常時は 終了コード3 で終了
        }
        # log先を指定
        log_file ./${LOGD}/${IPADDR}_${TODAY}.txt

        ## root Userへ遷移
        expect \"${PRO1}\"       ;       send \"su -\r\"
        expect \"Password:\"     ;       send \"$ENPASS\r\"

        ## httpd process状態確認 ★利用用途によって書き換えたり追記したりする
        expect \"${PRO2}\"       ;       send \"systemctl status httpd.service\r\"

        ## LOGOUT
        expect \"${PRO2}\"       ;       send \"exit\r\"
        expect \"${PRO1}\"       ;       send \"exit\r\"

        ## exit
        exit 0
        "
        echo ""
}

## Check argument num
if [ $# -ne 1 ]; then
    echo "Error (wrong number of arguments)"
    exit 1
fi


## get login ip-address from $1
IPADDR=$1                       # プロセス状態を確認したいノードのIPアドレスを指定

## User&Pass 下記3行を適切な値に編集する
USER="username"                   # 一般ユーザ名(loginユーザ名)
PASS="login passwd"               # 一般ユーザPW
ENPASS="su passwd"                # su PW

## Prompt
PRO1="\\\$ "                   # 一般ユーザプロンプト
PRO2="#"                        # rootユーザプロンプト

## Make Login Command
CONNECT="ssh $IPADDR -l $USER"  # Login Command

## Make LogDir
TODAY=`date '+%Y%m%d%H%M%S'`    # log file名用
LOGD="logs"                    # log 保存ディレクトリ(currentの/logsに保存)

cd $(dirname $0)
if [ ! -d ./$LOGD ];then
    mkdir ./$LOGD
fi

## status check実施
PROCESS_STATUS_CEHCK

実行結果

実行logはshell配備ディレクトリにlogsというディレクトリを作成し
その配下に保存される


[root@server1 test]# ./test.sh 192.168.0.202
spawn ssh 192.168.0.202 -l centos
centos@192.168.0.202's password: 
Last login: Wed Oct 30 14:14:52 2019 from 192.168.0.204
[centos@server2 ~]$ su -
Password: 
Last login: Wed Oct 30 14:15:01 UTC 2019 from 192.168.0.101 on pts/0
[root@server2 ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-10-30 14:17:58 UTC; 12s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 23965 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─23965 /usr/sbin/httpd -DFOREGROUND
           ├─23966 /usr/sbin/httpd -DFOREGROUND
           ├─23967 /usr/sbin/httpd -DFOREGROUND
           ├─23968 /usr/sbin/httpd -DFOREGROUND
           ├─23969 /usr/sbin/httpd -DFOREGROUND
           └─23970 /usr/sbin/httpd -DFOREGROUND

Oct 30 14:17:58 server2.novalocal systemd[1]: Starting The Apache HTTP Server...
Oct 30 14:17:58 server2.novalocal systemd[1]: Started The Apache HTTP Server.
[root@server2 ~]# exit
logout
[centos@server2 ~]$

備考

expectとは?

対話的にLinuxコマンドを実行するツール
下記参考にさせていただいたすばらしい記事
Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編-

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2