วิธีหลีกเลี่ยงการถูกถามรหัสผ่านในแต่ละครั้งที่ฉันผลักดันให้ Bitbucket


217

ฉันตั้งค่าข้อมูล ssh ของฉันด้วยความช่วยเหลือของคู่มือนี้และมันใช้งานได้ดี (ฉันสามารถทำงานได้hg pushโดยไม่ต้องขอรหัสผ่าน) สิ่งที่อาจเกิดขึ้นระหว่างนั้นและตอนนี้เมื่อพิจารณาว่าฉันยังคงใช้ไดเรกทอรีบ้านเดียวกัน

$ cat .hg/hgrc 
[paths]
default = ssh://hg@bitbucket.org/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://hg@bitbucket.org/tshepang/bloog
searching for changes
...

คำตอบ:


337

คุณต้องใช้เอเจนต์ ssh คำตอบสั้น ๆ : ลอง

$ ssh-add

ก่อนที่จะผลักดัน ระบุวลีรหัสผ่านของคุณเมื่อถูกถาม

หากคุณยังไม่ได้ใช้งานเอเจนต์ ssh คุณจะได้รับข้อความต่อไปนี้:

Could not open a connection to your authentication agent.

ในสถานการณ์นั้นคุณสามารถเริ่มต้นและตั้งค่าสภาพแวดล้อมของคุณได้

eval $(ssh-agent)

จากนั้นทำซ้ำssh-addคำสั่ง

มันคุ้มค่าในการดูที่ที่manpage ตัวแทน SSH


2
จุดคืออะไรevalคุณสามารถเพียงแค่พิมพ์ssh-agent?
James McMahon

4
มันแสดงคำสั่งบางอย่างที่อนุญาตให้คุณใช้และไม่ได้เรียกใช้งานมันสำหรับคุณ evalไม่ excuting
tshepang

ไม่เกี่ยวข้องกับคำถามเดิม แต่ถ้าคุณยังคงมีปัญหาเหล่านี้ใน GitHub, Bitbucket ฯลฯ ตรวจสอบให้แน่ใจว่าคุณใช้ URL git / ssh ไม่ใช่ http ซึ่งจะขอชื่อผู้ใช้และรหัสผ่าน
Czechnology

และถ้าคุณไม่มีคีย์เริ่มต้นหรือต้องการเพิ่มทวีคูณssh-add /path/to/key
hoosierEE

46

วิธีแก้ปัญหานี้มีssh-agentและssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

หลังจากนี้ข้อความรหัสผ่านจะถูกบันทึกไว้สำหรับเซสชันปัจจุบัน และจะไม่ถูกถามอีก


7
คนส่วนใหญ่ไม่ต้องการที่จะบั๊กสำหรับวลีพาสของพวกเขาเลย
connexo

26

ฉันใช้Keychainเพื่อจัดการกับคีย์ ssh มันยังมีอยู่ใน Debian และ Ubuntu ก็น่าจะเป็นเช่นนั้น

apt-get install keychain

นี่คือDebian พวงกุญแจหน้าแพคเกจ อย่างที่คุณเห็นโครงการไม่ทำงานมาก แต่ทำงานให้ฉัน ฉันยังแสดงความคิดเห็นเล็กน้อยเกี่ยวกับเรื่องนี้ในคำตอบอื่นที่นี่


2
//, นี่ใช้ได้สำหรับฉัน มันเป็นวิธีที่ดีกว่าตัวแทน ssh ตั้งแต่ฉันไม่จำเป็นต้องใส่รหัสผ่าน SSH สำคัญของฉันทุกครั้งที่ผมเปิดสถานี
Nathan Basanese

@NathanBasane คุณกำลังบอกว่าการใช้ Keychain คุณไม่จำเป็นต้องป้อนรหัสผ่าน ssh key ทุกครั้งที่คุณเปิด Terminal? คุณจะกำหนดค่าอย่างไร เพราะพวงกุญแจยังคงขอรหัสผ่านทุกครั้งที่ฉันเปิดเครื่องเทอร์มินัลเฉพาะครั้งแรกที่ฉันเปิดหลังจากบูต แต่ก็ยังอยู่ ฉันไม่ต้องการป้อนข้อความรหัสผ่านทุกครั้ง
m4l490n

@ m4l490n ไม่ถ้าคุณกำลังใช้ Keychain คุณไม่จำเป็นต้องป้อนรหัสผ่าน ssh key ทุกครั้งที่คุณเปิด Terminal แต่คุณต้องป้อนอีกครั้งหลังจากการบูท ข้อความรหัสผ่านไม่ได้รับการบันทึกลงดิสก์ซึ่งอาจไม่ปลอดภัย
Faheem Mitha

สำหรับฉันมันถามทุกครั้งที่ฉันเข้าสู่ระบบ (ฉันมีพื้นที่เก็บข้อมูล git + ssh คีย์ในเซิร์ฟเวอร์ระยะไกลและทุกครั้งที่ฉันทำ "git pull" ฉันต้องป้อนข้อความรหัสผ่าน)
Martin Thoma

@ MartinThoma ที่ดูผิด ตรวจสอบว่าคุณได้กำหนดค่า. ssh อย่างถูกต้อง โดยเฉพาะเปลือกของคุณมีการกำหนดค่าอย่างถูกต้อง? หากยังไม่ได้ผลสำหรับคุณและคุณไม่สามารถเข้าใจได้คุณสามารถถามคำถามได้
Faheem Mitha

13

สร้าง (หรือแก้ไขหากมี) ไฟล์ ~ / .ssh / config ต่อไปนี้:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa

แต่ฉันใช้กุญแจคู่ที่แตกต่างกันสำหรับทุก ๆ บริการ ...
connexo

@connexo คุณสามารถแทนที่เครื่องหมายดอกจันด้วยชื่อโฮสต์ส่วนบุคคลของคุณและ 'id_rsa' ด้วยคีย์ส่วนตัวของคุณที่เกี่ยวข้อง
ness-EE

1
ฉันต้องการที่จะเพิ่มเหนือIgnoreUnknown AddKeysToAgent,UseKeychain UseKeychain yes
consideRatio

1
ฉันได้รับข้อผิดพลาดนี้: "ตัวเลือกการกำหนดค่าไม่ดี: usekeychain" บนบรรทัด "UseKeychain ใช่"
m4l490n

@ m4l490n: ดูเหมือนว่ามีการUseKeychainเพิ่มตัวเลือกใน OpenSSH 7.1p2 (2016-02-28) บางทีคุณอาจมีรุ่นก่อนหน้า openssh.com/txt/release-7.2
chus

6

เพื่อความสะดวกของวิธีการที่ดีที่สุดคือการรวมกันของคำตอบของjmtdและFaheem

การใช้ssh-agentเพียงอย่างเดียวหมายความว่าคุณssh-agentจำเป็นต้องสร้างอินสแตนซ์ใหม่สำหรับทุกเทอร์มินัลใหม่ที่คุณเปิด keychainเมื่อเริ่มต้นจะถามรหัสผ่านสำหรับคีย์ส่วนตัวและเก็บไว้ วิธีนี้ทำให้รหัสส่วนตัวของคุณได้รับการป้องกันด้วยรหัสผ่าน แต่คุณไม่จำเป็นต้องใส่รหัสผ่านซ้ำแล้วซ้ำอีก

Arch วิกิพีเดียแนะนำให้เริ่มต้นจากพวงกุญแจ/etc/profile.d/หรือรายละเอียดเปลือกของคุณเช่นหรือ.bash_profile .bashrcสิ่งนี้มีข้อเสียคือมันจะทำให้พวงกุญแจของคุณติดขึ้นทันทีที่คุณเปิดเทอร์มินัล

แนวทางที่ยืดหยุ่นมากขึ้นคือการรวมเข้าkeychainกับtmuxเซสชันที่เฉพาะเจาะจง ดังนั้นใน.bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... และจากนั้นเป็นเพียงกรณีของการเริ่มtmuxเซสชันที่ปลอดภัยตามที่และเมื่อจำเป็น (เปิดตัวจากการผูกกุญแจ):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

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


ฉันจะทำให้มันทำงานบนเครื่องระยะไกลได้อย่างไร ฉันปรับเปลี่ยนสคริปต์ตัวที่สองเพื่อตรวจสอบ $ SSH_CLIENT และหากมีอยู่แล้วจะไม่เรียกใช้ urxvtc เพียง tmux ใช้งานได้ แต่ปัญหาคือส่วน. bash_profile เมื่อฉันเข้าสู่กล่องแรกมันบอกว่า "ไม่พบเซิร์ฟเวอร์: การเชื่อมต่อปฏิเสธ" ซึ่งเป็นผลลัพธ์ของ "tmux ls" จากนั้นเมื่อฉันรันสคริปต์ที่สอง tmux จะเริ่มเซสชันใหม่หรือแนบกับสคริปต์ที่มีอยู่ แต่ไม่มีพรอมต์ของพวงกุญแจ จากนั้นเมื่อฉันออกจากเซสชันพรอมต์ของพวงกุญแจจะรออยู่
jonyamo

ฉันได้อัปเดตคำตอบให้กับเอาต์พุตเงียบของ tmux หากไม่มีเซสชัน
jasonwryan

ขอบคุณ แต่นั่นก็ยังไม่ได้แก้ปัญหาด้วยพวงกุญแจ tmux สร้างเซสชั่นใหม่ แต่ตรงไปที่พรอมต์ที่ว่างเปล่า เมื่อฉันออกจากเซสชั่น tmux ฉันจะเห็นข้อความแจ้งให้พวงกุญแจถามรหัสผ่านของฉัน
jonyamo

ฉันเดาว่าฉันควรหยุดพูดพวงกุญแจเพราะกุญแจจะถูกดำเนินการใน. bash_profile เท่านั้น ปัญหานี้เกิดจากการดำเนินการ ssh-add แม้ว่าถ้าฉันรัน ssh-add ด้วยตนเองหลังจากสร้างเซสชัน tmux มันก็ใช้ได้
jonyamo

1
ข้ามสคริปต์ที่สองและเริ่มเซสชัน tmux ที่ปลอดภัยของคุณจาก.profileนั้นคุณจะได้รับพรอมต์สำหรับคีย์ทันทีที่คุณเข้าสู่ระบบ
jasonwryan

0

คุณสามารถใช้sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

คุณเพียงแค่ต้องเพิ่มsshpass -p yourpassphraseก่อนที่จะผนวกsshคำสั่งตามปกติของคุณ


2
ฟังดูเหมือนไอเดียที่โง่จริงๆ นั่นจะไม่ทำให้รหัสผ่านของคุณปรากฏเป็นข้อความธรรมดาในประวัติเชลล์ใช่ไหม
connexo

แน่นอน แต่คุณไม่ควรป้องกันเซสชันด้วยรหัสผ่านด้วยใช่หรือไม่
belka

1
แม้ว่าคุณจะทำยังไงคุณมีเพื่อนร่วมงานนั่งข้างๆคุณและช่วยคุณ / เรียนรู้จากคุณบ่อยแค่ไหน?
connexo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.