354

SSH エイリアスを使用して Bitbucket.com からプルするリモート Git リポジトリとしてサイトを持っています。サーバーで ssh-agent を手動で開始できますが、SSH 経由でログインするたびにこれを行う必要があります。

ssh-agent を手動で開始します。

eval ssh-agent $SHELL

次に、エージェントを追加します。

ssh-add ~/.ssh/bitbucket_id

次に、私が行うと表示されます:

ssh-add -l

そして、私は行く準備ができています。このプロセスを自動化して、ログインするたびに行う必要がないようにする方法はありますか? サーバーは RedHat 6.2 (Santiago) を実行しています。

4

12 に答える 12

453

この記事を読んでください。これは非常に便利だと思うかもしれません:

https://web.archive.org/web/20210506080335/https://mah.everybody.org/docs/ssh

上記のリンクがいつか消える場合に備えて、以下のソリューションの主要部分をキャプチャしています。

Daniel Starin による Joseph M. Reagle によるこのソリューション:

これをあなたに追加してください.bash_profile

SSH_ENV="$HOME/.ssh/agent-environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

このバージョンは、ssh-agent が既に起動されているかどうかを確認し、見つからない場合は起動して設定を保存し、次回の起動時に使用できるようにするため、特に優れています。シェル。

于 2013-09-20T10:57:20.927 に答える
158

Arch Linux では、以下は非常にうまく機能します (すべての systemd ベースのディストリビューションで機能するはずです):

以下を に追加して、systemd ユーザー サービスを作成します~/.config/systemd/user/ssh-agent.service

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

ソケットの環境変数を持つようにシェルをセットアップします ( .bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

ログイン時にサービスが自動的に開始されるように、サービスを有効にして開始します。

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

次の構成設定をローカルの ssh 構成ファイルに追加します~/.ssh/config(これは SSH 7.2 以降で機能します)。

AddKeysToAgent  yes

これにより、実行中のエージェントにキーを常に追加するように ssh クライアントに指示されるため、事前に ssh で追加する必要はありません。

于 2016-08-16T17:25:29.790 に答える
126

古い質問ですが、同様の状況に遭遇しました。上記の答えが必要なものを完全に達成するとは思わないでください。不足している部分は次のとおりですkeychain。まだインストールされていない場合はインストールします。

sudo apt-get install keychain

次に、次の行を~/.bashrc

eval $(keychain --eval id_rsa)

これにより、実行されていない場合は開始され、ssh-agent実行されている場合は接続され、ssh-agent環境変数がシェルに読み込まれ、ssh キーが読み込まれます。

ロードしたいid_rsa秘密鍵に変更します。~/.ssh

キーチェーンの便利なオプション:

  • -q静音モード
  • --noask起動時にパスワードを要求するのではなく、ssh キーが実際に使用されるときに必要に応じて要求します。

参照

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

于 2014-07-23T04:46:55.837 に答える
39

これを に追加し~/.bashrc、ログアウトしてから再度ログインして有効にします。

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

これは、各再起動後に最初にログインするときにのみパスワードの入力を求める必要があります。ssh-agent実行している限り、同じものを再利用し続けます。

于 2016-07-27T17:28:10.720 に答える
39

受け入れられた解決策には、次の欠点があります。

  • メンテナンスが複雑です。
  • エラーやセキュリティ違反につながる可能性のあるストレージ ファイルを評価します。
  • エージェントを開始しますが、停止しません。これは、キーをイグニッションのままにしておくのとほぼ同じです。

キーでパスワードを入力する必要がない場合は、次の解決策をお勧めします。.bash_profile 以下を最後に追加します(必要に応じてキーリストを編集します):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

次の利点があります。

  • はるかに簡単な解決策;
  • エージェント セッションは、bash セッションが終了すると終了します。

考えられる欠点があります。

  • 対話型ssh-addコマンドは 1 つのセッションにのみ影響を与えます。これは、実際には非常に特殊な状況でのみ問題になります。
  • パスワードの入力が必要な場合は使用できません。
  • 開始されたシェルは非ログインになります(これは何の影響もありません)。

複数のssh-agentプロセスはメモリや CPU 時間を消費しないため、不利ではないことに注意してください。

于 2015-04-08T16:44:17.943 に答える
4

これを/etc/profile - システム全体 (またはユーザーローカル.profile、または.bash_profile )に追加することで解決しました:

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`whoami |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
    echo $SERVICE running.
else
    echo $SERVICE not running.
    echo starting
    ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

これにより、現在のユーザーに対して実行されていない場合は新しい ssh-agent が開始され、実行されている場合は ssh-agent env パラメーターが再設定されます。

于 2015-05-29T13:39:54.240 に答える
2

私はあなたの答えがとても好きです。ホストからの作業がcygwin / linuxずっと簡単になりました。セキュアにするために、start 関数と end 関数を組み合わせました。

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${SSH_ENV}

    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
于 2015-12-17T10:53:14.663 に答える