Shellでsshコマンドを利用するとき、パスワードを入力せず、利用できる方法を紹介します。
パスワード認証
パスワードで認証を行う場合、複数の方法が存在します。
sshpassコマンドで接続
# sshpassインストール
yum install -y sshpass
yum install -y sshpass
# 接続
sshpass -p '123456' ssh -o StrictHostKeyChecking=no hoge@host.example.com
expectコマンドで接続
使用例は以下のようになりますが、詳細内容はグーグルでexpectコマンドを検索してください。
ssh.ctl
#!/usr/bin/expect
log_file /var/log/expect.log
set RemoteHost [lindex $argv 0]
set PW [lindex $argv 1]
set Prompt "\[#$%>\]"
set timeout 5
spawn env LANG=C /usr/bin/ssh ${RemoteHost}
expect {
-glob "(yes/no)?" {
send "yes\n"
exp_continue
}
-glob "password:" {
send -- "${PW}\n"
}
}
expect {
-glob "${Prompt}" {
interact
exit 0
}
}
環境変数 SSH_ASKPASS
#!/bin/bash
# 接続先情報
SSH_USER=test
SSH_PASS=mypass
SSH_HOST=your_ssh_server
REMOTE_CMD=”ls -al”
# 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n “$PASSWORD” ]; then
cat <<< “$PASSWORD”
exit 0
fi
# SSH_ASKPASSで呼ばれるシェルにパスワードを渡すために変数を設定
export PASSWORD=$SSH_PASS
# SSH_ASKPASSに本ファイルを設定
export SSH_ASKPASS=$0
# ダミーを設定
export DISPLAY=dummy:0
# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
# 接続先情報
SSH_USER=test
SSH_PASS=mypass
SSH_HOST=your_ssh_server
REMOTE_CMD=”ls -al”
# 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n “$PASSWORD” ]; then
cat <<< “$PASSWORD”
exit 0
fi
# SSH_ASKPASSで呼ばれるシェルにパスワードを渡すために変数を設定
export PASSWORD=$SSH_PASS
# SSH_ASKPASSに本ファイルを設定
export SSH_ASKPASS=$0
# ダミーを設定
export DISPLAY=dummy:0
# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
公開鍵認証
# クライアントPCで鍵を作る
ssh-keygen -t rsa -b 4096
# リモートへ公開鍵を転送する
ssh-copy-id -i ~/.ssh/id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]
# リモートにSSHで接続する
ssh -i id_rsa [リモートユーザー]@[リモートサーバーのホスト名]