2

最近、AskUbuntuで、bash ログイン中にパスフレーズを再入力しなくても後で再利用できるように、ssh-agent でパスフレーズで保護されたキーを自動的に保存する方法について質問しました (非 GUI/Gnome)。応答で素敵な bash スクリプトを取得しましたが、残念ながら、git 操作に関係なく、パスフレーズを要求するようにトリガーされます。キーがまだ ssh-agent になく、リモートの git 操作が実行されている場合にのみプロンプトが表示されるようにします。

これは$(__git_ps1 "[%s]")、現在の作業ディレクトリ ( ) の git ブランチを表示するために bash プロンプトで使用しているためpwdです。そのため、マシンに ssh すると、bash プロンプトをレンダリングする前に、すぐにキーのパスフレーズを求められます!

AskUbuntu に関する私の質問への回答からの現在のスクリプトは次のようになります。

~/.bash_profile

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

ご覧のとおり、すべての git 操作で git 関数がトリガーされます。

git を使用して接続を行うと思っていましたが、上記のスクリプトで関数sshをトリガーするようには見えません。ssh()git はどのように ssh 操作を実行しますか? bash パスに依存するのではなく、/usr/bin/ssh に直接アクセスしますか?

これを行うためのより良い方法、または現在のスクリプトの優れた回避策はありますか?

4

2 に答える 2

3

複数のホストに再帰的に ssh する場合でも、エージェント転送を使用できます。ssh が初めてキーを要求すると、ローカル エージェントが実行$SSH_ASKPASSされ、ロック解除されたキーがホストに転送されます。エージェント転送を有効にする必要があることに注意してください ( man 5 ssh_configを参照)。

~/.ssh/config で、必要な個々のホストごとに転送を有効にします。

Host example.org
    ForwardAgent yes

サーバー側のエージェント転送は、デフォルトで有効になっています。

何らかの理由でエージェント転送を使用したくない場合は、ssh コマンドをオーバーライドすることが唯一の選択肢だと思います。

于 2011-04-26T16:19:51.563 に答える
-2

キーにパスフレーズを使用することはお勧めしません。ジトライトのようなものはうまく機能しません。パス フレーズのない新しいキーの使用を検討してください。

私の $0.02

于 2011-04-26T14:47:35.037 に答える