Làm cách nào để tránh thông số kỹ thuật của tên người dùng và mật khẩu tại mỗi lần đẩy git?


317

Tôi git pushlàm việc với một kho lưu trữ Git từ xa.

Mỗi thứ pushsẽ nhắc tôi nhập liệu usernamepassword. Tôi muốn tránh nó cho mỗi lần đẩy, nhưng làm thế nào để cấu hình để tránh nó?


6
Một câu trả lời có sẵn ở đây: stackoverflow.com/questions/6565357/ từ
kbdj Racer

3
Câu chuyện dài: Đối với github, chỉ cần theo hai liên kết này help.github.com/articles/generating-ssh-keys help.github.com/articles/changing-a-remote-s-url
JRun

đối với bitbucket, vui lòng theo liên kết này
JDP

Câu trả lời:


346

1. Tạo khóa SSH

Linux / Mac

Mở terminal để tạo khóa ssh:

cd ~                 #Your home directory
ssh-keygen -t rsa    #Press enter for all values

Cho cửa sổ

(Chỉ hoạt động nếu chương trình cam kết có khả năng sử dụng chứng chỉ / khóa ssh riêng & công khai)

  1. Sử dụng Putty Gen để tạo khóa
  2. Xuất khóa dưới dạng khóa SSH đang mở

Dưới đây là hướng dẫn về gen putty cho các bước trên

2. Liên kết khóa SSH với kho lưu trữ từ xa

Bước này thay đổi, tùy thuộc vào cách thiết lập điều khiển từ xa của bạn.

  • Nếu đó là kho lưu trữ GitHub và bạn có quyền quản trị, hãy đi tới cài đặt và nhấp vào 'thêm khóa SSH'. Sao chép nội dung của bạn ~/.ssh/id_rsa.pubvào trường có nhãn 'Khóa'.

  • Nếu kho lưu trữ của bạn được quản lý bởi người khác, hãy cung cấp cho quản trị viên của bạn id_rsa.pub.

  • Nếu kho lưu trữ từ xa của bạn được quản lý bởi bạn, bạn có thể sử dụng lệnh này chẳng hạn:

    scp ~/.ssh/id_rsa.pub YOUR_USER@YOUR_IP:~/.ssh/authorized_keys/id_rsa.pub

3. Đặt URL từ xa của bạn thành một biểu mẫu hỗ trợ SSH 1

Nếu bạn đã thực hiện các bước trên và vẫn nhận được lời nhắc mật khẩu, hãy đảm bảo URL repo của bạn ở dạng

git+ssh://git@github.com/username/reponame.git

như trái ngược với

https://github.com/username/reponame.git

Để xem URL repo của bạn, hãy chạy:

git remote show origin

Bạn có thể thay đổi URL bằng:

git remote set-url origin git+ssh://git@github.com/username/reponame.git

[1] Phần này kết hợp câu trả lời từ Eric P


3
Tôi đã chạy bước 1 và bước 2 trên Ubuntu nhưng nó vẫn hỏi tôi về u_id passwd. Tôi cũng đã chạy: ssh -T git@github.com. Vẫn giống nhau. Phải làm sao?
Radhika

4
@Rads Bạn đã thử câu trả lời khác, bởi Eric P ?
yo '

2
@dialex Ông có nghĩa là một người quản trị kho git từ xa.
selalerer

5
git nguồn gốc set-url từ xa git + ssh: //git@github.com/username/reponame.git lệnh này hữu ích với tôi.
Nhân tạo thông minh

2
Điều này làm việc cho tôigit remote set-url origin git@github.com:/username/projectname.git
Kurt

181

Xác thực vĩnh viễn với kho Git,

Chạy lệnh sau để kích hoạt bộ đệm ẩn thông tin xác thực.

$ git config credential.helper store
$ git push https://github.com/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

Sử dụng cũng nên chỉ định bộ nhớ đệm hết hạn ,

git config --global credential.helper 'cache --timeout 7200'

Sau khi kích hoạt bộ đệm thông tin xác thực, nó sẽ được lưu trong 7200 giây (2 giờ) .

Lưu ý: Trình trợ giúp xác thực lưu trữ mật khẩu không được mã hóa trên đĩa cục bộ.


4
Cảm ơn. Bạn có thể giải thích lệnh config làm gì không? Tôi tự hỏi tại sao nó thậm chí không yêu cầu tôi nhập mật khẩu ngay lần đầu tiên tôi chuyển sang repo.
HelloWorldNoMore

1
@vivoconunxino Có lẽ vì nó vốn không an toàn. Từ gittrang hướng dẫn: "Sử dụng trình trợ giúp này sẽ lưu trữ mật khẩu của bạn không được mã hóa trên đĩa, chỉ được bảo vệ bởi các quyền của hệ thống tệp."
cmaster - phục hồi monica

15
Câu trả lời này thiếu một cảnh báo về người storetrợ giúp thông tin lưu trữ mật khẩu trên đĩa không được mã hóa.
cmaster - phục hồi monica

1
@DavidRTribble: đặt nó vào bộ đệm? Hoặc xóa tệp có liên quan, xem git-scm.com/docs/git-credential-store
serv-inc

1
@DavidRTribble: tốt hơn:git config --unset credential.helper
serv-inc

116

Nếu bạn đã thiết lập các khóa SSH và vẫn nhận được lời nhắc mật khẩu, hãy đảm bảo URL repo của bạn ở dạng

git+ssh://git@github.com/username/reponame.git

như trái ngược với

https://github.com/username/reponame.git

Để xem URL repo của bạn, hãy chạy:

git remote show origin

Bạn có thể thay đổi URL bằng git remote set-urlnhư vậy:

git remote set-url origin git+ssh://git@github.com/username/reponame.git

Đây là những gì đã khắc phục vấn đề của tôi sau khi tôi đã sử dụng git initcục bộ, sau đó cố gắng đẩy sau khi thêm điều khiển từ một repo mới trên trang web GitHub.
sheldonkreger

1
Không chắc chắn tại sao đây không phải là một phần của câu trả lời được chấp nhận. Cảm ơn!
bộ

1
Câu trả lời được chấp nhận nên bao gồm câu trả lời được chấp nhận thực tế PLUS cái này.
Puce

3
Bạn có thể bỏ qua "git + ssh: //" và chỉ cần sử dụnggit@github.com/username/reponame.git
Ivan Shulev

1
@IvanShulev Tôi đã thử ban đầu mà không có git + ssh và không hoạt động
Antonello

40

Chỉ cần sử dụng --repotùy chọn cho lệnh git đẩy. Như thế này:

$ git push --repo https://name:password@bitbucket.org/name/repo.git

37
Hoặc bạn có thể đặt cài đặt này theo mặc định vớigit remote set-url origin https://name:password@github.com/repo.git
ACyclic

Tôi lưu ý rằng việc đặt URL cũng chỉ name@github.com/....githoạt động nếu bạn không bị cằn nhằn về mật khẩu mỗi lần.
timday

Đối với người dùng github, git push --repo https://github.com/Username/repo Nó hoạt động mà không cần .git tiện ích mở rộng
Pe Dro

24

Tiết kiệm vô thời hạn

Bạn có thể sử dụng git-cert-store thông qua

git config credential.helper store

nơi lưu trữ mật khẩu của bạn không được mã hóa trong hệ thống tệp :

Sử dụng trình trợ giúp này sẽ lưu trữ mật khẩu của bạn không được mã hóa trên đĩa, chỉ được bảo vệ bởi các quyền của hệ thống tệp. Nếu đây không phải là một sự đánh đổi bảo mật có thể chấp nhận được, hãy thử git-cert-cache hoặc tìm một trình trợ giúp tích hợp với bộ nhớ an toàn do hệ điều hành của bạn cung cấp.

Với thời gian chờ

Sử dụng bộ đệm git-cert-cache theo mặc định sẽ lưu mật khẩu trong 15 phút.

git config credential.helper cache

để đặt thời gian chờ khác, hãy sử dụng --timeout(ở đây 5 phút)

git config credential.helper 'cache --timeout=300'

Lưu an toàn vô thời hạn (OS X và Windows)

  • Nếu bạn đang sử dụng máy Mac, Git đi kèm với chế độ của osxkeychain , có thể lưu thông tin đăng nhập vào móc khóa an toàn được đính kèm với tài khoản hệ thống của bạn. Phương pháp này lưu trữ thông tin đăng nhập trên đĩa và chúng không bao giờ hết hạn, nhưng chúng được mã hóa với cùng một hệ thống lưu trữ chứng chỉ HTTPS và tự động điền Safari. Chạy phần sau trên dòng lệnh sẽ kích hoạt tính năng này : git config --global credential.helper osxkeychain. Bạn cũng cần lưu trữ thông tin đăng nhập trong Keychain bằng ứng dụng Keychain.
  • Nếu bạn đang sử dụng Windows, bạn có thể cài đặt một trình trợ giúp có tên là Trình quản lý thông tin xác thực dành cho Windows. Điều này tương tự với trình trợ giúp của osxkeychain, được mô tả ở trên, nhưng sử dụng Cửa hàng Thông tin Windows để kiểm soát thông tin nhạy cảm. Nó có thể được tìm thấy tại https://github.com/Microsoft/Git-Credential-Manager-for-Windows . [nhấn mạnh của tôi]

Đối với Windows credential.helper cacheKHÔNG hoạt động. Nó phải git config --global credential.helper wincred.
Paulo Merson

1
Điều này hữu ích khi bạn buộc phải sử dụng https. Git của tôi trên máy chủ bị treo nếu tôi sử dụng ssh, vì vậy tôi không có tùy chọn khóa SSH.
Sridhar Sarnobat

8

Tôi đã sử dụng liên kết https ( https://github.com/org/repo.git) thay vì liên kết ssh;

git@github.com:org/repo.git  

Chuyển đổi giải quyết vấn đề cho tôi!


6

Bước 1 -

Tạo khóa SSH trên hệ thống linux của bạn bằng lệnh bên dưới

ssh-keygen -t rsa -b 4096 -C "your_email"

Nó sẽ yêu cầu mật khẩu và tên tệp (mặc định sẽ là ~ / .ssh / id_rsa, ~ / .ssh / id_rsa.pub)

Bước 2 -

Khi các tệp được tạo, thêm khóa công khai id_rsa.pub vào phần ssh tài khoản github.

Bước 3 -

Trên máy của bạn, thêm khóa riêng id_rsa vào ssh-agent bằng lệnh bên dưới

ssh-add ~/.ssh/id_rsa 

Bước 4 -

Bây giờ hãy thêm url từ xa git@github.com: user_name / repo_name.git vào repo git cục bộ của bạn bằng cách sử dụng lệnh bên dưới.

git remote remove origin
git remote add origin git@github.com:user_name/repo_name.git

Đó là nó.



5

Trên hệ điều hành Windows sử dụng cái này thay vào đó, cái này hoạt động với tôi:

https://{Username}:{Password}@github.com/{Username}/{repo}.git

ví dụ

git clone https://{Username}:{Password}@github.com/{Username}/{repo}.git

git pull https://{Username}:{Password}@github.com/{Username}/{repo}.git

git remote add origin https://{Username}:{Password}@github.com/{Username}/{repo}.git

git push origin master

5

Chỉ muốn chỉ ra điều gì đó về giải pháp đã nói ở trên nhiều lần:

git config credential.helper store

Bạn có thể sử dụng bất kỳ lệnh nào yêu cầu mật khẩu sau này. Bạn không cần phải đẩy. (bạn cũng có thể lấy ví dụ) Sau đó, bạn sẽ không cần phải nhập lại tên người dùng / mật khẩu của mình.


3

Tôi đã sử dụng câu trả lời mà Pavel gợi ý và nó hiệu quả với tôi. Sự khác biệt của tôi là làm điều đó trong khi tôi thêm điều khiển từ xa như vậy:git remote add (alias) https://(name:password)@github.com/(the remote address).git


3

Chạy lệnh dưới đây đã giải quyết vấn đề cho tôi.

git config --global credential.helper wincred

Vui lòng tham khảo tài liệu github dưới đây:

https://help.github.com/articles/caching-your-github-password-in-git/

3

Theo tôi biết, chỉ có hai cách an toàn : ssh hoặc passwd được mã hóa bằng cách sử dụng kho khóa .

SSH

  1. Đăng nhập vào github của bạn;
  2. Truy cập: https://github.com/sinstall/keys ;
  3. Khóa SSH mới;
  4. cat ~/.ssh/id_rsa.pub, dán nó ở đó, đặt tên và lưu nó (nếu bạn không có tệp đó, hãy tự tạo một tệp cho riêng mình ssh-keygen -t rsa- chỉ cần Enter cho tất cả các lời nhắc);
  5. Chuyển đến kho lưu trữ cục bộ của bạn và cập nhật từ xa bằng cách git remote set-url origin git+ssh://git@github.com/username/reponame.git- bạn có thể kiểm tra trước bằng cách git remote -v);
  6. Ở đây bạn đi, chỉ touch t; git add t; git commit -m "test"; git pushvà xác nhận có để tận hưởng thế giới không có mật khẩu .

passwd ENCRYPTED bằng cách sử dụng kho khóa

Nếu bạn chỉ sử dụng git config --global credential.helper storenhư những người khác đã đề cập, mật khẩu không được mã hóa của bạn sẽ chỉ được lưu trữ trong một văn bản đơn giản ~/.git-credentialsmà không an toàn như âm thanh.

Cố gắng mã hóa nó thành

sudo apt-get install libgnome-keyring-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

git config --global credential.helper store

Trong trường hợp này, bạn đang sử dụng https://git@github.com/username/reponame.git.


2

Giải pháp của tôi trên Windows:

  1. Nhấp chuột phải vào thư mục để đẩy và chọn "Git Bash Here".
  2. ssh-keygen -t rsa (Nhấn enter cho tất cả các giá trị)
  3. Kiểm tra thiết bị đầu cuối cho: Your public key has been saved in /c/Users/<your_user_name_here>/.ssh/id_rsa.pub
  4. Sao chép khóa công khai từ tệp được chỉ định.
  5. Chuyển đến hồ sơ GitHub của bạn => Cài đặt => Khóa SSH và GPG => Khóa SSH mới => Dán khóa SSH của bạn ở đó => Lưu

2

Nếu PC của bạn an toàn hoặc bạn không quan tâm đến bảo mật mật khẩu, điều này có thể đạt được rất đơn giản. Giả sử rằng kho lưu trữ từ xa nằm trên GitHub và originlà tên cục bộ của bạn cho kho lưu trữ từ xa, hãy sử dụng lệnh này

git remote set-url --push origin https://<username>:<password>@github.com/<repo>

Các --pushcờ đảm bảo điều này thay đổi URL của kho lưu trữ cho các git pushchỉ lệnh. (Câu hỏi đặt ra yêu cầu trong các bài bản gốc là về git pushlệnh mà thôi. Yêu cầu a username password + chỉ cho các hoạt động đẩy được thiết lập bình thường đối với công kho trên Lưu ý rằng GitHub. Tin kho trên GitHub cũng sẽ yêu cầu tên người dùng + mật khẩu cho kéo và lấy hoạt động , vì vậy đối với một kho lưu trữ riêng tư, bạn sẽ không muốn sử dụng --push flag...)

CẢNH BÁO: Điều này vốn không an toàn vì:

  1. ISP của bạn hoặc bất kỳ ai đăng nhập vào mạng của bạn đều có thể dễ dàng nhìn thấy mật khẩu bằng văn bản thuần túy trong URL;

  2. Bất cứ ai có quyền truy cập vào PC của bạn đều có thể xem mật khẩu của bạn bằng cách sử dụng git remote show origin.

Đó là lý do tại sao sử dụng khóa SSH là câu trả lời được chấp nhận.

Ngay cả khóa SSH cũng không hoàn toàn an toàn . Ví dụ, bất kỳ ai có quyền truy cập vào PC của bạn vẫn có thể thực hiện các cú đẩy làm hỏng kho lưu trữ của bạn hoặc - tệ hơn - đẩy các cam kết thực hiện các thay đổi tinh vi đối với mã của bạn. (Tất cả các cam kết được đẩy rõ ràng rất rõ ràng trên GitHub. Nhưng nếu ai đó muốn thay đổi mã của bạn một cách lén lút, họ có thể --amendthực hiện một cam kết trước đó mà không thay đổi thông báo cam kết, sau đó buộc đẩy nó. Điều đó sẽ lén lút và khá khó để nhận thấy trong thực tế. )

Nhưng tiết lộ mật khẩu của bạn là tồi tệ hơn . Nếu kẻ tấn công có được kiến ​​thức về tên người dùng + mật khẩu của bạn, họ có thể làm những việc như khóa bạn khỏi tài khoản của chính bạn, xóa tài khoản của bạn, xóa vĩnh viễn kho lưu trữ, v.v.


Ngoài ra - để đơn giản bảo mật - bạn chỉ có thể cung cấp tên người dùng của mình trong URL, do đó bạn sẽ phải nhập mật khẩu mỗi lần git pushnhưng bạn sẽ không phải cung cấp tên người dùng của mình mỗi lần. (Tôi khá thích cách tiếp cận này, việc phải nhập mật khẩu sẽ khiến tôi tạm dừng để suy nghĩ mỗi lần tôi git push, vì vậy tôi không thể git pushvô tình.)

git remote set-url --push origin https://<username>@github.com/<repo>

Điều gì xảy ra nếu mật khẩu có @, nó đang phá vỡ mật khẩu suy nghĩ sau khi @ là một phần của máy chủ git?
Pranav Singh

Nếu mật khẩu của bạn chứa '@' bạn tự mình ở đây, xin lỗi. Bạn có thể thay đổi mật khẩu của bạn?
radfast

Cần tăng yêu cầu thay đổi mật khẩu vì tôi đang thực hiện tự động hóa cho Tích hợp liên tục có tài khoản dịch vụ (không phải cá nhân). Hiện tại đã sử dụng Khóa SSH để đăng nhập an toàn
Pranav Singh

1

Tất cả điều này phát sinh bởi vì git không cung cấp tùy chọn trong các lệnh sao chép / kéo / đẩy / tìm nạp để gửi thông tin đăng nhập thông qua một đường ống. Mặc dù nó cung cấp thông tin xác thực, nhưng nó lưu trữ trên hệ thống tệp hoặc tạo daemon, v.v. Thông thường, thông tin đăng nhập của GIT là cấp độ hệ thống và trách nhiệm để giữ an toàn cho chúng là trên ứng dụng gọi lệnh git. Thực sự rất không an toàn.

Đây là những gì tôi đã phải làm việc xung quanh. 1. Phiên bản Git (git --version) phải lớn hơn hoặc bằng 1.8.3.

ĐÁNH GIÁ

Để nhân bản, hãy sử dụng "git clone URL" sau khi thay đổi URL từ định dạng, http: // {myuser} @ {my numpo_ip_address} / {myrepo_name.git} thành http: // {myuser}: {mypwd} @ {my numpo_ip_add / nbmyrepo_name.git}

Sau đó thanh lọc kho lưu trữ mật khẩu như trong phần tiếp theo.

MUA

Bây giờ, điều này sẽ đi và

  1. viết mật khẩu trong nguồn gốc từ xa git. Nhập "git remote -v" để xem thiệt hại. Sửa lỗi này bằng cách đặt URL gốc từ xa mà không cần mật khẩu. "git từ xa set_url nguồn gốc http: // {myuser} @ {my numpo_ip_address} / {myrepo_name.git}"
  2. đã viết mật khẩu bằng .git / log trong kho lưu trữ. Thay thế tất cả các phiên bản của pwd bằng lệnh unix như find .git / log -exec sed -i 's / {my_url_with_pwd} // g' {} \; Ở đây, {my_url_with_pwd} là URL có mật khẩu. Vì URL có dấu gạch chéo về phía trước, nên nó cần được thoát bằng hai dấu gạch chéo ngược. Ví dụ: đối với URL http: // kris: passs123@192.168.0.1/proj.git -> http: \\ / \\ / kris: passs123@192.168.0.1 \\ / proj.git

Nếu ứng dụng của bạn đang sử dụng Java để ban hành các lệnh này, hãy sử dụng ProcessBuilder thay vì Runtime. Nếu bạn phải sử dụng Runtime, hãy sử dụng getRunTime (). Exec, lấy mảng String làm đối số với / bin / bash và -c làm đối số thay vì đối số lấy một Chuỗi làm đối số.

GIT FETCH / PULL / PUSH

  1. đặt mật khẩu trong url git từ xa là: "git remote set_url origin http: // {myuser}: {mypwd} @ {my numpo_ip_address} / {myrepo_name.git}"
  2. Ban hành lệnh git fetch / đẩy / kéo. Sau đó, bạn sẽ không được nhắc nhập mật khẩu.
  3. Làm purging như trong phần trước. Đừng bỏ lỡ.

0

Bạn phải thiết lập khóa riêng SSH, bạn có thể xem lại trang này , cách thực hiện thiết lập trên Mac, nếu bạn ở trên linux thì hướng dẫn sẽ gần giống nhau, trên Windows bạn sẽ cần công cụ như MSYS .


0

Xuất hiện rằng, ít nhất là khi sử dụng TortoiseGIT trên Windows, có thể tạo các khóa SSH và chuyển chúng sang máy chủ GIT chỉ bằng cách sử dụng:

> ssh-keygen.exe
> ssh-copy-id [username]@[GIT_server]
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.