web-dev-qa-db-ja.com

ssh Agent Managementのスクリプト:これで十分ですか?バグはありますか?

以下は、sshエージェントの設定を管理するために使用するものです。

#!/bin/echo "Must source this:" 
## Ensure that ~/.ssh/env contains valid values

unset SSH_AGENT_PID SSH_ENV_REFRESH

[ -r ~/.ssh/env ] && . ~/.ssh/env
[ -n "$SSH_AGENT_PID" ]  || {
    # No env file (or it's badly corrupted:
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

# Ping the agent process:
kill -0 "$SSH_AGENT_PID" >& /dev/null || {
    # No process, so start a new one:
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

ssh-add -l &> /dev/null
[ "$?" -gt 1 ] && {
    # Process alive but unable to be contacted
    # for some reason (wedged/defunct process,
    # or damaged/corrupt UNIX domain socket node?)

    # So kill it:
    kill "$SSH_AGENT_PID" >& /dev/null
    # ... with extreme prejudice if necessary:
    kill -0 "$SSH_AGENT_PID" >& /dev/null \
    || kill kill -9 "$SSH_AGENT_PID" >& /dev/null

    # ... and start a new one
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

[ -z "$SSH_ENV_REFRESH" ] || {
    # Over-write old env file:
    printenv | grep "^SSH_A" > ~/.ssh/env
    # Append export command:
    echo "export SSH_AGENT_PID SSH_AUTH_SOCK" >> ~/.ssh/env

    # Load the (null-passphrase) identites into the agent:
    ssh-add  < /dev/null &> /dev/null
    }

調達することを目的としています(. ~/lib/sshagent.sh)from 〜/ .bashrcまたは他のログインまたはシェル起動ファイル...あるいはcronジョブ。それは私にとってはうまくいきますが、ここの人々がそれをレビューし、私が見逃しているコーナーケースについての提案を提供することを望んでいます。

以前は〜/ .bash_loginからのみ実行していました...しかし、場合によっては、シェルが設定を取得しないことがわかりました(Xディスプレイマネージャーとリモートsshの非ログインセッション.. .sshがコマンドで呼び出される場合)。他のいくつかのケースでは、エージェントプロセスが再起動されたときに、古い設定が保持され、更新されませんでした(何らかの理由で)。だから私はそれを〜/ .bashrcで実行し、一般的に〜/ .bashrcに推奨されているように、漂遊出力を避けようとします。

それで、明らかなコーナーケースやバグはありますか?これは/ etc/bashrcのようなものに意味がありますか?それは他のシェルに適度に移植可能ですか?

3
Jim Dennis

スクリプトの移植性の問題の1つは、&> /dev/nullを使用してstdoutとstderrの両方をリダイレクトすることです。これはバシズムであり、必ずしも他のシェルで機能するとは限りません。 (私は最近これに噛まれました。)よりポータブルな方法は> /dev/null 2>&1を使用することです。

2
Steven D

なぜあなたはあなた自身を書いているのですか? keychainと呼ばれる便利でダンディな小さな製品を使ってみませんか?

これが Gentooのキーチェーンガイド (おそらく新しいバージョンの Funtooに関する同じ記事

これは基本的に、パスワードで保護されたキーを常に入力しなくても使用できる小さなプログラムです。 (使用しているディストリビューションで利用できるはずです)

GentooのOpenSSH Key Managementシリーズにも興味があるかもしれません: パート1パート2 、および パート 。それはあなたがやろうとしているいくつかのことを含んでいるように見えます。

1
xenoterracide