sshやscpコマンドは、パスワードを引数にすることは出来ません。セキュリティに気を使う必要はありますが、パスワード認証を前提としたバッチ処理等の時に不便です。

鍵を登録していないので、パスワード認証でサクっと処理させたい。バッチでぶん回したいのです。
解決策として、EPELリポジトリの「sshpass」を使う方法があります。
EPELリポジトリとは拡張リポジトリのようなものです。本記事ではLinuxディストリビューションとして「Amazon Linux2」を前提としています。Amazon Linux2ではEPELリポジトリの有効化が必要となり、合わせて記載していきます。
以下のように「-i」オプションで秘密鍵を指定出来る。
ssh -i key.pem アカウント@接続先
# 例:ssh -i key.pem ec2-user@10.1.1.2
また、以下のように警告が出た場合は「chmod 600 key.pem」でパーミッションを変えてあげればOKだった。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for 'key.pem' are too open.

では、方法です!
方法
sshpassをインストールすると「sshpass -p パスワード ssh アカウント@接続先」といったコマンド書式で使えるようになります。以下インストール手順を書いていきます。
EPELリポジトリのインストール&有効化
※EPELリポジトリが有効なUbuntu等は読み飛ばしてください。
Amazon Linux2はEPELリポジトリが有効になっていません。そこで以下のAWS公式サイト文章に沿ってインストール&有効化を行います。

実行コマンドは次の通りです。
sudo amazon-linux-extras install epel -y
sudo yum-config-manager --enable epel
プロキシ経由の場合は「amazon-linux-extras install epel -y」が実行出来ません。環境変数のhttp_proxy等のうまくいかなかったため、私は「/etc/amazon-linux-extras.conf」にプロキシ設定を記載しました。
echo "export http_proxy=http://プロキシサーバ:ポート" >> /etc/amazon-linux-extras.conf
echo "export https_proxy=https://プロキシサーバ:ポート" >> /etc/amazon-linux-extras.conf
※赤線部分は適時置き換えてください。
sshpassインストール
EPELリポジトリが有効になりましたら、以下コマンドでsshpassをインストールします。
sudo yum install -y sshpass
※ubuntu等のaptを使う場合は「sudo apt install -y sshpass」で可能です。
使い方
基本的な書式は、以下のように既存sshやscpコマンド前にくっつけます。
sshpass -p パスワード ssh アカウント@IPアドレス
sshpass -p パスワード scp アカウント@IPアドレス:対象ファイル 保存先
初回接続の場合は上記を実施しても上手くいかないことがありますのでsshやscpのオプションに「-o StrictHostKeyChecking=no」を付けましょう。
sshpass -p パスワード ssh -o StrictHostKeyChecking=no アカウント@IPアドレス
sshpass -p パスワード scp -o StrictHostKeyChecking=no アカウント@IPアドレス:対象ファイル 保存先

私の場合はクローズ環境のバッチ化前提で次のようにコマンドを実行しています(備忘録)。
sshやscpで対象ホストに接続する際の「確認」「確認ファイル」に関係します。バッチ系処理で警告メッセージ確認で止まってしまうと不便です。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- StrictHostKeyChecking:接続先の鍵をチェックオプション。No指定でチェック無しで接続してknown_hostsに書き込む。Yes指定でチェックする(known_hostsに最初から存在している必要がある)。
- UserKnownHostsFile:公開鍵(接続先)のファイル指定で、デフォルトはknown_hostsを使う。/dev/null指定であれば使わないし保存しない(つまり前回接続後に対象ホストの鍵が変わっていても問題なく接続できるようになる)。
私の場合はバッチ処理用にタイムアウトオプション(接続先が停止しているケースがあるため)を追加して次のようなコマンド書式にしています。
sshpass -p パスワード scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout 5 アカウント@IPアドレス:リモートの対象ファイルパス 保存先
※なお、UserKnownHostsFile=/dev/nullを実施しない場合は「ssh-keygen -R 対象IP」で対象ホスト鍵を削除する選択肢もあるはず(未検証)。
まとめ
- Linux sshやscpコマンドでパスワードを引数にする場合は「sshpass」を利用します。
- sshpassはEPELリポジトリからインストールします。Amazon Linux2の場合は事前にEPELリポジトリの有効化が必要です。

最後までご覧いただき、ありがとうございました。
コメント