Định cấu hình Git qua SSH để đăng nhập một lần


195

Tôi đã nhân bản kho git của tôi qua ssh. Vì vậy, mỗi lần tôi liên lạc với chủ gốc bằng cách đẩy hoặc kéo, tôi phải nhập lại mật khẩu của mình. Làm cách nào tôi có thể định cấu hình git để không cần nhập mật khẩu nhiều lần?


7
Có vẻ như là một vấn đề bảo mật, bạn không phải sử dụng bất kỳ mật khẩu nào để thực hiện các cam kết thông thường, nhưng đẩy là loại điều bạn muốn xác thực lại, nhưng có lẽ tôi đã lỗi thời.
Alex Sexton

Câu trả lời:


104

Hãy thử ssh-add, bạn cần ssh-agentđược chạy và giữ khóa riêng của bạn

(Ok, trả lời câu hỏi đã cập nhật, trước tiên bạn chạy ssh-keygenđể tạo khóa chung và khóa riêng như Jefromi đã giải thích . Bạn đặt khóa chung trên máy chủ. Bạn nên sử dụng cụm mật khẩu, nếu bạn không có từ tương đương -text mật khẩu trong khóa riêng của bạn. Nhưng khi bạn làm vậy, thì bạn cần một vấn đề thực tế ssh-agentnhư được giải thích dưới đây.)

Bạn muốn chạy ssh-agenttrong nền khi bạn đăng nhập. Một khi bạn đăng nhập, ý tưởng là chạy ssh-addmột lần và chỉ một lần, để cung cấp cho tác nhân cụm mật khẩu của bạn, để giải mã khóa của bạn. Các đại lý sau đó chỉ ngồi trong bộ nhớ với khóa của bạn được mở khóa và tải, sẵn sàng để sử dụng mỗi khi bạn ssh ở đâu đó.

Tất cả các lệnh ssh-Family 1 sau đó sẽ tham khảo ý kiến ​​của đại lý và tự động có thể sử dụng khóa riêng của bạn.

Trên các hệ thống OSX (err, macOS ), Gnome và KDE, ssh-agentthường được khởi chạy tự động cho bạn. Tôi sẽ đi qua các chi tiết trong trường hợp, giống như tôi, bạn cũng có một môi trường Cygwin hoặc các cửa sổ khác, nơi điều này chắc chắn không được thực hiện cho bạn.

Bắt đầu ở đây : man ssh-agent.

Có nhiều cách khác nhau để tự động chạy các đại lý. Như trang hướng dẫn giải thích, bạn có thể chạy nó để nó là cha mẹ của tất cả các quy trình khác của phiên đăng nhập của bạn. Bằng cách đó, các biến môi trường mà nó cung cấp sẽ tự động nằm trong tất cả các shell của bạn. Khi bạn (sau này) gọi ssh-addhoặc sshcả hai sẽ có quyền truy cập vào tác nhân bởi vì tất cả chúng đều có các biến môi trường với tên đường dẫn ổ cắm ma thuật hoặc bất cứ điều gì.

Ngoài ra, bạn có thể chạy tác nhân như một đứa trẻ bình thường, lưu cài đặt môi trường trong một tệp và nguồn tệp đó trong mọi shell khi nó khởi động.

Hệ thống OSX và Ubuntu của tôi tự động thực hiện cài đặt khởi chạy tác nhân, vì vậy tất cả những gì tôi phải làm là chạy ssh-addmột lần. Hãy thử chạy ssh-addvà xem nếu nó hoạt động, nếu vậy, sau đó bạn chỉ cần làm điều đó một lần cho mỗi lần khởi động lại.

Hệ thống Cygwin của tôi cần nó được thực hiện thủ công, vì vậy tôi đã làm điều này trong tôi .profilevà tôi có .bashrcnguồn .profile:

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

Tập .agenttin được tạo tự động bởi tập lệnh; nó chứa các định nghĩa biến môi trường và xuất khẩu. Ở trên cố gắng tìm nguồn tệp .agent, sau đó thử đến ps(1)tác nhân. Nếu nó không hoạt động, nó khởi động một tác nhân và tạo một tệp tác nhân mới. Bạn cũng có thể chạy ssh-addvà nếu nó không khởi động một tác nhân.


1. Và thậm chí địa phương và từ xa sudovới phần mở rộng pam đúng.


1
Thay vì tìm nguồn cung ứng đầu ra từ ssh-agentnó có thể gọn gàng hơn để sử dụng:eval `ssh-agent`
scottsome 18/2/2016

285

Có một vấn đề tương tự với GitHub vì tôi đang sử dụng giao thức HTTPS. Để kiểm tra giao thức nào bạn đang sử dụng chỉ cần chạy

git config -l

và nhìn vào dòng bắt đầu với remote.origin.url. Để chuyển đổi giao thức của bạn

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

12
Tôi nghĩ đây nên là câu trả lời chính thức, ^ 5 @Muein!
Fer Martin

14
Điều này không hoạt động khi repo là riêng tư và bạn không phải là chủ sở hữu. Tôi chỉ phải đối mặt với một Permission deniedlỗi.
ogzd

7
Đây chỉ là một repo, làm thế nào tôi có thể làm cho nó trên toàn cầu?
onmyway133

2
@ogzd GitHub (hoặc bất kỳ dịch vụ nào bạn đang sử dụng) cần khóa SSH công khai của bạn trước khi điều này hoạt động, nhưng đây vẫn là giải pháp chính xác.
MattM

một thay thế làgit remote set-url origin git@github.com:your_username/your_project.git
icosamuel

24

Đây là về cấu hình ssh, không phải git. Nếu bạn chưa có, bạn nên sử dụng ssh-keygen(với cụm mật khẩu trống) để tạo một cặp khóa. Sau đó, bạn sao chép khóa chung vào đích từ xa ssh-copy-id. Trừ khi bạn có nhu cầu về nhiều khóa (ví dụ: khóa an toàn hơn với cụm mật khẩu cho các mục đích khác) hoặc bạn có một số nội dung đa danh tính thực sự kỳ lạ đang diễn ra, thật đơn giản:

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

Chỉnh sửa: Bạn thực sự chỉ nên đọc câu trả lời của DigitalRoss, nhưng: nếu bạn sử dụng các khóa có cụm mật khẩu, bạn sẽ cần sử dụng ssh-add <key-file> để thêm chúng vào ssh-agent(và rõ ràng là bắt đầu ssh-agentnếu bản phân phối của bạn không có sẵn cho bạn).


2
Tôi không chắc điều này trả lời câu hỏi, anh ta chắc chắn đã làm điều đó nếu không anh ta sẽ không thể truy cập trang web. Câu trả lời anh ta cần là : ssh-agent, vì anh ta muốn bỏ qua vấn đề nhập mật khẩu mọi lúc. Không hạ thấp nhưng tôi nghĩ bạn cần cải thiện câu trả lời này, trừ khi tôi là người hiểu lầm ...
DigitalRoss

2
@DigitalRoss: Ah, tôi không chắc chắn đã đọc câu hỏi nếu OP thực sự có các phím được thiết lập. Mặc dù bạn có thể đúng và tôi đã cố tình đề nghị không sử dụng cụm mật khẩu. Tuy nhiên, bạn tất nhiên đúng về ssh-agent. +1 cho bạn!
Cascabel

Tôi bối rối không biết mình cần sử dụng ssh-keygen hay ssh-add. Trong thư mục ~ / .ssh / của tôi, tôi chỉ có hai tệp: config và know_hosts. Có vẻ như ssh-add yêu cầu một tệp khác ~ / .ssh / id_rsa. Tôi có nên tạo tệp đó trước bằng cách sử dụng ssh-keygen như @Jefromi đã giải thích không?
lập trình lại

Có, bạn cần tạo khóa trước khi có thể sao chép nó vào máy chủ từ xa. Tôi nghĩ có lẽ chúng tôi đã nhầm lẫn khi bạn sử dụng từ "cụm mật khẩu" - đó là cách ssh-*gọi cụm mật khẩu cần thiết để sử dụng khóa - nơi bạn thực sự có nghĩa là mật khẩu người dùng thực sự của bạn trên điều khiển từ xa?
Cascabel

Có, tôi nên nói mật khẩu thay vì mật khẩu.
lập trình lại

23

Đảm bảo rằng khi bạn nhân bản kho lưu trữ, bạn đã làm như vậy với URL SSH chứ không phải HTTPS; trong hộp URL clone của repo, chọn giao thức SSH trước khi sao chép URL. Xem hình ảnh dưới đây:

nhập mô tả hình ảnh ở đây


23

Nếu bạn đã nhân bản bằng HTTPS (được khuyến nghị) thì: -

git config --global credential.helper cache

và sau đó

git config --global credential.helper 'cache --timeout=2592000'
  • thời gian chờ = 2592000 (30 ngày tính bằng giây) để bật bộ đệm trong 30 ngày (hoặc bất kỳ bộ nào bạn muốn).

  • Bây giờ hãy chạy một lệnh git đơn giản yêu cầu tên người dùng và mật khẩu của bạn.

  • Nhập thông tin đăng nhập của bạn một lần và bây giờ bộ nhớ đệm được bật trong 30 ngày.

  • Hãy thử lại với bất kỳ lệnh git nào và bây giờ bạn không cần bất kỳ thông tin xác thực nào.

  • Để biết thêm thông tin: - Lưu mật khẩu GitHub của bạn trong Git

Lưu ý : Bạn cần Git 1.7.10 hoặc mới hơn để sử dụng trình trợ giúp thông tin xác thực. Khi khởi động lại hệ thống, chúng tôi có thể phải nhập lại mật khẩu.


1
Bạn là một vị cứu tinh, đã mệt mỏi với việc gõ mật khẩu tên người dùng mỗi lần. Cảm ơn :)
Dave Ranjan

vui lòng xác định nếu điều này chỉ dành cho Linux hoặc chỉ Windows hoặc cả hai.
joedotnot

@joedotnot cho tất cả các hệ điều hành. Bạn cũng có thể duyệt liên kết được đề cập và ở đó bạn sẽ tìm thấy tùy chọn HĐH ngay bên dưới tiêu đề.
Nishant Thapliyal

Điều này! Hoạt động trong mọi trường hợp.
Akaisteph7

@Charles Xin chào, tôi vừa thử nghiệm tương tự và nó đang hoạt động như mong đợi.
Nishant Thapliyal

8

Mở rộng suy nghĩ của Muein cho những người thích chỉnh sửa tệp trực tiếp hơn khi chạy các lệnh trong git-bash hoặc terminal.

Chuyển đến thư mục .git của dự án của bạn (gốc dự án trên máy cục bộ của bạn) và mở tệp 'config'. Sau đó tìm [remote "origin"] và đặt cấu hình url như sau:

[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
Điều này thực sự có ích. Cách an toàn và sạch sẽ để khắc phục vấn đề. Tôi nghĩ ai đó nên cải thiện câu trả lời của Muein với câu hỏi này.
Luis Ortega Araneda

1
"Chuyển đến thư mục .git của dự án của bạn" thử lần đầu tiên
đặc biệt

Gặp lỗi này "nghiêm trọng: Tôi không xử lý giao thức 'git@github.com: <tên người dùng> / https'"
Shivam Bharadwaj

@ShivamBharadwaj một tìm kiếm nhanh đã tiết lộ chủ đề này stackoverflow.com/questions/30474447/ . Có khả năng bạn đang sao chép lệnh git clone từ một số trang web và gặp phải vấn đề này không? Nếu có, sau đó thử gõ lệnh hoàn chỉnh.
uchamp

6

Tôi nghĩ có hai điều khác nhau ở đây. Đầu tiên là xác thực SSH thông thường yêu cầu người dùng đặt mật khẩu của tài khoản (trong đó mật khẩu tài khoản sẽ được xác thực theo các phương pháp khác nhau, tùy thuộc vào cấu hình sshd).

Bạn có thể tránh đặt mật khẩu đó bằng chứng chỉ. Với chứng chỉ bạn vẫn phải đặt mật khẩu, nhưng lần này là mật khẩu của khóa riêng của bạn (không phụ thuộc vào mật khẩu của tài khoản).

Để làm điều này, bạn có thể làm theo các hướng dẫn được chỉ ra bởi steveth45:

Với xác thực khóa công khai .

Nếu bạn muốn tránh đặt mật khẩu của chứng chỉ mỗi lần thì bạn có thể sử dụng ssh-agent, như được chỉ ra bởi DigitalRoss

Cách chính xác bạn làm điều này phụ thuộc vào Unix vs Windows, nhưng về cơ bản, bạn cần chạy ssh-agent trong nền khi bạn đăng nhập, và sau đó lần đầu tiên bạn đăng nhập, hãy chạy ssh-add để cung cấp cho tác nhân mật khẩu của bạn. Tất cả các lệnh ssh-Family sau đó sẽ tham khảo ý kiến ​​của đại lý và tự động chọn cụm mật khẩu của bạn.

Bắt đầu ở đây: người đàn ông ssh-đại lý.

Vấn đề duy nhất của ssh-agent là, ít nhất, trên * nix, bạn phải đặt mật khẩu chứng chỉ trên mỗi shell mới. Và sau đó chứng chỉ được "tải" và bạn có thể sử dụng nó để xác thực với máy chủ ssh mà không cần đặt bất kỳ loại mật khẩu nào. Nhưng đây là trên vỏ đặc biệt.

Với móc khóa bạn có thể làm điều tương tự như ssh-agent nhưng "toàn hệ thống". Khi bạn bật máy tính, bạn mở một vỏ và đặt mật khẩu của chứng chỉ. Và sau đó, mọi shell khác sẽ sử dụng chứng chỉ "đã tải" đó và mật khẩu của bạn sẽ không bao giờ được hỏi lại cho đến khi bạn khởi động lại PC.

Gnome có một ứng dụng tương tự, được gọi là Gnome key , yêu cầu mật khẩu chứng chỉ của bạn vào lần đầu tiên bạn sử dụng và sau đó nó lưu trữ nó một cách an toàn để bạn sẽ không bị hỏi lại.


Tôi sử dụng móc khóa bản thân: rất hữu ích.
Jakub Narębski

có một cách nữa bằng cách viết bằng AddKeysToAgent yes.ssh / config. Sau đó, nó được tải vào bộ nhớ cho đến khi bạn tắt máy tính
truyền vào


4
ssh-keygen -t rsa

Khi được yêu cầu nhập cụm mật khẩu, hãy để trống, tức là chỉ cần nhấn enter. đơn giản vậy thôi!!


4
Xin lưu ý rằng nếu bạn làm điều này, thì bất kỳ ai có quyền truy cập vào máy khách phát triển của bạn đều có quyền truy cập vào máy chủ kho lưu trữ mà không cần mật khẩu. Combo ssh-agent / ssh-add cho bảo mật tốt hơn nhiều.
Peter V. Mørch

3

Hãy thử điều này từ hộp bạn đang đẩy từ

    ssh git@github.com

Sau đó, bạn sẽ nhận được phản hồi chào mừng từ github và sẽ ổn để đẩy.


2
Nó hoạt động với tôi Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Nhưng bằng cách nào đó, git vẫn hỏi tôi mật khẩu khi tôi cố gắng đẩy
gkucmierz

2

Tôi đã phải sao chép một git repo từ một máy chủ không cho phép đăng nhập khóa vie ssh mà chỉ với một người dùng / mật khẩu. Tôi không tìm thấy cách nào để định cấu hình Plugin Git để sử dụng kết hợp mật khẩu / người dùng đơn giản vì vậy tôi đã thêm lệnh shell sau đây là bước xây dựng trước trên máy xây dựng linux, phụ thuộc vào công cụ mong đợi (apt-get install Kỳ vọng):

ĐÂY KHÔNG PHẢI LÀ MỘT CÁCH TỐT CỦA GIẢI QUYẾT VẤN ĐỀ NÀY NHƯ MẬT KHẨU CỦA BẠN ĐƯỢC HIỂN THỊ NHƯ VĂN BẢN R IN RÀNG TRONG VIỆC XÁC NHẬN VÀ ĐĂNG NHẬP CÔNG VIỆC JENKIN! CHỈ SỬ DỤNG NẾU NẾU KHÔNG CÓ CÁCH XÁC NHẬN CẤP PHÉP RSA-KEY HOẶC CÁC KHẢ NĂNG XÁC NHẬN KHÁC!

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

Thêm một dòng AddKeysToAgent yestrên đầu tệp .ssh / config. Đại lý ssh-agent phải được chạy trước. Nếu nó không chạy (kiểm tra bằng prep ssh-agent), thì chỉ cần chạy nóeval $(ssh-agent)

Bây giờ, khóa được tải toàn hệ thống vào bộ nhớ và bạn không phải nhập lại cụm mật khẩu.

Nguồn gốc của giải pháp là https://askubfox.com/questions/362280/enter-ssh-passphrase-once/853578#853578


0

Tôi đã cố gắng tránh gõ cụm mật khẩu mọi lúc vì tôi đang sử dụng ssh trên windows. Những gì tôi đã làm là sửa đổi tệp .profile của mình để tôi nhập cụm mật khẩu của mình vào một phiên cụ thể. Vì vậy, đây là đoạn mã:

    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

vì vậy với điều này tôi gõ cụm mật khẩu của mình một lần trong một phiên ..


-1

Tôi đã thử tất cả các đề xuất này và hơn thế nữa, để tôi có thể lấy bản sao từ ví dụ AWS của mình. Không có gì làm việc. Cuối cùng tôi đã lừa được sự tuyệt vọng: Tôi đã sao chép nội dung của id_rsa.pub trên máy cục bộ của mình và gắn nó vào ~ / .ssh / know_hosts trên ví dụ AWS của tôi.


1
Bạn có chắc là bạn không có ý ~ / .ssh / ủy quyền không?
Kevin_Kinsey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.