SSH経由のGitを設定して1回ログインする


195

gitリポジトリのクローンをsshで作成しました。そのため、プッシュまたはプルによってオリジンマスターと通信するたびに、パスワードを再入力する必要があります。パスワードを何度も入力する必要がないようにgitを構成するにはどうすればよいですか?


7
セキュリティの問題のようです。通常のコミットを実行するためにパスワードを使用する必要はありませんが、プッシュは再認証したいタイプのタイプですが、おそらく私は古いです。
Alex Sexton、

回答:


104

試してみてください。秘密鍵を実行して保持しているssh-add必要がありssh-agentます

(OK、更新された質問に応答して、Jefromiが説明したようにssh-keygen、最初に実行して公開鍵と秘密鍵を生成します。公開鍵をサーバーに配置します。プレーンの同等のものがない場合は、パスフレーズを使用する必要があります。 -秘密鍵のテキストパスワード。ただし、その場合は、以下で説明するように、実際的な問題として必要になります。) ssh-agent

ssh-agentログイン時にバックグラウンドで実行する必要があります。ログインしたらssh-add、キーをデコードするためにエージェントにパスフレーズを提供するために、一度だけ実行するのが1つの考え方です。その後、エージェントはキーをロック解除してロードした状態でメモリに格納され、どこかでsshを実行するたびに使用できるようになります。

すべてのssh-familyコマンド1はエージェントに問い合わせ、自動的に秘密鍵を使用できるようにします。

OSX(err、macOS)では、GNOMEおよびKDEシステムssh-agentは通常、自動的に起動されます。私と同じように、Cygwinやその他のWindows環境を使用している場合に備えて、詳細を確認します。

ここから開始:man ssh-agent

エージェントを自動的に実行するには、さまざまな方法があります。manページで説明されているように、それを実行して、ログインセッションの他のすべてのプロセスの親になるようにすることができます。そうすれば、それが提供する環境変数は自動的にすべてのシェルに含まれます。あなたが(後で)呼び出すssh-addssh、または両方がエージェントにアクセスできるようになると、それらはすべて魔法のソケットパス名などの環境変数を持っているからです。

または、エージェントを通常の子として実行し、環境設定をファイルに保存して、起動時にすべてのシェルでそのファイルを読み込むことができます。

私のOSXとUbuntuシステムは自動的にエージェント起動セットアップを行うので、私がしなければならないことはssh-add1回実行するだけです。実行ssh-addしてみて、機能するかどうかを確認します。機能する場合は、再起動ごとに1回実行するだけです。

私のCygwinシステムはそれを手動で行う必要があったので、私はこれを自分で.profile行い、.bashrcソースがあります.profile

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

.agentファイルは、スクリプトによって自動的に作成されます。環境変数の定義とエクスポートが含まれています。上記は.agentファイルのソースを試み、次にps(1)エージェントを試みます。動作しない場合は、エージェントを起動し、新しいエージェントファイルを作成します。単に実行することもできssh-add、失敗した場合はエージェントを起動します。


1. sudo正しいpam拡張子を持つローカルとリモートでさえ。


1
むしろからの出力調達よりもssh-agent、それは滑らかな印象の使用にはおそらくです:eval `ssh-agent`
scottsome

285

HTTPSプロトコルを使用していたため、GitHubにも同様の問題がありました。使用しているプロトコルを確認するには、次を実行します

git config -l

で始まる行を見てくださいremote.origin.url。プロトコルを切り替えるには

git config remote.origin.url git@github.com:your_username/your_project.git

12
これが正式な答えになると思います。^ 5 @Muein!
ファーマーティン

14
これは、リポジトリがプライベートであり、あなたが所有者でない場合は機能しません。私はちょうどに直面Permission deniedエラー。
ogzd 2013

7
これは1つのリポジトリのみです。どのようにしてグローバルに作成できますか?
onmyway133 2014年

2
@ogzd GitHub(または使用しているサービス)が機能するためには、公開SSHキーが必要ですが、これは依然として正しい解決策です。
MattM 2017

別の方法はgit remote set-url origin git@github.com:your_username/your_project.git
icosamuel

24

これはgitではなくsshの設定に関するものです。まだ行っていない場合は、ssh-keygen(空白のパスフレーズを使用して)を使用してキーペアを作成する必要があります。次に、を使用して公開鍵をリモート宛先にコピーしssh-copy-idます。複数のキーが必要な場合(他の目的でパスフレーズを使用したより安全なキーなど)や、非常に奇妙なマルチIDの処理が行われている場合を除いて、これは簡単です。

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

編集:あなたは本当にDigitalRossの答えを読むべきですが、パスフレーズでキーを使用する場合は、を使用ssh-add <key-file>してそれらを追加する必要がありますssh-agent(そしてssh-agent、ディストリビューションでまだ実行されているものがない場合は、明らかに起動します)。


2
これが質問に答えているかどうかはわかりません。彼はすでにそうしているに違いありません。そうでないと、サイトにアクセスできません。彼が必要とする答えは次のとおりです。彼は ssh-agentパスフレーズを入力するたびに問題を回避したいからです。反対投票ではありませんが、私が誤解していない限り、この回答を改善する必要があると思います...
DigitalRoss

2
@DigitalRoss:ああ、OPに実際にキーが設定されているかどうか、質問を読んで確信が持てませんでした。おそらくあなたは正しいと思いますが、私は意図的にパスフレーズを使用しないことを提案しようとしました。ただし、もちろんあなたは正しいですssh-agent。あなたに+1!
Cascabel、

ssh-keygenとssh-addのどちらを使用する必要があるのか​​混乱しています。私の〜/ .ssh /ディレクトリには、configとknown_hostsの2つのファイルしかありません。ssh-addには別のファイル〜/ .ssh / id_rsaが必要なようです。@Jefromiが説明するように、最初にssh-keygenを使用してそのファイルを作成する必要がありますか?

はい、キーをリモートサーバーにコピーする前に、キーを作成する必要があります。おそらく「パスフレーズ」という言葉の使い方に戸惑っていたと思います。これはssh-*、キーを使用するために必要なパスフレーズと呼ばれるもので、実際にリモートの実際のユーザーパスワードを意味しているのでしょうか。
Cascabel、

はい、パスフレーズの代わりにパスワードを言ったはずです。

23

リポジトリのクローンを作成したときに、HTTPSではなくSSH URLを使用していることを確認してください。リポジトリのクローンURLボックスで、URLをコピーする前にSSHプロトコルを選択します。下の画像を参照してください。

ここに画像の説明を入力してください


23

HTTPSを使用してクローンを作成した場合(推奨):-

git config --global credential.helper cache

その後

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000(30日(秒))は、30日間のキャッシュを有効にします(または任意のスイート)。

  • 次に、ユーザー名とパスワードを要求する単純なgitコマンドを実行します。

  • 資格情報を1回入力すると、キャッシュが30日間有効になります。

  • gitコマンドを使用して再試行すると、資格情報は必要ありません。

  • 詳細情報:-GitでのGitHubパスワードのキャッシュ

認証ヘルパーを使用するには、Git 1.7.10以降が必要です。システムの再起動時に、パスワードの再入力が必要になる場合があります。


1
あなたは救世主であり、毎回ユーザー名とパスワードを入力するのに疲れていました。ありがとう:)
Dave Ranjan '30

これがLinuxのみか、Windowsのみか、またはその両方かを指定してください。
joedotnot

@joedotnotすべてのOS。また、上記のリンクを参照すると、見出しの下にOSオプションが表示されます。
Nishant Thapliyal

この!すべてのケースで機能します。
Akaisteph7

@チャールズこんにちは、私は同じことをテストしたところ、期待どおりに機能しています。
Nishant Thapliyal

8

git-bashやターミナルでコマンドを実行するよりも直接ファイルを編集したい人のためにMueinの考えを拡張します。

プロジェクトの.gitディレクトリ(ローカルマシンのプロジェクトルート)に移動し、「config」ファイルを開きます。次に、[remote "origin"]を探し、URL構成を次のように設定します。

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git

1
これは本当に役に立ちました。問題を修正するための安全でクリーンな方法。誰かがこれでムアンの答えを改善すべきだと思います。
Luis Ortega Araneda 2013

1
"プロジェクトの.gitディレクトリに移動します"初めての試み
特別な

このエラーを取得すると、「致命的:プロトコル 'git@github.com:<username> / https'を処理できません」
Shivam Bharadwaj

@ShivamBharadwajのクイック検索により、このスレッドが明らかになりましたstackoverflow.com/questions/30474447/…。Webサイトからgit cloneコマンドをコピーしてこの問題が発生している可能性はありますか?はいの場合は、代わりに完全なコマンドを入力してみてください。
uchamp

6

ここには2つの異なる点があると思います。1つ目は、通常のSSH認証では、ユーザーがアカウントのパスワードを入力する必要があることです(アカウントパスワードは、sshd構成に応じて、さまざまな方法で認証されます)。

証明書を使用してそのパスワードを入力することを回避できます。証明書を使用する場合でもパスワードを入力する必要がありますが、今回は秘密鍵のパスワードです(アカウントのパスワードとは無関係です)。

これを行うには、steveth45によって指摘された指示に従うことができます。

公開鍵認証

毎回証明書のパスワードを入力したくない場合は、DigitalRossによって指摘されているように、ssh-agentを使用できます。

これを行う正確な方法は、UnixとWindowsによって異なりますが、基本的にはログイン時にssh-agentをバックグラウンドで実行し、次に初めてログインしたときにssh-addを実行してエージェントにパスフレーズを与える必要があります。次に、すべてのssh-familyコマンドがエージェントに問い合わせて、パスフレーズを自動的に取得します。

ここから開始:man ssh-agent。

ssh-agentの唯一の問題は、少なくとも* nixでは、すべての新しいシェルに証明書パスワードを設定する必要があることです。そして、証明書が「ロード」され、それを使用して、どのような種類のパスワードも入力せずにsshサーバーに対して認証できます。しかし、これはその特定のシェルにあります。

ではキーチェーンあなたはssh-agentのが、「システム全体」と同じことを行うことができます。コンピューターの電源を入れたら、シェルを開き、証明書のパスワードを入力します。そして、他のすべてのシェルはその「ロードされた」証明書を使用し、PCを再起動するまでパスワードが要求されることはありません。

Gnomeには、Gnome Keyringと呼ばれる同様のアプリケーションがあり、最初に使用するときに証明書のパスワードを要求し、次にそれを安全に保存するので、再度要求されることはありません。


私は自分でキーチェーンを使用しています。非常に便利です。
JakubNarębski、2009年

AddKeysToAgent yes.ssh / configに書き込む方法はもう1つあります。その後、コンピュータの電源を切るまでメモリに読み込まれます
infoclogged


4
ssh-keygen -t rsa

パスフレーズを求められたら、空白のままにします。つまり、Enterキーを押します。とても簡単です!!


4
これを行うと、開発クライアントにアクセスできる人なら誰でも、パスワードを必要とせずにリポジトリサーバーにアクセスできることに注意してください。ssh-agent / ssh-addコンボにより、セキュリティが大幅に向上します。
PeterV.Mørch12年

3

あなたが押している箱からこれを試してください

    ssh git@github.com

その後、githubからウェルカムレスポンスが返され、プッシュしても問題ありません。


2
それは私のために働いていますがHi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.、どういうわけか私がプッシュしようとするとき、どういうわけかgitはまだパスワードを私に尋ねます
gkucmierz

2

ログインvie sshキーを許可せず、ユーザー/パスワードのみを使用するサーバーからgitリポジトリを複製する必要がありました。単純なユーザー/パスワードの組み合わせを使用するようにGitプラグインを構成する方法が見つからなかったため、次のシェルコマンドを、ツールexpect(apt-get install expect)に依存するLinuxビルドマシンの事前ビルドステップとして追加しました。

これは、JENKINSジョブの構成とログに明確なテキストとしてパスワードが表示されるため、この問題を解決する良い方法ではありません。RSAキー認証またはその他の構成の可能性を構成する方法がない場合にのみ使用してください。

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'

1

AddKeysToAgent yes.ssh / configファイルの先頭に1行追加します。もちろん、ssh-agentが事前に実行されている必要があります。実行されていない場合は(で確認prep ssh-agent)、単に実行してくださいeval $(ssh-agent)

これで、キーがシステム全体でメモリに読み込まれ、パスフレーズを再度入力する必要がなくなりました。

ソリューションのソースは/ubuntu/362280/enter-ssh-passphrase-once/853578#853578です


0

また、Windowsでsshを使用しているため、パスフレーズを常に入力しないようにしています。特定のセッションでパスフレーズ1を入力できるように、.profileファイルを変更しました。これはコードの一部です:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

これで、セッションで一度パスフレーズを入力します。


-1

私はこれらすべての提案などを試しましたが、AWSインスタンスからgit cloneできるようにしました。何もうまくいきませんでした。私はやっと必死にだまされました:ローカルマシンにid_rsa.pubの内容をコピーし、それをAWSインスタンスの〜/ .ssh / known_hostsに追加しました。


1
〜/ .ssh / authorized_keysを意味していませんか?
Kevin_Kinsey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.