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

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

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

##事前準備
①sript実行サーバにてexpectインストール

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

完了しました!
```

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

```config:/etc/ssh/sshd_config
PasswordAuthentication yes
```

config変更後にsshd restart

```
[root@server2 ~]# systemctl restart sshd
```

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

```shell: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というディレクトリを作成し
その配下に保存される

```terminal

[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編-](https://qiita.com/ine1127/items/cd6bc91174635016db9b)