วิธีการทำให้ ssh-agent เพิ่มคีย์ตามความต้องการโดยอัตโนมัติ?


51

ฉันต้องการเรียกใช้ ssh-agent (พร้อมตัวเลือกอายุการใช้งานสูงสุด) แต่ไม่เพิ่มคีย์ใด ๆ เมื่อเริ่มต้น แต่เพิ่มพวกเขาตามต้องการ

เช่นครั้งแรกที่ฉันลงชื่อเข้าใช้เซิร์ฟเวอร์บางเครื่องควรถามวลีรหัสผ่านครั้งต่อไป (เว้นแต่ฉันจะรอนานกว่าหนึ่งชั่วโมง) มันควรเชื่อมต่ออย่างหมดจด:

ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...

ssh server2
server2> # no passphrase this time

# wait for lifetime

ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':

ฉันไม่ต้องการจดจำการเรียกใช้ 'ssh-add' ด้วยตนเองทุกครั้ง (เช่นป้อนวลีรหัสผ่านเพียงเพื่อ ssh และ "โอ้มันไม่ได้จำได้จำต้องพิมพ์ซ้ำ")

วิธีกำหนดค่า ssh ให้เพิ่มคีย์ไปยัง ssh-agent โดยอัตโนมัติหากผู้ใช้ระบุข้อความรหัสผ่าน?


คำตอบ:


58

ssh รองรับการเพิ่มคีย์ให้กับเอเจนต์เมื่อใช้ครั้งแรก (ตั้งแต่เวอร์ชั่น 7.2) คุณสามารถเปิดใช้งานคุณสมบัตินั้นได้โดยใส่สิ่งต่อไปนี้ลงใน~/.ssh/config:

AddKeysToAgent yes

สิ่งนี้ยังใช้งานได้เมื่อใช้เครื่องมืออนุพันธ์เช่น git

จาก7.2 การเปลี่ยนแปลง :

  • ssh (1): เพิ่มตัวเลือกไคลเอนต์ AddKeysToAgent ซึ่งสามารถตั้งค่าเป็น 'ใช่', 'ไม่', 'ถาม' หรือ 'ยืนยัน' และเริ่มต้นที่ 'ไม่' เมื่อเปิดใช้งานคีย์ส่วนตัวที่ใช้ระหว่างการรับรองความถูกต้องจะถูกเพิ่มไปยัง ssh-agent หากกำลังทำงานอยู่ (โดยเปิดใช้งานการยืนยันหากตั้งค่าเป็น 'ยืนยัน')

สิ่งนี้ต้องการให้เอเจนต์ ssh ทำงานอยู่ อ้างถึงstackoverflow.com/a/24347344/4573065 + ความคิดเห็นเพื่อหาวิธีเริ่มต้นที่ดี (เพียงครั้งเดียว)
ST-DDT

18

คุณสามารถโกงและใส่สิ่งที่ต้องการalias ssh='ssh-add -l || ssh-add && ssh'บน/.bashrc .profileการเรียกใช้ครั้งแรกนี้ssh-add -lซึ่งสามารถส่งคืน 0 (มีคีย์ในตัวแทน), 1 (ไม่มีคีย์) หรือ 2 (ไม่มีตัวแทนที่ทำงานอยู่); ถ้ามันคืนค่า 0 sshจะทำงาน ถ้า 1 ssh-addจะทำงานแล้วssh; ถ้า 2 ssh-addจะล้มเหลวและsshจะไม่ทำงาน แทนที่&&ด้วย;หากคุณต้องการsshเรียกใช้แม้ในขณะที่ไม่มีตัวแทนทำงานอยู่


3
มันจะขอวลีรหัสผ่านไปที่สำคัญแม้เมื่อคำสั่ง ssh เพิ่มเติมไม่ได้ใช้มัน
วิ

@Vi จริง แต่หายากคือคำสั่งที่ไม่ได้ใช้ (ยกเว้นว่าคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้แป้นพิมพ์แบบโต้ตอบ) กุญแจจะอยู่ในตัวแทนเมื่อใดก็ตามที่คุณต้องการหลังจากนั้น นอกจากนี้นามแฝงโชคดี (หรือน่าเสียดายที่) ไม่เปลี่ยนการใช้แบ็กเอนด์ของ ssh (เช่นกับ git หรือ rsync)
Jessidhia

2
(คิดถึงการเขียน auto-call-ssh-add patch สำหรับลูกค้า ssh)
Vi

alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'ขึ้นอยู่กับคำตอบนี้คุณสามารถสร้างนามแฝงสำหรับโฮสต์เฉพาะที่ใช้งาน: คุณสามารถใส่ลงไปในลูปสำหรับคีย์ ssh ทั้งหมดของคุณและสร้างสมนาม แฮ็คสกปรก แต่ใช้งานได้
dset0x

5

จนกระทั่ง auto-call-ssh-add ได้รับการสนับสนุนโดย ssh ฉันได้เพิ่มสิ่งนี้ลงใน.bashrcข้อเสนอของ Kovensky:

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

นามแฝงจะถูกสร้างขึ้นเฉพาะในกรณีที่ไม่ได้เพิ่มตัวตนและนามแฝงทำลายตัวเองเมื่อทำงาน

วิธีนี้ใช้คำสั่ง ssh ปกติหลังจากที่มีการเพิ่มข้อมูลประจำตัวแล้ว


จะไม่ทำงานในกรณีของฉันเพราะ ssh-add ยังมีการกำหนดค่าการหมดเวลา แต่ความคิดนั้นดีพอ
วิ

@Vi การหมดเวลามีผลกับสิ่งนี้อย่างไร ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน
lanrat

1
@lanrat ตรวจสอบว่ามีกุญแจอยู่ใน ssh-agent หรือไม่และตั้งค่านามแฝงตามสถานะ แต่เนื่องจากหมดเวลา ( ssh-add -t ...) กุญแจที่เพิ่มไปยัง ssh-agent อาจหายไปอย่างกะทันหัน แต่และนามแฝงจะยังคงอยู่เพราะกุญแจยังคงอยู่ในหน่วยความจำ
วิ

1

ฉันใช้ฟังก์ชันเชลล์ต่อไปนี้:

ssh() {
    local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
                           | cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
    for k in $possible_keys; do
        if [[ -f $k ]]; then
            local fingerprint=$(ssh-keygen -lf $k)
            ssh-add -l | grep -q "$fingerprint" || ssh-add $k
        fi
    done
    /usr/bin/env ssh $@
    return $?
}

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

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