Help us understand the problem. What is going on with this article?

ssh-addできなかったときへの対処

Windowsのgit bash上でssh-addしようとして、Could not open a connection to your authentication agent.と出たのでメモ。Windowsのお話です。

ssh-agentを起動するコマンド, ssh-agentを打ってからじゃないとssh-addできないということ(おそらくWindowsだからって話)なんだけど、Windowsだと更にひとくせあって、$ eval `ssh-agent`じゃないといけないらしい。

下記を、Windows7, Git bash上で実行して解決しました。

$ ssh-add ~/.ssh/id_rsa_bitbucket # ssh-addしようとするも、失敗。
Could not open a connection to your authentication agent.

$ ll ~/.ssh # ls -ltr ~/.ssh あたりと同じコマンドです
total 19
drwxr-xr-x    1 user Administ     4096 Mar 29 15:49 .
drwxr-xr-x    1 user Administ    24576 Mar 18 20:15 ..
-rw-r--r--    1 user Administ      290 Feb 13 10:47 config
-rw-r--r--    1 user Administ      680 Feb 12 12:03 id_dsa
-rw-r--r--    1 user Administ     1702 Feb 13 10:30 id_rsa
-rw-r--r--    1 user Administ     1675 Mar 29 15:49 id_rsa_bitbucket
-rw-r--r--    1 user Administ      399 Mar 29 15:49 id_rsa_bitbucket.pub
-rw-r--r--    1 user Administ     2025 Mar 29 15:52 known_hosts

$ ssh-agent # これだと何も起こらない
SSH_AUTH_SOCK=/tmp/ssh-WaUWIb2288/agent.2288; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6064; export SSH_AGENT_PID;
echo Agent pid 6064;

$ eval `ssh-agent` # 正解
Agent pid 10908

$ ssh-add ~/.ssh/id_rsa_bitbucket # ヨッシャああああ!!!
Identity added: /c/Users/{USER}/.ssh/id_rsa_bitbucket (/c/Users/{USER}/.ss
h/id_rsa_bitbucket)
$ git branch # pushしたかったので、branch見る
  develop
* master
$ git pull origin master # 無事pushしました
From bitbucket.org:sshojiro/some-repo
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
Updating e7cb29d..c9eb758
Fast-forward
 libs/+Common/Evaluation.m      | 29 +++++++----------------------
 libs/+Common/FigureGenerator.m | 16 ++++++++++++----
 2 files changed, 19 insertions(+), 26 deletions(-)

以上。

結局 ssh-agent とは何だったのか (2019/12/26 追記)

Git Bash for Windowsにおけるssh-agentとは結局なんだったのでしょうか。気になってきたので調べます。

まず挙動を調べると、乱数でPID (プロセスID)とtemporary folderを生成している様子が確認できました。これは、文字列をdumpしているだけです。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-BxfRPlTH3nyI/agent.15928; export SSH_AUTH_SOCK;
SSH_AGENT_PID=13268; export SSH_AGENT_PID;
echo Agent pid 13268;
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-1AhcaPKDImvP/agent.4592; export SSH_AUTH_SOCK;
SSH_AGENT_PID=16204; export SSH_AGENT_PID;
echo Agent pid 16204;

さて、ssh-agentコマンドの実体はどこにあるのでしょう。

$ which ssh-agent # コマンドが定義してあるファイルのpathを出力
/usr/bin/ssh-agent
$ file /usr/bin/ssh-agent # ファイルの情報を取得する`file`コマンド
/usr/bin/ssh-agent: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows

...ソースが読めないのでこれ以上は読めない...残念...

ひとまず、ssh-agentは毎回ssh agent (daemon相当だと思います)にPIDとsocketまでのpathを割り当てているようです。
ssh-agent自体は(少なくともGit Bash for Windows上では)その割当を乱数で生成するところまでしか担っていないので、ちゃんと$ eval `ssh-agent`を実行しないと、sshコマンドが有効にならないということでした。実装上の都合ということですね。

sshojiro
little english, little programming, little mathematic. フランス留学記: https://france-short-research-stay.hatenablog.jp エンジニアブログ: http://loudspeaker.sakura.ne.jp/devblog/
https://amzn.to/3dSszJL
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away