Linux ssh・scpでパスワードを引数にする

Linux
この記事は約6分で読めます。
記事内に広告が含まれています。

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

鍵を登録していないので、パスワード認証でサクっと処理させたい。バッチでぶん回したいのです。

解決策として、EPELリポジトリの「sshpass」を使う方法があります。

補足事項:EPELリポジトリって?

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公式サイト文章に沿ってインストール&有効化を行います。

CentOS、RHEL、または Amazon Linux を実行している EC2 インスタンスの EPEL リポジトリを有効にする
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの Extra Packages for Enterprise Linux (EPEL) リポジトリへのアクセスを有効にしたいと考えています。イ...

実行コマンドは次の通りです。

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アドレス:対象ファイル 保存先


私の場合はクローズ環境のバッチ化前提で次のようにコマンドを実行しています(備忘録)。

オプション「StrictHostKeyChecking」「UserKnownHostsFile」

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リポジトリの有効化が必要です。

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

コメント

Top
タイトルとURLをコピーしました