Làm cách nào để cung cấp tên người dùng và mật khẩu khi chạy phiên bản git clit git@remote.git?


846

Tôi biết cách cung cấp tên người dùng và mật khẩu cho yêu cầu HTTPS như thế này:

git clone https://username:password@remote

Nhưng tôi muốn biết cách cung cấp tên người dùng và mật khẩu cho điều khiển từ xa như thế này:

git clone git@remote.git

Tôi đã thử như thế này:

git clone username:password@git@remote.git
git clone git@username:password@remote.git
git clone git@remote.git@username:password

Nhưng họ đã không làm việc.


4
Bạn không thể. "Git" trước "@" đã là tên người dùng. Bạn lấy URL kho lưu trữ từ đâu (git@remote.get)? Từ đâu bạn có ý tưởng rằng bạn phải cung cấp một tên người dùng và mật khẩu khác nhau?
Ken Thomases

3
URL repos của tôi là từ heroku "git@heroku.com: zxy-helloworld.git". Và tôi sử dụng vỏ emacs để nhân bản và đẩy. Nếu shell yêu cầu mật khẩu, emacs sẽ treo. Đây là một vấn đề đã biết với emacs trên Windows: gnu.org/software/emacs/windows/iêu
phối hợp

Nếu tên người dùng là một email thì sao? Làm thế nào để bạn gõ nó? myemail @ gmail.com @ example.com ?
Kyon Perez

Câu trả lời:


1319

Dựa trên nhận xét của Michael Scharf:

Bạn có thể bỏ mật khẩu để nó sẽ không được đăng nhập vào tệp lịch sử Bash của bạn:

git clone https://username@github.com/username/repository.git

Nó sẽ nhắc bạn nhập mật khẩu của bạn.

Ngoài ra, bạn có thể sử dụng:

git clone https://username:password@github.com/username/repository.git

Cách này làm việc cho tôi từ kho lưu trữ GitHub.


5
Nhân tiện, nó không phải giống nhau. Nếu đồng nghiệp của bạn tạo repo git và bạn đang đăng nhập như một tài khoản khác, họ sẽ không giống nhau.
holgac

49
Không nên đặt mật khẩu vào URL cho tệp này được lưu trên .git / config. Không an toàn, tốt hơn là sử dụng khóa ssh
zetanova

55
@MrDuk không có vấn đề gì, hãy thoát khỏi nó (dưới dạng% 40 iirc).
Benjamin Gruenbaum

57
Bạn có thể để lại mật khẩu : git clone https://username@github.com/username/repository.git. git sẽ hỏi bạn và nó sẽ không được lưu trong .git / config cũng như trong lịch sử bash của bạn
Michael_Scharf

37
bạn cũng có thể nhập 'dấu cách' ở đầu dòng để linux sẽ không lưu lệnh trong lịch sử
Nicolas Zozol

213

Các user@host:path/to/repođịnh dạng cho Git để sử dụng ssh để đăng nhập vào hostvới Tên truy nhập user. Từ git help clone:

Một cú pháp giống như scp thay thế cũng có thể được sử dụng với giao thức ssh:

[user@]host.xz:path/to/repo.git/

Phần trước @tên người dùng và phương thức xác thực (mật khẩu, khóa chung, v.v.) được xác định bởi ssh, không phải Git. Git không có cách nào để chuyển mật khẩu cho ssh, vì ssh thậm chí có thể không sử dụng mật khẩu tùy thuộc vào cấu hình của máy chủ từ xa.

Sử dụng ssh-agentđể tránh gõ mật khẩu mọi lúc

Nếu bạn không muốn nhập mật khẩu ssh mọi lúc, giải pháp điển hình là tạo cặp khóa chung / riêng , đặt khóa chung vào ~/.ssh/authorized_keystệp của bạn trên máy chủ từ xa và tải khóa riêng của bạn vào ssh-agent. Xem thêm Cấu hình Git thông qua SSH để đăng nhập một lần , trang trợ giúp GitHub về passphrase khoá ssh , tài liệu ssh gitolite của , và tài liệu hướng dẫn các phím ssh Heroku của .

Lựa chọn giữa nhiều tài khoản tại GitHub (hoặc Heroku hoặc ...)

Nếu bạn có nhiều tài khoản tại một nơi như GitHub hoặc Heroku, bạn sẽ có nhiều khóa ssh (ít nhất một tài khoản cho mỗi tài khoản). Để chọn tài khoản bạn muốn đăng nhập, bạn phải cho ssh biết khóa riêng nào sẽ sử dụng .

Ví dụ: giả sử bạn có hai tài khoản GitHub: foobar. Khóa ssh của bạn foo~/.ssh/foo_github_idvà khóa ssh của bạn bar~/.ssh/bar_github_id. Bạn muốn truy cập git@github.com:foo/foo.gitbằng footài khoản của bạn và git@github.com:bar/bar.gitvới bartài khoản của bạn . Bạn sẽ thêm những điều sau vào ~/.ssh/config:

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

Sau đó, bạn sẽ sao chép hai kho lưu trữ như sau:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar

Tránh ssh hoàn toàn

Một số dịch vụ cung cấp quyền truy cập HTTP thay thế cho ssh:

  • GitHub:

    https://username:password@github.com/username/repository.git
    
  • Gitorious:

    https://username:password@gitorious.org/project/repository.git
    
  • Heroku: Xem bài viết hỗ trợ này .

CẢNH BÁO : Thêm mật khẩu của bạn vào URL bản sao sẽ khiến Git lưu trữ mật khẩu văn bản gốc của bạn .git/config. Để lưu trữ an toàn mật khẩu của bạn khi sử dụng HTTP, hãy sử dụng trình trợ giúp thông tin xác thực. Ví dụ:

git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git

Ở trên sẽ khiến Git yêu cầu mật khẩu của bạn cứ sau 15 phút (theo mặc định). Xem git help credentialsđể biết chi tiết.


Đây là lời giải thích tốt nhất về cách git hoạt động với SSH. Tôi hiểu rằng khi bạn chỉ định git@githost.com: path / to / repo.git, nó sẽ cho git biết rằng người dùng tự git và nó sẽ lấy thông tin đăng nhập của bạn (khóa công khai) từ ssh-agent cho Lưu trữ "githost.com".
Anael

39

Trong các bình luận về câu trả lời của @ Bassetassen , @plosco đã đề cập rằng bạn git clone https://<token>@github.com/username/repository.gitít nhất có thể sử dụng để sao chép từ GitHub. Tôi nghĩ rằng tôi sẽ mở rộng về cách làm điều đó, trong trường hợp bất kỳ ai gặp phải câu trả lời này giống như tôi đã làm trong khi cố gắng tự động hóa một số nhân bản.

GitHub có một hướng dẫn rất hữu ích về cách thực hiện việc này, nhưng nó không bao gồm những việc cần làm nếu bạn muốn đưa tất cả vào một dòng cho mục đích tự động hóa. Nó cảnh báo rằng việc thêm mã thông báo vào URL bản sao sẽ lưu trữ nó trong văn bản gốc .git/config . Đây rõ ràng là một rủi ro bảo mật cho hầu hết mọi trường hợp sử dụng, nhưng vì tôi có kế hoạch xóa repo và thu hồi mã thông báo khi tôi hoàn thành, tôi không quan tâm.

1. Tạo mã thông báo

GitHub có toàn bộ hướng dẫn ở đây về cách nhận mã thông báo, nhưng đây là TL; DR.

  1. Đi đến Cài đặt> Cài đặt dành cho nhà phát triển> Mã truy cập cá nhân ( đây là liên kết trực tiếp )
  2. Nhấp vào "Tạo mã thông báo mới" và nhập lại mật khẩu của bạn. (đây là một liên kết trực tiếp khác )
  3. Đặt mô tả / tên cho nó, kiểm tra quyền "repo" và nhấn nút "Tạo mã thông báo" ở cuối trang.
  4. Sao chép mã thông báo mới của bạn trước khi bạn rời khỏi trang

2. Nhân bản Repo

Giống như @plosco lệnh cho, git clone https://<token>@github.com/<username>/<repository>.git, chỉ cần thay thế <token>, <username><repository> với bất cứ thông tin của bạn.

Nếu bạn muốn sao chép nó vào một thư mục cụ thể, chỉ cần chèn địa chỉ thư mục ở phần cuối như vậy: git clone https://<token>@github.com/<username>/<repository.git> <folder>, nơi <folder>là, bạn đoán nó, thư mục clone nó! Bạn dĩ nhiên có thể sử dụng ., ..,~ , vv ở đây như bạn có thể ở nơi khác.

3. Không để lại dấu vết

Không phải tất cả những điều này có thể là cần thiết, tùy thuộc vào mức độ nhạy cảm của những gì bạn đang làm.

  • Bạn có thể không muốn để lại mã thông báo đó nếu bạn không có ý định sử dụng nó trong một thời gian, vì vậy hãy quay lại trang mã thông báo và nhấn nút xóa bên cạnh.
  • Nếu bạn không cần repo lần nữa, hãy xóa nó rm -rf <folder>.
  • Nếu cần repo lần nữa, nhưng không cần tự động hóa lại, bạn có thể xóa điều khiển từ xa bằng cách thực hiện git remote remove originhoặc chỉ xóa mã thông báo bằng cách chạy git remote set-url origin https://github.com/<username>/<repository.git>.
  • Xóa lịch sử bash của bạn để đảm bảo mã thông báo không được đăng nhập ở đó. Có nhiều cách để làm điều này, xem câu hỏi nàycâu hỏi này . Tuy nhiên, có thể dễ dàng hơn khi chỉ cần thêm vào tất cả các lệnh trên với một khoảng trắng để ngăn chặn chúng được lưu trữ để bắt đầu.

Lưu ý rằng tôi không chuyên nghiệp, vì vậy những điều trên có thể không an toàn theo nghĩa là không còn dấu vết nào cho bất kỳ loại công việc pháp y nào.


1
https://<token>@github.comkhông được chấp nhận với cổng thông tin của tôi, tôi đã phải sử dụnghttps://oauth2:<token>@github.com
MushyPeas

25

Mặc dù có nhiều câu trả lời, bản thân tôi phải đối mặt với vấn đề lặp đi lặp lại khi tên người dùng hoặc mật khẩu có các ký tự đặc biệt trong đó.

URL mã hóa tên người dùng và mật khẩu của bạn cho git, sau đó sử dụng nó như một phần của chính URL (khi không có vấn đề bảo mật).

Nói, giá trị được mã hóa URL của tên người dùng

'người dùng + 1' là người dùng% 2B1

và URL được mã hóa giá trị của mật khẩu

'Chào mừng @ 1234' là Chào mừng% 401234

Sau đó, URL bản sao GIT của bạn sẽ trông như thế nào,

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo hoạt động hoàn hảo, trong khi,

git clone https: // user + 1: Chào mừng @ 1234 @ fact-git-url-for-the-repo cung cấp cho bạn 403 lỗi

Hi vọng điêu nay co ich.

Chỉ trong trường hợp, muốn mã hóa URL trực tuyến: https://www.urlencoder.org/


13

Tôi đã giải quyết vấn đề này theo cách sau:

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


11
không bao giờ là một ý tưởng tốt để nhập mật khẩu của bạn trong dòng lệnh. Bạn có biết hệ thống của bạn có thể lưu trữ lịch sử dòng lệnh trong một tệp không? (Ví dụ: Linux có một tệp ẩn có tên .bash_history)
augusto

Chính xác. Bất cứ khi nào tôi làm điều này, hoặc một cái gì đó như thế này, đôi khi có thể rất thuận tiện, tôi luôn xóa lệnh tôi đã sử dụng khỏi lịch sử (history -d).
Francesco Marchetti-Stasi

4
@ FrancescoMarchetti-Stasi bạn không cần phải xóa lệnh, chỉ cần sử dụng khoảng trắng ở đầu lệnh và nó sẽ không bao giờ được lưu trong lịch sử.
Ishtiyaq Husain

Có - tôi đã học được nó chỉ một vài tháng trước, sau gần 30 năm trên các hệ thống Unix ... xấu hổ với tôi :)
Francesco Marchetti-Stasi

9

Trên Windows , các bước sau sẽ kích hoạt lại cửa sổ đăng nhập GitHub khi git cloneing:

  • Tìm kiếm menu bắt đầu cho "Trình quản lý xác thực"
  • Chọn "Thông tin Windows"
  • Xóa mọi thông tin liên quan đến Git hoặc GitHub

kết quả



5
git config --global core.askpass

Chạy cái này trước khi nhân bản theo cách tương tự, nên được sửa!


3
Đã thử nó, vẫn không yêu cầu nó.
Maarten Kieft

Thiết lập cấu hình toàn cầu không bao giờ là một ý tưởng tốt vì nó có thể gây rối cho các bản sao khác.
Martin

1

Đây là một câu hỏi Stack Overflow tuyệt vời và các câu trả lời rất mang tính hướng dẫn, để tôi có thể giải quyết một vấn đề gây phiền nhiễu mà tôi gặp phải gần đây.

Tổ chức mà tôi làm việc sử dụng Atlassian's BitBucketsản phẩm (không phải Github), về cơ bản là phiên bản GitHub của họ để các kho lưu trữ có thể được bảo mật hoàn toàn trên tiền đề. Tôi đã gặp phải một vấn đề tương tự như @coordine, trong đó mật khẩu của tôi được yêu cầu cho một kho lưu trữ mới mà tôi đã kiểm tra. Thông tin đăng nhập của tôi đã được lưu trên toàn cầu cho tất cả các BitBucketdự án, vì vậy tôi không chắc điều gì đã khiến mất thông tin đăng nhập.

Nói tóm lại, tôi đã có thể nhập lệnh GIT sau ( chỉ cung cấp tên người dùng của mình), sau đó nhắc Trình quản lý xác thực của Git nhắc tôi nhập mật khẩu, sau đó tôi có thể lưu.

git clone https://user@code.domain.org/git/[organization]/[team]/[repository.git]

LƯU Ý: các đường dẫn phụ của thư mục được đặt trong ngoặc đơn giản chỉ cần tham khảo các tham chiếu bên trong và sẽ thay đổi cho bạn!


0

Nếu bạn đang sử dụng http/httpsvà đang tìm cách HOÀN TOÀN TỰ ĐỘNG quá trình mà không yêu cầu bất kỳ đầu vào người dùng hoặc bất kỳ lời nhắc nào của người dùng (ví dụ: bên trong đường ống CI / CD), bạn có thể sử dụng cách tiếp cận sau đây tận dụnggit credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used

git config --global credential.helper "store --file ${GIT_CREDS_PATH}"
echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

nơi bạn có thể chọn để đặt ALICE_GITHUB_PASSWORD biến môi trường từ lệnh shell trước hoặc từ cấu hình đường ống, v.v.

Hãy nhớ rằng "lưu trữ" dựa trên git-cert-helper lưu trữ mật khẩu & giá trị trong văn bản thuần túy. Vì vậy, hãy đảm bảo mã thông báo / mật khẩu của bạn có quyền rất hạn chế.


Bây giờ chỉ cần sử dụng https: //alice@github.com/my_Vpo.git bất cứ nơi nào hệ thống tự động của bạn cần tìm nạp repo - nó sẽ sử dụng thông tin đăng nhập alicetrong github.comkhi lưu trữ bởi trình trợ giúp git-chứng chỉ.

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.