##やりたいこと
・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接続許可
以下の設定を有効(行頭の#を削除)にし
PasswordAuthentication yes
config変更後にsshd restart
[root@server2 ~]# systemctl restart sshd
##script
scriptの詳細はコメント参照
パスワードはベタ書き
#!/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編-