私はリモートホスト(linux、Fedora)にSSH接続しています。そこでssh操作(bitbucketでgit)をしたいのですが。そのマシン上でssh-agentが実行されています。
$ ps -e|grep sh-agent
2203 ? 00:00:00 ssh-agent
私がgitしたいときは、パスフレーズを入力する必要があります。
$ git pull
Enter passphrase for key '/user/wgong/home/.ssh/id_rsa':
注:そのマシンをローカルで操作している場合は、パスフレーズの入力を求められません。
Gitを使用する前に、ssh-agentに鍵を追加してください
起動していない場合は、ssh-agentを起動します。
$ eval
`ssh-agent -s`
ssh-addを使用して、秘密鍵を追加します。
$ ssh-add〜/ .ssh/id_rsa_key
/home/user/.ssh/id_rsa_keyにパスフレーズを入力してください。
アイデンティティーが追加されました:/home/user/.ssh/id_rsa_key
(/ home/user/.ssh/id_rsa_key)
キーが追加されているかどうかを確認します(パラメーターは小文字のLです)。
$ ssh-add -l
2048 55:96:1a:b1:31:f6:f0:6f:d8:a7:49:1a:e5:4c:94:6f
/home/user/.ssh/id_rsa_key(RSA)
Gitサーバーに接続してみます。
$ ssh git.example.com
追加のパスフレーズを入力せずにGitを使用できるようになりました。
すでにssh-agent
が実行されている場合は、キーを追加することができます。パスフレーズを1回入力するだけで済みます。そのセッションに対してのみ1回入力する必要があります。
ssh-add ~/.ssh/id_rsa
どのOSを使用しているかはわかりませんが、LinuxとGnomeの場合は、 "Passwords and Keys"アプリケーション(CLI名:seahorse
)で管理できるため、ログイン時にロック解除されます(パスフレーズは不要) )他のLinuxデスクトップ環境には独自のマネージャがあります。私は他のOSがここで何をするのかわからない。
パスフレーズを尋ねる主な理由は、あなたの鍵が暗号化されているからです。
暗号化されていません
$ head ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
AIIAogIBAAKCAQEAtOJQ0Z3ZbyzuknnHqn5oMCmNf8zGmERhW+g5Eftf9daZ5qvZ
暗号化
$ head ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,A95215C9E9FE00B8D73C58BE005DAD82
ZAzLq/LbHSfOVkXtQz6M6U8yuAx2lIu9bH/k7ksgat92IDjZntRrT1XMpkYtjB+0
したがって、次のいずれかを実行する必要があります。
~/.ssh/config
を編集して別の識別ファイル(IdentityFile
)を指定してください。ssh-add -l
を実行してあなたのアイデンティティをすべてリストアップし(そしてあなたのローカルと比較して)、正しいキーを使っているのであればStashで二重チェックしてください(Stashの設定にあります)。パスフレーズを知っていて自動化したい場合は、次の回避策を試してください。
PS="my_passphrase"
install -vm700 <(echo "echo $PS") $PWD/my_pass
DISPLAY= SSH_ASKPASS=$PWD/my_pass ssh-add - && rm -v my_pass
トラブルシューティング:
eval "$(ssh-agent -s)"
)。GIT_TRACE=1 git pull
またはGIT_SSH_COMMAND="ssh -vv"
(Git 2.3.0以降)を指定してgitを再実行し、コマンドを再度デバッグします。あなたはパスフレーズを求めることを迂回しようと試みることができます(それはそれをtrue
にリダイレクトするでしょう)、しかし私はそれが助けになるとは思わない。それがそれを要求すれば、それには理由があり、それは基本的に必要とされます。
DISPLAY= SSH_ASKPASS=/bin/true ssh-add
ssh-add
プログラムはあなたのパスフレーズを保持する(そして提供する)ことができるagentを始めます。それをリモートで使用する方法はあなたの対話型シェルのparentの中にあります(エージェントが止まらないように)。
ここにいくつかの関連質問があります:
さて... remoteに接続すると、原則としてあなたのコマンドはそのようにはログインしないので、ssh-add
は起動しません。これを回避するには、次のスクリプトを実行します。
ssh-agent
で始まりますssh-add
で始まります弱点は2番目のステップです。あなたが パスフレーズのない鍵を使ってセキュリティを弱める でなければ、stillパスフレーズの入力を促されるでしょう。何人かの人々はこれをします、大部分の人々は反対します。
次のコマンドを使用して、自分の鍵のパスフレーズを簡単に削除できます。
ssh-keygen -p
最初のプロンプトで、ファイルパスを入力します(またはデフォルトを変更するにはEnterキーを押します)。2番目のプロンプト、古いパスフレーズを入力します。
これが最も簡単な方法のように見えます!
秘密鍵がssh-agent
にロードされていても、対応するSSH公開鍵がリモートの~/.ssh/authorized_keys
に追加されるまで、秘密鍵の復号化を促すパスワードプロンプトが表示されます。
再現するには:
# We are about to ssh to localhost, therefore, unauthorized everyone.
$ rm ~/.ssh/authorized_keys
$ eval $(ssh-agent)
# Agent pid 9290
$ ssh-add
# Enter passphrase for /home/uvsmtid/.ssh/id_rsa:
# Identity added: /home/uvsmtid/.ssh/id_rsa (/home/uvsmtid/.ssh/id_rsa)
$ ssh localhost
# Enter passphrase for key '/home/uvsmtid/.ssh/id_rsa':
# uvsmtid@localhost's password:
# NOTE: See password Prompt for private key
# (and only then Prompt for remote login).
# Why? Isn't the private key is already loaded by `ssh-add`?
$ ssh-copy-id localhost
$ ssh localhost
# NOTE: No password for private key anymore.
# The key is served by `ssh-agent`.
十分に混乱します。この場合、リモートSSHログインパスワードで十分です。
これにより、対応する秘密鍵の暗号化パスワードを知らなくても、(暗号化された秘密鍵とペアになっている)あなたの公開鍵を追加できなくなると推測できます。とにかく1回のリモートログイン手続きです。