จะป้องกันไม่ให้ป้อนรหัสผ่านเพื่อถอดรหัสคีย์ส่วนตัวทุกครั้งเมื่อใช้ Git Bash บน Windows ได้อย่างไร?


125

ฉันมีบริการสร้างอัตโนมัติซึ่งดาวน์โหลดจาก git private repository ปัญหาคือเมื่อพยายามโคลนที่เก็บจำเป็นต้องระบุรหัสผ่านเนื่องจากจำไม่ได้ ดังนั้นเนื่องจากไม่มีการโต้ตอบกับมนุษย์จึงรอรหัสผ่านตลอดไป ฉันจะบังคับให้จำจาก id_rsa.pub ได้อย่างไร

คำตอบ:


255

สำหรับผู้ใช้ Windows โปรดทราบว่านี่คือวิธีที่ฉันตั้งค่าสภาพแวดล้อม Git Bash เพื่อให้ฉันเข้าสู่ระบบครั้งเดียวเมื่อเริ่มต้นใช้งาน ฉันแก้ไข~/.bashrcไฟล์ของฉัน:

eval `ssh-agent`
ssh-add

ดังนั้นเมื่อฉันเริ่ม Git Bash ดูเหมือนว่า:

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)

และตอนนี้ฉันสามารถ ssh ไปยังเซิร์ฟเวอร์อื่นได้โดยไม่ต้องเข้าสู่ระบบทุกครั้ง


9
หากคุณไม่มีไฟล์ ~ / .bashrc ให้สร้างไฟล์ข้อความใหม่ (notepad หรือโปรแกรมแก้ไขอื่น ๆ ) และเพิ่ม starmonkey สองบรรทัดที่กล่าวถึง
pbz

7
'~' หมายถึง "โฮมไดเร็กทอรี" ของคุณ ใน Windows คุณสามารถค้นหาสิ่งนี้ได้โดยเปิดเชลล์คำสั่ง (cmd) แล้วพิมพ์ "echo% USERPROFILE%"
Hawkeye Parker

14
สำหรับฉันไวยากรณ์นี้ไม่ทำงาน ฉันต้องเขียนeval $(ssh-agent)แทน
ปะทะ

1
ปัญหาของฉันคือฉันต้องระบุไฟล์สำหรับ ssh-add เพื่อใช้ อาจเป็นเพราะฉันมีมากกว่าหนึ่งและไม่ได้ใช้ชื่อเริ่มต้น ตัวอย่างssh-add ~/.ssh/myfile_rsa
ข้อผิดพลาดทางไวยากรณ์

1
copy > ~/.bashrcใน git bash เพื่อสร้างไฟล์ bashrc ใน windows ละเว้นข้อผิดพลาด
Ruben

61

คำตอบนี้อธิบายวิธีรับชื่อผู้ใช้และรหัสผ่าน GitHub เพื่อจัดเก็บอย่างถาวรไม่ใช่ข้อความรหัสผ่านของคีย์ SSH

ใน Windows ให้เรียกใช้

$ git config --global credential.helper wincred

ซึ่งหมายความว่าในครั้งต่อไปที่คุณกดคุณจะต้องป้อนชื่อผู้ใช้และรหัสผ่านตามปกติ แต่จะถูกบันทึกไว้ในข้อมูลประจำตัวของ Windows คุณจะไม่ต้องป้อนข้อมูลอีกหลังจากนั้น

ในขณะที่กดปุ่มเพื่อ GitHub โดยไม่ต้องป้อนชื่อผู้ใช้และรหัสผ่านทุกครั้ง (Git ทุบตีใน Windows)


2
หลังจากคำสั่งนี้คุณต้องพิมพ์ชื่อผู้ใช้และรหัสผ่านของคุณ
Stephen Tun Aung

5
สิ่งนี้เกี่ยวข้องกับคีย์ SSH หรือเฉพาะการตรวจสอบสิทธิ์ HTTPS (ชื่อผู้ใช้และรหัสผ่าน) เท่านั้น? คำถามดูเหมือนจะเกี่ยวกับการใช้คีย์ SSH
Sean

ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันฉันเดาว่าฉันใช้การตรวจสอบสิทธิ์ HTTPS (ชื่อผู้ใช้และรหัสผ่าน)
Jonatan

การรันสิ่งนี้ไม่มีผลลัพธ์เลย
user9993

@ user9993 มันจะไม่ เป็นการเปลี่ยนแปลงการกำหนดค่าดังนั้นแม้ว่าจะไม่มีการสร้างเอาต์พุต แต่gitจะเปลี่ยนพฤติกรรมตามชุดคำสั่งการกำหนดค่า
starbeamrainbowlabs

9

ฉันไม่ต้องการพิมพ์ข้อความรหัสผ่าน SSH ของฉันเมื่อเปิดเทอร์มินัลใหม่ น่าเสียดายที่โซลูชันของ starmonkeyจำเป็นต้องพิมพ์รหัสผ่านสำหรับทุกเซสชัน แต่ฉันมีสิ่งนี้ใน.bash_profileไฟล์ของฉัน:

# 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

สิ่งนี้จะจดจำข้อความรหัสผ่านของฉันสำหรับเซสชันเทอร์มินัลใหม่ด้วย ฉันต้องพิมพ์เพียงครั้งเดียวเมื่อฉันเปิดเทอร์มินัลแรกหลังจากบูตเครื่อง

ฉันต้องการเครดิตที่ฉันได้รับสิ่งนี้ เป็นการดัดแปลงงานของคนอื่น แต่จำไม่ได้ว่ามาจากไหน ขอบคุณผู้เขียนนิรนาม!

อัปเดต 2019-07-01:ฉันไม่คิดว่าทั้งหมดนี้จำเป็น ตอนนี้ฉันใช้งานได้อย่างสม่ำเสมอโดยตรวจสอบให้แน่ใจว่า.bash_profileไฟล์ของฉันรัน ssh-agent:

eval $(ssh-agent)

จากนั้นฉันตั้งsshค่าไฟล์กำหนดค่าดังนี้:

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

ฉันยังคงถูกขอรหัสผ่านทุกครั้ง
Ryan

1
@Ryan หวังว่าการอัปเดตที่ฉันเพิ่งเพิ่มจะช่วยแก้ปัญหาของคุณได้ ฉันอัปเดตข้อมูลอยู่เสมอในบล็อกโพสต์ที่conan.is/blogging/clojure-on-windows.htmlและฉันถามคำถามเดียวกันกับตัวเองที่stackoverflow.com/questions/52423626/…
โคนั

ขอบคุณฉันจะตรวจสอบสิ่งนี้
Ryan

@Conan โซลูชันที่อัปเดตทำงานต่อเซสชัน bash หลังจากฉันปิดเซสชัน bash ที่กำลังทำงานอยู่และเปิดขึ้นมาใหม่ฉันได้รับแจ้งให้ป้อนรหัสผ่านอีกครั้ง
Tushar Raj

5

หากฉันเข้าใจคำถามอย่างถูกต้องแสดงว่าคุณใช้คีย์ SSH ที่ได้รับอนุญาตในบริการบิลด์แล้ว แต่คุณต้องการหลีกเลี่ยงการพิมพ์ข้อความรหัสผ่านสำหรับทุกโคลนหรือไม่

ฉันคิดได้สองวิธีในการทำสิ่งนี้:

  1. หากบริการบิลด์ของคุณกำลังเริ่มทำงานแบบโต้ตอบ: ก่อนที่คุณจะเริ่มบริการบิลด์ให้เริ่มssh-agentด้วยการหมดเวลาที่ยาวนานเพียงพอ ( -tตัวเลือก) จากนั้นใช้ssh-add(msysGit ควรมี) เพื่อเพิ่มคีย์ส่วนตัวทั้งหมดที่คุณต้องการก่อนเริ่มบริการบิลด์ คุณยังคงต้องพิมพ์รหัสผ่านทั้งหมด แต่เพียงครั้งเดียวต่อการเปิดตัวบริการ

  2. หากคุณต้องการหลีกเลี่ยงการพิมพ์ข้อความรหัสผ่านออกไปเลยคุณสามารถลบรหัสผ่านออกจากคีย์ SSH ได้ตลอดเวลาตามที่อธิบายไว้ใน/server/50775/how-do-i-change-my- private-key-passphraseโดยการตั้งค่าข้อความรหัสผ่านใหม่ที่ว่างเปล่า สิ่งนี้ควรใช้กับรหัสผ่านทั้งหมด แต่ก็ปลอดภัยน้อยกว่าตัวเลือกก่อนหน้านี้ด้วยซ้ำ


ขอบคุณสำหรับตัวเลือกที่ 2 ฉันต้องการมัน
Stanislav Verjikovskiy

1

เมื่อฉันพยายามกดรหัสฉันได้รับข้อผิดพลาดด้านล่าง:

$ 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

หลังจากการค้นคว้าไม่กี่ชั่วโมงฉันพบว่าฉันจำเป็นต้องใช้คำสั่งด้านล่าง:

$ git config --global credential.helper cache

หลังจากดำเนินการคำสั่งข้างต้นฉันได้รับพร้อมท์ให้ป้อนชื่อผู้ใช้และรหัสผ่าน GitHub ของฉัน หลังจากให้ข้อมูลรับรองที่ถูกต้องแล้วฉันสามารถพุชรหัสของฉันได้


สิ่งนี้เพิ่งสร้าง "git: 'credential-cache' ไม่ใช่คำสั่ง git" อย่างไรก็ตาม "git config --global credential.helper store" ใช้งานได้ - นี่อาจไม่ใช่สิ่งที่ดีที่สุด แต่ฉันบังคับให้ใช้ HTTPS แทน SSH ที่ฉันต้องการและเพียงแค่ต้องการให้มันทำงาน
Terry Brown

0

ทางออกที่เหมาะสมคือ:

  1. เรียกใช้เทอร์มินัลเริ่มต้นของ Windows - cmd และรับไดเร็กทอรีของโปรไฟล์หลักของคุณ

    echo %USERPROFILE%
    
  2. เรียกใช้ Git Bash ในไดเร็กทอรีด้านบนและสร้าง.bashrcไฟล์ด้วยคำสั่ง

    echo "" > .bashrc
    
  3. เปิด.bashrcไฟล์ด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและวางโค้ดจาก GitHub Helpลงในไฟล์นั้น:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. รีสตาร์ท Git Bash และจะถามรหัสผ่านของคุณ (ครั้งแรกเท่านั้น) และเสร็จสิ้น ไม่มีรหัสผ่านรบกวนอีกต่อไป


-1

คุณต้องสร้างauthorized_keysไฟล์ภายใต้.sshโฟลเดอร์ของผู้ใช้ที่คุณจะเชื่อมต่อกับเซิร์ฟเวอร์ที่เก็บ ตัวอย่างเช่นสมมติว่าคุณใช้ชื่อผู้ใช้buildserviceบนrepo.serverคุณสามารถเรียกใช้:

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

จากนั้นคุณต้องตรวจสอบสิ่งต่อไปนี้:

  1. ที่สอดคล้องคีย์ส่วนตัวจะนำเสนอในid_rsabuilservice@build.server:~/.shh/id_rsa

  2. ลายนิ้วมือของ repo.server นั้นจะถูกเก็บไว้ในbuildservice@build.server:~/.ssh/known_hostsไฟล์ โดยปกติจะดำเนินการหลังจากครั้งแรกที่พยายามsshเชื่อมต่อกับไฟล์repo.server.


ฉันลืมที่จะพูด ภายใต้ Windows ไดเรกทอรีบ้านคุณอาจเป็น C: \ Users \ ชื่อผู้ใช้
beduin

5
อืม .. Git bash มีทุกอย่างอ่านชื่อคำถามอย่างละเอียดมากขึ้น จากคำถามฉันสันนิษฐานว่ามีการสร้างคู่คีย์แล้ว (เพราะถูกถามว่าจะบังคับให้เซิร์ฟเวอร์ repo จำ id_rsa.pub ได้อย่างไร) ขออภัยเกี่ยวกับการจัดรูปแบบ
beduin

1
โอเคไม่เคยได้ยินคำว่า 'git bash' มาก่อน ขออภัย 'การแข่งขันที่
sehe

ฉันสมมติว่านี่ใช้ msysgit ฉันกำลังเพิ่มแท็ก
Adam Dymitruk

3
คำเตือน! การใช้cat id_rsa.pub > .ssh/authorized_keysจะเขียนทับคีย์ที่ได้รับอนุญาตที่มีอยู่ ใช้>>เพิ่มแทนการเขียนทับ
David Pärsson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.