한 번 로그인하도록 SSH를 통한 Git 구성


196

ssh를 통해 git 저장소를 복제했습니다. 따라서 밀거나 당기면서 원래 마스터와 통신 할 때마다 암호를 다시 입력해야합니다. 비밀번호를 여러 번 입력 할 필요가 없도록 git을 어떻게 구성 할 수 있습니까?


7
보안 문제처럼 보입니다. 일반 커밋을 수행하기 위해 암호를 사용할 필요는 없지만 푸시는 다시 인증하려는 유형이지만 아마도 구식입니다.
Alex Sexton

답변:


104

시도 ssh-add당신이 필요로하는, ssh-agent실행 및 개인 키를 들고있는

(Ok, 업데이트 된 질문에 응답하여 Jefromi가 설명 한ssh-keygen 것처럼 공개 및 개인 키를 생성하기 위해 먼저 실행 합니다 . 공개 키를 서버에 넣습니다. 개인 키에 -text 암호를 입력해야하지만 그렇게하면 아래 설명 된대로 실용적 문제가 필요 합니다.) ssh-agent

ssh-agent로그인 할 때 백그라운드에서 실행하려고합니다 . 로그인 한 후에 ssh-add는 에이전트에 암호를 제공하고 키를 해독하기 위해 한 번만 실행하는 것이 좋습니다 . 그런 다음 에이전트는 키를 잠금 해제하고로드하여 메모리에 앉아 방금 ssh 할 때마다 사용할 수 있습니다.

그런 다음 모든 ssh-family 명령 1 은 에이전트를 참조하여 자동으로 개인 키를 사용할 수 있습니다.

OSX (err, macOS )에서 그놈 및 KDE 시스템 ssh-agent은 일반적으로 자동으로 시작됩니다. 저와 같이 Cygwin 또는 다른 Windows 환경이 가장 확실하게 수행되지 않는 경우 세부 사항을 살펴 보겠습니다.

여기서 시작하십시오 man ssh-agent.

에이전트를 자동으로 실행하는 다양한 방법이 있습니다. 매뉴얼 페이지에서 설명하는 것처럼 모든 로그인 세션의 다른 프로세스의 부모가되도록 실행할 수 있습니다. 그렇게하면 환경 변수가 자동으로 모든 쉘에있게됩니다. (나중에) 호출 할 때 ssh-add또는 ssh둘 다 에이전트에 매직 소켓 경로 이름 또는 기타 환경 변수가 있으므로 에이전트에 액세스 할 수 있습니다.

또는 에이전트를 일반 하위로 실행하고 환경 설정을 파일에 저장 한 다음 시작할 때 모든 셸에서 해당 파일을 소싱 할 수 있습니다.

내 OSX 및 Ubuntu 시스템은 에이전트 실행 설정을 자동으로 수행하므로 ssh-add한 번만 실행 하면됩니다. 실행을 시도 ssh-add하고 작동하는지 확인하십시오. 그렇다면 재부팅 할 때마다 한 번만 수행하면됩니다.

내 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

288

HTTPS 프로토콜을 사용하고 있었기 때문에 GitHub와 비슷한 문제가있었습니다. 사용중인 프로토콜을 확인하려면 실행하십시오.

git config -l

로 시작하는 줄을보십시오 remote.origin.url. 프로토콜을 전환하려면

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

13
나는 이것이 공식적인 대답이어야한다고 생각한다, ^ 5 @Muein!
Fer Martin

14
repo가 ​​비공개이고 소유자가 아닌 경우에는 작동하지 않습니다. 방금 Permission denied오류가 발생했습니다.
ogzd

7
이것은 하나의 리포지토리만을위한 것입니다. 전 세계적으로 어떻게 만들 수 있습니까?
onmyway133

2
@ogzd GitHub (또는 사용중인 모든 서비스)가 작동하려면 공개 SSH 키가 필요하지만 여전히 올바른 해결책입니다.
MattM

대안은git remote set-url origin git@github.com:your_username/your_project.git
icosamuel

25

이것은 git이 아닌 ssh를 구성하는 것입니다. 아직 ssh-keygen암호를 입력 하지 않은 경우 빈 암호를 사용하여 키 페어를 만들어야합니다. 그런 다음을 사용하여 공개 키를 원격 대상에 복사합니다 ssh-copy-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라는 두 파일 만 있습니다. ssh-add에 ~ / .ssh / id_rsa 파일이 더 필요한 것 같습니다. @Jefromi가 설명한 것처럼 ssh-keygen을 사용하여 해당 파일을 먼저 만들어야합니까?
reprogrammer

예, 원격 서버에 복사하기 전에 키를 작성해야합니다. "passphrase"라는 단어를 사용하면 혼란 ssh-*스러웠을 것입니다. 즉, 키를 사용하는 데 필요한 암호를 호출하는 것입니다. 실제로 리모콘의 실제 사용자 암호를 의미 한 곳은 무엇입니까?
Cascabel

예, 암호 대신 암호를 말해야합니다.
reprogrammer

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 명령을 실행하십시오.

  • 자격 증명을 한 번 입력하면 30 일 동안 캐싱이 활성화됩니다.

  • git 명령으로 다시 시도하면 자격 증명이 필요하지 않습니다.

  • 자세한 정보 : -Git에서 GitHub 비밀번호 캐싱

참고 : 자격 증명 도우미를 사용하려면 Git 1.7.10 이상이 필요합니다. 시스템을 다시 시작할 때 암호를 다시 입력해야 할 수도 있습니다.


1
당신은 구세주이며, 매번 사용자 이름 암호를 입력하는 데 지쳤습니다. 감사합니다 :)
Dave Ranjan

이것이 Linux 전용인지 Windows 전용인지 또는 둘 다인지를 지정하십시오.
joedotnot

모든 OS에 대해 @joedot는 아닙니다. 언급 된 링크를 탐색 할 수도 있으며 제목 바로 아래에 OS 옵션이 있습니다.
Nishant Thapliyal

이! 모든 경우에 작동합니다.
Akaisteph7

@Charles 안녕하세요, 방금 동일한 테스트를 마쳤으며 예상대로 작동합니다.
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
정말 도움이되었습니다. 안전하고 깨끗한 방법으로 문제를 해결하십시오. 나는 누군가 이것으로 Muein의 ​​대답을 향상시켜야한다고 생각합니다.
루이스 오테가 아라 네다

1
"프로젝트의 .git 디렉토리로 이동"처음 시도
amuliar

이 오류 발생 "치명적 : 프로토콜 'git@github.com : <username> / https'를 처리하지 않습니다"
Shivam Bharadwaj

@ShivamBharadwaj 빠른 검색은이 스레드 stackoverflow.com/questions/30474447/…을 공개했습니다 . 일부 웹 사이트에서 git clone 명령을 복사 하여이 문제가 발생할 가능성이 있습니까? 그렇다면, 대신 전체 명령을 입력하십시오.
uchamp

6

여기에 다른 두 가지가 있다고 생각합니다. 첫 번째는 정상적인 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 )이라는 비슷한 응용 프로그램이 있는데,이 인증서를 처음 사용할 때 인증서 암호를 묻는 다음 안전하게 저장하므로 다시 묻지 않습니다.


나는 키 체인을 직접 사용 한다 : 매우 유용하다.
Jakub Narębski

글을 쓰는 방법이 하나 더 있습니다 AddKeysToAgent yes.ssh / config를 하여 있습니다. 컴퓨터 끌 때까지의 메모리에로드
infoclogged


4
ssh-keygen -t rsa

암호 구를 물으면 빈칸으로 두십시오. 즉, 그냥 Enter를 누르십시오. 저것과 같이 쉬운!!


4
이 작업을 수행하면 개발 클라이언트에 액세스 할 수있는 사용자는 비밀번호없이 저장소 서버에 액세스 할 수 있습니다. ssh-agent / ssh-add 콤보는 훨씬 더 나은 보안을 제공합니다.
피터 V. Mørch

3

당신이 밀고있는 상자에서 이것을 시도하십시오

    ssh git@github.com

그런 다음 github에서 환영 응답을 받고 푸시해야합니다.


2
그것은 나를 위해 일하고 Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.있지만 어떻게 든 git은 여전히 ​​푸시하려고 할 때 암호를 묻습니다
gkucmierz

2

ssh 키로 로그인을 허용하지 않고 사용자 / 비밀번호로만 서버에서 git repo를 복제해야했습니다. 간단한 사용자 / 암호 조합을 사용하도록 Git 플러그인을 구성 할 수있는 방법을 찾지 못했기 때문에 Linux 빌드 머신에서 pre-step 단계로 다음 쉘 명령을 추가했습니다.

암호가 젠킨스 작업의 구성 및 로그에 명확한 텍스트로 표시되어 있으므로이 문제를 해결하는 좋은 방법은 아닙니다! 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 파일 맨 위에 한 줄 을 추가 하십시오. 물론 ssh-agent가 미리 실행 중이어야합니다. 실행되지 않으면 (확인 prep ssh-agent), 간단히 실행하십시오.eval $(ssh-agent)

이제 키가 시스템 전체에 메모리에로드되므로 암호를 다시 입력 할 필요가 없습니다.

솔루션의 출처는 /ubuntu/362280/enter-ssh-passphrase-once/853578#853578입니다.


0

Windows에서 ssh를 사용하고 있기 때문에 암호 문구를 항상 입력하지 않도록 노력하고 있습니다. 내가 한 것은 내 .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.