Làm thế nào để ngăn chặn mật khẩu để giải mã khóa riêng phải được nhập mỗi lần khi sử dụng Git Bash trên Windows?


125

Tôi có một dịch vụ xây dựng tự động tải xuống từ kho lưu trữ riêng của git. Vấn đề là khi nó cố gắng sao chép kho lưu trữ, nó cần cung cấp mật khẩu, vì nó không được ghi nhớ; Vì vậy, vì không có sự tương tác của con người, nó sẽ đợi mật khẩu mãi mãi. Làm cách nào tôi có thể buộc nó nhớ từ id_rsa.pub?

Câu trả lời:


255

Đối với người dùng Windows, chỉ cần lưu ý rằng đây là cách tôi thiết lập môi trường Git Bash để đăng nhập cho tôi một lần khi tôi khởi động nó. Tôi chỉnh sửa ~/.bashrctập tin của mình :

eval `ssh-agent`
ssh-add

Vì vậy, khi tôi bắt đầu Git Bash, nó trông giống như:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

Và bây giờ tôi có thể ssh đến các máy chủ khác mà không cần đăng nhập mỗi lần.


9
Nếu bạn không có tệp ~ / .bashrc thì chỉ cần tạo tệp văn bản mới (notepad hoặc một số trình soạn thảo khác) và thêm hai dòng starmonkey được đề cập.
pbz

7
'~' dùng để chỉ "thư mục nhà" của bạn. Trong Windows, bạn có thể tìm thấy điều này bằng cách mở shell lệnh (cmd) và gõ "echo% USERPROFILE%".
Hawkeye Parker

14
Đối với tôi cú pháp này không hoạt động. Tôi đã phải viết eval $(ssh-agent)thay thế.
đụng độ

1
Vấn đề của tôi là tôi cần chỉ định tệp cho ssh-add để sử dụng. Có lẽ bởi vì tôi có nhiều hơn một và không sử dụng tên mặc định. Ví dụssh-add ~/.ssh/myfile_rsa
Lỗi cú pháp

1
copy > ~/.bashrctrong git bash để tạo tệp bashrc trong windows, bỏ qua lỗi
Ruben

61

Câu trả lời này giải thích làm thế nào để tên người dùng và mật khẩu GitHub được lưu trữ vĩnh viễn, không phải là mật khẩu khóa SSH.

Trong Windows, chỉ cần chạy

$ git config --global credential.helper wincred

Điều này có nghĩa là lần sau bạn đẩy, bạn sẽ nhập tên người dùng và mật khẩu như bình thường, nhưng chúng sẽ được lưu trong thông tin đăng nhập Windows. Sau đó, bạn sẽ không phải nhập lại chúng.

Như trong, Đẩy vào GitHub mà không cần nhập tên người dùng và mật khẩu mỗi lần (Git Bash trên Windows) .


2
sau lệnh này, bạn cần nhập tên người dùng và mật khẩu.
Stephen Tun Aung

5
Điều này có liên quan đến các khóa SSH, hoặc chỉ xác thực HTTPS (tên người dùng và mật khẩu) không? Câu hỏi dường như là về việc sử dụng các khóa SSH.
Sean

Hoạt động hoàn hảo với tôi, tôi đoán tôi đang sử dụng xác thực HTTPS (tên người dùng và mật khẩu).
Jonatan

Chạy này sản xuất không có đầu ra ở tất cả.
dùng9993

@ user9993 Nó sẽ không. Đó là một thay đổi cấu hình, vì vậy trong khi không có đầu ra nào được thực hiện, gitsẽ thay đổi hành vi của nó theo bộ chỉ thị cấu hình.
starbeamrainbowlabs

9

Tôi không muốn phải nhập cụm mật khẩu SSH khi mở thiết bị đầu cuối mới; Thật không may , giải pháp của starmonkey yêu cầu nhập mật khẩu cho mỗi phiên. Thay vào đó, tôi có cái này trong .bash_profiletập tin của mình :

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Điều này cũng sẽ nhớ cụm mật khẩu của tôi cho các phiên cuối mới; Tôi chỉ phải gõ nó một lần khi tôi mở terminal đầu tiên sau khi khởi động.

Tôi muốn ghi nhận nơi tôi đã nhận được điều này; đó là một sửa đổi công việc của người khác, nhưng tôi không thể nhớ nó đến từ đâu. Cảm ơn tác giả ẩn danh!

Cập nhật 2019-07-01: Tôi không nghĩ tất cả điều này là cần thiết. Bây giờ tôi luôn làm việc này bằng cách đảm bảo .bash_profiletệp của tôi chạy ssh-agent:

eval $(ssh-agent)

Sau đó, tôi thiết lập một sshtập tin cấu hình như thế này:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config

Tôi vẫn nhận được yêu cầu mật khẩu của tôi mỗi lần.
Ryan

1
@Ryan hy vọng bản cập nhật tôi vừa thêm sẽ giải quyết vấn đề của bạn. Tôi luôn cập nhật thông tin trong một bài đăng trên blog tại conan.is/blo/clojure-on-windows.html và tôi đã tự đặt câu hỏi tương tự tại stackoverflow.com/questions/52423626/,
Conan

Cảm ơn, tôi sẽ kiểm tra cái này
Ryan

@Conan Giải pháp cập nhật hoạt động trên mỗi phiên bash. Sau khi tôi đóng phiên bash đang chạy và mở một phiên bản mới, tôi lại được nhắc nhập mật khẩu.
Tushar Raj

5

Nếu tôi hiểu chính xác câu hỏi, bạn đã sử dụng khóa SSH được ủy quyền trong dịch vụ xây dựng, nhưng bạn muốn tránh phải nhập cụm mật khẩu cho mỗi bản sao?

Tôi có thể nghĩ về hai cách để làm điều này:

  1. Nếu dịch vụ xây dựng của bạn đang được bắt đầu tương tác: Trước khi bạn bắt đầu dịch vụ xây dựng, hãy bắt đầu ssh-agentvới thời gian chờ đủ lâu ( -ttùy chọn). Sau đó sử dụng ssh-add(msysGit nên có những cái đó) để thêm tất cả các khóa riêng bạn cần trước khi bạn bắt đầu dịch vụ xây dựng của mình. Bạn vẫn phải gõ tất cả các cụm mật khẩu, nhưng chỉ một lần cho mỗi lần khởi chạy dịch vụ.

  2. Nếu bạn muốn tránh phải nhập các cụm mật khẩu, bạn luôn có thể xóa cụm mật khẩu khỏi các khóa SSH, như được mô tả trong /server/50775/how-do-i-change-my- private-key-cụm mật khẩu , bằng cách đặt cụm mật khẩu mới trống. Điều này sẽ loại bỏ hoàn toàn với dấu nhắc mật khẩu, nhưng nó thậm chí còn kém an toàn hơn so với tùy chọn trước đó.


Cảm ơn cho lựa chọn thứ 2, tôi cần nó.
Stanislav Verjikovskiy

1

Khi tôi cố gắng đẩy mã của mình, tôi đã gặp lỗi dưới đây:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://naushadqamar-1@bitbucket.org/xxxx/xxxx-api.git/': The requested URL returned error: 403

Sau vài giờ nghiên cứu, tôi thấy tôi cần sử dụng lệnh dưới đây:

$ git config --global credential.helper cache

Sau khi thực hiện lệnh trên, tôi nhận được lời nhắc nhập tên người dùng và mật khẩu GitHub của mình. Sau khi cung cấp thông tin xác thực chính xác, tôi có thể đẩy mã của mình.


Điều này chỉ tạo ra "git: 'cert-cache' không phải là lệnh git." Tuy nhiên, "git config --global cert.rcper store" đã hoạt động - đây có thể không phải là tốt nhất, nhưng tôi buộc phải sử dụng HTTPS thay vì SSH ưa thích của tôi và chỉ muốn nó hoạt động.
Terry Brown

0

Giải pháp đúng là:

  1. Chạy thiết bị đầu cuối mặc định của Windows - cmd và nhận thư mục của hồ sơ chính của bạn

    echo %USERPROFILE%
    
  2. Chạy Git Bash trong thư mục trên và tạo .bashrctệp bằng lệnh

    echo "" > .bashrc
    
  3. Mở .bashrctệp bằng trình soạn thảo văn bản yêu thích của bạn và dán mã từ Trợ giúp GitHub vào tệp đó:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Khởi động lại Git Bash và nó hỏi bạn mật khẩu của bạn (chỉ lần đầu tiên) và thực hiện. Không có mật khẩu làm phiền nữa.


-1

Bạn cần tạo authorized_keystệp trong .sshthư mục của người dùng mà bạn sẽ kết nối với máy chủ kho lưu trữ. Ví dụ, giả sử bạn sử dụng tên buildservicetrên repo.serverbạn có thể chạy:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Sau đó, bạn phải kiểm tra những điều sau đây:

  1. Đó id_rsalà khóa riêng tương ứng được trình bày trong builservice@build.server:~/.shh/id_rsa.

  2. Dấu vân tay đó của repo.server được lưu trong buildservice@build.server:~/.ssh/known_hoststệp. Thông thường, điều đó sẽ được thực hiện sau lần thử đầu tiên sshđể kết nối với repo.server.


Tôi quên nói. Trong Windows, thư mục chính của bạn có thể là C: \ Users \ Username
beduin

5
Mmm .. Git bash có tất cả, đọc kỹ tiêu đề của câu hỏi. Cũng từ câu hỏi tôi giả sử rằng cặp khóa đã được tạo (vì nó được hỏi làm thế nào để buộc máy chủ repo nhớ id_rsa.pub.) Xin lỗi về định dạng.
beduin

1
Ok, chưa bao giờ nghe nói về 'git bash' trước đây. Xin lỗi 'bout that
sehe

Tôi giả sử điều này là sử dụng msysgit. Tôi đang thêm thẻ.
Adam Dymitruk

3
Cảnh báo! Sử dụng cat id_rsa.pub > .ssh/authorized_keyssẽ ghi đè bất kỳ khóa ủy quyền hiện có. Sử dụng >>để thêm thay vì ghi đè.
David Pärsson
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.