LoginSignup
228

More than 1 year has passed since last update.

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

Last updated at Posted at 2015-03-29

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コマンドが有効にならないということでした。実装上の都合ということですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
228