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