Edited at

SSH接続先のサーバにコマンドを実行させてみたメモ


はじめに

複数のサーバに対してシェルスクリプトで処理を命令したいことがありました。

今回はその方法を少し勉強したのでメモしたいと思います。

環境は以下の通りです

OS:win10 64bit, CentOS7

Tool:VirtualBox, PuTTY, GitBash


やったことの流れ

公開鍵認証方式でローカルサーバにSSH接続をして、サーバに命令が書かれたシェルスクリプトを転送・実行しました。

今回は接続元をWindows10(GitBash)、接続先をCentOS7(VirtualBox)を使いました。


SSH接続

ssh (-p ポート番号) user名@ipアドレス

とくに特別なことをしなければ、これだけでokです。括弧の部分は必要なら書きます。

接続先のUserにログインパスワードが設定されているなら、コマンドを実行するとそのパスワードを尋ねられます。

デフォルトだとパスワード認証方式になるはずです。

公開鍵を使えば次回からパスワードなしで接続することができるようになります。


公開鍵暗号方式

以下は公開鍵で接続をおこなう手順です。

# 鍵を作成する

ssh-keygen -t rsa

# 接続先に公開鍵を設置
scp ./.ssh/id_rsa.pub root@192.168.X.X:/root/.ssh

# ディレクトリの権限をユーザーのみrwxに制限
$ chmod 700 ~/.ssh

# authorized_keyに流し込み
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

# authorized_key権限書き換え
sudo chmod 600 /user名/.ssh/authorized_keys

# ユーザーディレクトリのコピーした秘密鍵を削除する
$ rm ~/.ssh/id_rsa.pub

RSA暗号方式で鍵を生成すると、./.sshに秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されます。

authorized_keyは公開鍵を保存しておく場所で、SSHログインされるとサーバはここの鍵を見にいきます。


シェル作成


command.sh

#!/bin/sh

#ここに実行したいコマンドを書く


send_command.sh

#!/bin/sh

FILE="command.sh"
scp ${FILE} root@192.168.X.X:/root
ssh root@192.168.X.X "
sh ${FILE};
#他にコマンドを書きたい場合は「;」でつなぐ
"

この方法の他に、実行環境にexpectコマンドが入っていればもっと書けます。

また、expectならパスワード入力などの対話もスクリプト化できるため、公開鍵方式を使わずに自動化が可能です。

例外処理が無いのでちょっと雑ですが、下のようなスクリプトで同じ処理が作れます。

#!/bin/sh

FILE="command.sh"
expect -c "
set timeout 10
spawn ssh root@192.168.X.X
send \"PASSWORD\n\"
spawn ./${FILE}
interact
"


参考にしたサイト