Cách cung cấp tên người dùng / mật khẩu cho git clone trong tập lệnh, nhưng không lưu thông tin đăng nhập trong .git / config


31

Tôi đang nhân bản một kho lưu trữ git trong một kịch bản như thế này:

git clone https://user:password@host.com/name/.git

Điều này hoạt động, nhưng tên người dùng và mật khẩu của tôi! hiện được lưu trữ trong url gốc trong .git/config.

Làm thế nào tôi có thể ngăn chặn điều này, nhưng vẫn làm điều này trong một tập lệnh (để không nhập mật khẩu thủ công)?


Bạn có thể có thể cập nhật nguồn gốc sau đó:git remote set-url origin https://host.com/name/.git
ceejayoz

@ceejayoz Vâng, điều đó có thể. Cảm ơn ý tưởng. Tôi vẫn đang hy vọng cho một giải pháp, điều đó thậm chí không lưu trữ tạm thời các thông tin đăng nhập.
Nathan

4
Chắc chắn - sử dụng auth dựa trên SSH với một khóa.
ceejayoz

2
Có lý do gì bạn sử dụng https thay vì SSH không? SSH hỗ trợ các khóa.
mzhaase

Tôi hiểu câu hỏi, nhưng tại sao bạn vẫn ổn với mật khẩu được lưu trữ bên trong tập lệnh? Điều đó cũng tệ không kém.
Martijn Courteaux

Câu trả lời:


20

Phương pháp mà tôi sử dụng là thực sự sử dụng git pullthay vì nhân bản. Kịch bản sẽ như sau:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:password@github.com/name/repo.git master

Điều này sẽ không lưu tên người dùng hoặc mật khẩu của bạn trong .git/config. Tuy nhiên, trừ khi các bước khác được thực hiện, tên người dùng và mật khẩu văn bản gốc sẽ hiển thị trong khi quy trình đang chạy từ các lệnh hiển thị các quy trình hiện tại (ví dụ ps).

Một đề nghị nữa tôi sẽ đưa ra (nếu bạn không thể sử dụng ssh) là thực sự sử dụng mã thông báo OAuth thay vì tên người dùng / mật khẩu rõ ràng vì nó an toàn hơn một chút. Bạn có thể tạo mã thông báo OAuth từ cài đặt hồ sơ của mình: https://github.com/sinstall/tokens .

Sau đó, sử dụng mã thông báo đó, lệnh pull sẽ là

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master

Vô tình tôi không thể sử dụng mã thông báo auth. Tôi không sử dụng github mà là một máy chủ riêng.
Nathan

3
Cũng cần lưu ý rằng tên người dùng và mật khẩu sẽ hiển thị trong, ví dụ, pstrong khi thao tác kéo chạy (ít nhất là trừ khi bạn ngăn người dùng nhìn thấy các quy trình của nhau)
derobert

Điểm cho việc sử dụng lời thề. Đó chính xác là những gì tôi cần trong sản xuất / dàn / dev.
RobotHumans

Một triệu nhờ bạn thân. lãng phí giờ n giờ n cuối cùng câu trả lời của bạn đã được bán lại. : thumbsup
JasdeepSingh

17

IMO giải pháp tốt nhất là sử dụng một trình GIT_ASKPASStrợ giúp tùy chỉnh và cung cấp mật khẩu dưới dạng một biến môi trường khác. Vì vậy, ví dụ, tạo một tệp git-askpass-helper.shnhư:

#!/bin/sh
exec echo "$GIT_PASSWORD"

và sau đó chạy git clone https://username@hostname/repovới các biến môi trường GIT_ASKPASS=/path/to/git-askpass-helper.shGIT_PASSWORD=nuclearlaunchcodes.

Điều này có lợi thế là mật khẩu sẽ không hiển thị trong danh sách quá trình.


+1 cho giải pháp sáng tạo. Điều này sẽ an toàn hơn một chút so với git pullgiải pháp và cho phép bạn lưu trữ mật khẩu văn bản gốc như một bí mật trong công cụ triển khai tự động mà bạn chọn.
FGreg

13

Bạn có thể nhập tín dụng kết nối của bạn trong ~/.netrctập tin của bạn . Một cái gì đó dọc theo dòng:

machine host.example.net
login bart
password eatmyshorts

Chỉ cần đảm bảo chmod tệp đó thành 600. Nếu bạn đang sử dụng windows, liên kết sau có thể hữu ích: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Cá nhân, tôi có xu hướng sử dụng các khóa SSH cho mục đích xác thực (tất nhiên nếu bạn được phép).


Chà, điều này sẽ để lại mật khẩu của tôi bên trong ~ / .netrc. Tôi cũng không muốn điều đó.
Nathan

2

Sau khi xem qua hàng tá bài viết SO, blog, v.v., tôi đã thử mọi phương pháp, và đây là những gì tôi nghĩ ra. Nó bao gồm MỌI THỨ.

Xem Thông tin xác thực Git & Gói riêng

Đây là tất cả các cách và công cụ để bạn có thể xác thực git một cách an toàn để sao chép kho lưu trữ mà không cần dấu nhắc mật khẩu tương tác .

  • Khóa công khai SSH
    • SSH_ASKPASS
  • Mã thông báo truy cập API
    • GIT_ASKPASS
    • .gitconfig thay thế
    • .gitconfig [thông tin xác thực]
    • .git-thông tin đăng nhập
    • .netrc
  • Phần thưởng: Hoạt động với các gói riêng
    • nút / npm gói.json
    • python / pip / trứng request.txt
    • đá quý ruby
    • golang go.mod

Tùy chọn tốt nhất để không lưu trữ bản rõ

Từ những gì được hỏi ở đây, hoặc Khóa SSH GIT_ASKPASS, hoặc git credential storesử dụng trình quản lý Keychain của hệ điều hành có thể là lựa chọn tốt nhất.

Vì GIT_ASKPASS có lẽ ít được hiểu nhất trong số 3, nên tôi sẽ nói chi tiết ở đây - và những cái khác nằm trong chiếc áo choàng.

GIT_ASKPASS

Cách tạo GIT_ASKPASStập lệnh:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

Làm thế nào để sử dụng nó:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git

Kịch bản nhận stdin dưới dạng:

Password for 'scheme://host.tld':

Kịch bản nhận các ENV của Git, chẳng hạn như:

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

Xem thêm chi tiết trong cheatsheet .

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.