ssh が自動的にログインするためのキーをさらに提供する方法はありますか?

ssh が自動的にログインするためのキーをさらに提供する方法はありますか?

オンラインで無数の情報源から学んだのですが、(大まかに言えば) パスワードなしでリモート サーバーにログインするには、SSH キーを生成し、pub バージョンをリモート システムの authorized_keys に配置し、プライベート バージョンをローカルの ~/.ssh/ ディレクトリに配置し、それを 0600 に chmod すると、ログインできます。これはほぼ正しいのですが、SSH がリモート サーバーにキーを提供するには、キー (ペア) に id_rsa (id_rsa.pub) または id_dsa (id_dsa.pub) という名前を付ける必要があるようです。

少し前に戻ります。私はSurnameGローカル Mac にログインしています。リモート システム otherserver に SurnameG アカウントを持っています。

の内容をそのシステムの /home/surnameg/.ssh/authorized_keys にコピーしました。Macから ssh で接続するオプション~/.ssh/surnameg.pubでテストしましたが、問題なく動作しました。-i

私は~/.ssh/id_rsa(私が生成したもの)を持っていますgithub.com)。

そしてもちろん、私は~/.ssh/surnameg他のいくつかのキーも持っていますが、次の方法でログインしようとすると「試されない」のです。その他:

ssh 1.2.3.4

SurnameGここでは、 (現在ローカルにログインしているユーザー)を使用して自分のSurnameGアカウントにログインしようとしています。他のサーバー. OpenSSH が接続を試みたときに提供してくれることを期待していました~/.ssh/surnamegが、提供されませんでした。詳細オプションを使用して詳しく見てみましょう。

BOX:~ SurnameG$ ssh -v 1.2.3.4
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/SurnameG/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to 1.2.3.4 [50.112.132.124] port 22.
debug1: Connection established.
debug1: identity file /Users/SurnameG/.ssh/id_rsa type 1
debug1: identity file /Users/SurnameG/.ssh/id_rsa-cert type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA ax:64:3e:4a:e3:2c:e4:30:dd:36:a4:a0:9x:fa:ba:6b
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /Users/SurnameG/.ssh/known_hosts:88
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/SurnameG/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Trying private key: /Users/SurnameG/.ssh/id_dsa
debug1: No more authentication methods to try.

不思議なことに、openssh は ~/.ssh/id_rsa のみを提供しますが、それだけではありません。~/.ssh/id_dsa も「試行」しますか? 2 つの違い (提供と試行) がよくわかりません。とにかく、私が正しく理解していれば、openssh は 内の他の秘密鍵を試行することはありません~/.ssh/*

わかりました。各サーバーを~/.ssh/config次のように明示的に記述できます。

Host otherserver
   HostName 1.2.3.4
   User surnameg
   IdentityFile ~/.ssh/surnameg

そしてログインして

ssh otherserver

それは素晴らしいし、うまく機能します。しかし、実際のところ、私の ~/.ssh/config は扱いにくくなっています。悲しいことに、私はcd ~/.ssh && git initずっと前にそうしませんでした。しかし、話がそれました。

私の質問はこれです: ログインを試行するときに、ssh が ~/.ssh ディレクトリ内のより多くのキーを動的に試すようにする、よりシンプルで高速で自動化された方法はありますか? それとも、接続する必要があるすべてのサーバーの ~/.ssh/config を編集することが、ssh を構成する唯一の方法ですか? 上記の SSH の動作方法について、私が誤解していることはありますか?

答え1

すべてのホストに同じキーを提供したい場合は、 を使用して SSH エージェントにキーをロードしますssh-add。多くの Linux ディストリビューションは自動的にキーを起動します。ssh-add -l実行されているかどうかを確認してから、キーをロードしてください。

ssh-add ~/.ssh/id_rsa ~/.ssh/surnameg etc.

エージェントが自動的に起動しない場合は、 に次の内容を入力します~/.profile

agent_running() {
    [ "$SSH_AUTH_SOCK" ] && { ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]; }
}

env=~/.ssh/agent.env
if ! agent_running && [ -s "$env" ]; then
    . "$env" >/dev/null
fi
if ! agent_running; then
    ssh-agent >"$env"
    . "$env" >/dev/null
    ssh-add ~/.ssh/id_*
fi    
unset env

答え2

別の方法もあります。IdentityFileオプションでプレースホルダーを使うことができますssh_configman ssh_config:

  • %d—ローカルユーザーのホームディレクトリ
  • %u—ローカルユーザー名
  • %l—ローカルホスト名
  • %h—リモートホスト名
  • %r—リモートユーザー名

私はこれを次のように使用します (グローバルssh_configファイル内):

IdentityFile ~/.ssh/%r@%h

つまり、私の秘密鍵ファイルの名前は のようになります[email protected]

関連情報