読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

【pass無しssh】/usr/bin/ssh-copy-id: ERROR: No identities found【jenkins】

linux

対象のサーバにsshする際に、passフレーズ無しでsshしたい事がありますね。
jenkinsのようなCIサーバを導入する場合、鍵認証かpass無し認証がほぼ必須かと思います。

そんな場合 ssh-keygen を使って秘密鍵・公開鍵を生成し、
公開鍵を対象サーバにscpしてパーミッションを600にしてcatでauthorized_keysに追記するのが一般的です。

このssh-keygen以降の一連の作業を一発で行ってくれる便利コマンドがあります。それは、
ssh-copy-id
です。これは単なるシェルスクリプトです。

このssh-copy-idを実行すると、

/usr/bin/ssh-copy-id: ERROR: No identities found

というエラーが発生する場合があります。
これは、

  • 対象サーバに ~/.ssh フォルダが存在しない
  • ~/.ssh/authorized_keys のファイルが存在しない(このファイル名は固定なので注意)

という場合に発生します。
従って、ssh先のサーバで事前にauthorized_keysを用意しておく必要があります。
.sshフォルダは、一度でもsshすると自動でフォルダが生成されるので、一回だけsshしておきます。

pass無しsshするための一連の作業

今回の目標として、jenkinsからserver-A、jenkinsからserver-Bへ
pass無しssh・scpできる事を目標とします。

jenkins ─┬──> server-A
         └──> server-B

1,ssh元で公開鍵・秘密鍵を生成する

まず、ssh元のサーバで公開鍵と秘密鍵を生成します。
例えばjenkinsサーバから各サーバへpass無しでssh・scpしたい場合、
jenkinsサーバで以下を実行していきます。

# passフレーズは未入力でenterで決定して下さい
ssh-keygen -t rsa

すると、
~/.ssh/id_rsa (秘密鍵)
~/.ssh/id_rsa.pub (公開鍵)
が生成されます。
このid_rsa.pub(公開鍵)ssh先のサーバへscpするのですが、
便利なssh-copy-idを使用すると簡単にできてしまいます。

2,ssh先サーバで初期フォルダ・ファイルを用意しておく

jenkinsサーバからserver-Aにsshし、ssh先で初期フォルダ・ファイルを用意します。

ssh server-A
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
exit

jenkinsサーバからserver-Bにsshし、ssh先で初期フォルダ・ファイルを用意します。

ssh server-B
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
exit

この作業によって、以下が行われます。

  • ssh先サーバに ~/.ssh フォルダが自動生成される。
  • 認証キーファイルを、パーミッションを600で生成する。

authorized_keysのパーミッションが600でない場合はpass無しsshできません

3,ssh元でssh-copy-idを実行する

jenkinsサーバからserver-Aにssh-copy-idします。

ssh-copy-id -i ~/.ssh/id_dsa.pub server-A

jenkinsサーバからserver-Bにssh-copy-idします。

ssh-copy-id -i ~/.ssh/id_dsa.pub server-B

ssh-copy-id実行時はパスワードを1度入力する必要があるので、入力して下さい。
ssh-copy-idした時に「/usr/bin/ssh-copy-id: ERROR: No identities found」が発生する場合は、
前述したように対象サーバに ~/.ssh/authorized_keys がパーミッション600で存在する事を確認して下さい。
これでjenkinsサーバからserver-A、server-Bに対してpass無しsshできるようになります。

もし
server-A ←→ server-B
と、お互いのサーバでpass無しsshしたい場合は、
server-Aで1,2,3を、server-Bで1,2,3を実行すると、両サーバ間でpass無しsshできるようになります。
ssh元がjenkinsサーバからserver-A/Bに変わるだけなので、簡単にできるかと思います。

プロのための Linuxシステム構築・運用技術 (Software Design plus)

プロのための Linuxシステム構築・運用技術 (Software Design plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)