オンラインで無数の情報源から学んだのですが、(大まかに言えば) パスワードなしでリモート サーバーにログインするには、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_config
。man ssh_config
:
%d
—ローカルユーザーのホームディレクトリ%u
—ローカルユーザー名%l
—ローカルホスト名%h
—リモートホスト名%r
—リモートユーザー名
私はこれを次のように使用します (グローバルssh_config
ファイル内):
IdentityFile ~/.ssh/%r@%h
つまり、私の秘密鍵ファイルの名前は のようになります[email protected]
。