มี ssh-add เงียบถ้ามีกุญแจอยู่แล้ว


16

ฉันต้องการที่จะวางssh-add /path/to/special_keyที่ด้านบนของสคริปต์ วิธีนี้ใช้งานได้ดี แต่จะพร้อมท์ให้ใส่ข้อความรหัสผ่านเสมอ นี่เป็นเรื่องแปลกและน่ารำคาญเล็กน้อยเพราะมันยังถามรหัสผ่านถึงแม้ว่าจะssh-add -lแสดงว่ามีการเพิ่มรหัสแล้ว

มีวิธีบอกหรือไม่ว่า: "เพิ่มรหัสนี้และถามวลีรหัสผ่านหากยังไม่ได้เพิ่มหรือไม่ทำอะไรเลย"


คำถามที่คล้ายกันที่superuser.com/q/325662
Darren Cook

คำตอบ:


20

ฉันไม่เห็นตัวเลือกใด ๆ สำหรับ ssh-add ที่ช่วยให้คุณได้ผลลัพธ์ตามที่ต้องการ แต่มันง่ายมากที่จะหลีกเลี่ยงปัญหานี้เนื่องจากคุณกังวลกับกุญแจตัวหนึ่งโดยเฉพาะ

ก่อนอื่นดึงลายนิ้วมือสำหรับ special_key ของคุณ:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

สมมุติว่าลายนิ้วมือนี้ดูเหมือน 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

จากนั้นที่ด้านบนของสคริปต์ของคุณใช้ssh-add -lเพื่อตรวจสอบว่ามีการโหลดคีย์นั้นหรือไม่ก่อนแจ้งให้เพิ่ม:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

คุณสามารถพับทั้งหมดนี้เข้าด้วยกันเป็นหนึ่งบรรทัดหากคุณต้องการ:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

สายการบินหนึ่งทำงานได้ดีมากขอบคุณ!
Darren Cook

1
ฉันคิดว่าหนึ่งซับง่าย ๆ นี้จะเข้าใจได้ง่ายกว่าและดีกว่าเพราะมันหลีกเลี่ยงssh-keygen(หลังจากทั้งหมดฉันไม่ต้องการสร้างคีย์ใด ๆ ) แทนที่จะใช้เส้นทางที่สำคัญ:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus

1
ssh-keygenในคำตอบไม่ได้สร้างรหัส - เช่นเดียวกับssh-add -lในตัวอย่างของคุณไม่ได้เพิ่มอะไรเลย แฟล็กแก้ไขพฤติกรรมของคำสั่งดังนั้นจึงไม่ตรงกับชื่อ โปรดทราบว่าเวอร์ชันเหล่านี้มีหน้าที่แตกต่างกัน - หากการตรวจสอบตามเส้นทางและรหัสที่เส้นทางนั้นเปลี่ยนไปเวอร์ชันของคุณจะไม่มารับ เวอร์ชันในคำตอบจะตรวจพบคีย์ที่มีอยู่ไม่ว่าจะโหลดจากที่ใด
Richlv

5

ไม่มีวิธีโดยตรงในการตรวจสอบโดยใช้เพียงssh-addแต่คุณสามารถใช้ssh-keygenและสคริปต์บางอย่างเพื่อตรวจสอบ

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

ด้านบนจะพิมพ์yesหากมีลายนิ้วมือที่แสดงโดยไฟล์/path/to/special_keyนั้นมีอยู่ในssh-add -lเอาต์พุตของ

ตัวอย่าง

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

เนื้อหาของเอาต์พุตจากที่ssh-keygen -lf /path/to/special_keyมีลักษณะเช่นนี้:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

และเราใช้ `awk '{พิมพ์ $ 2}' เพื่อเลือกคอลัมน์ที่ 2 ซึ่งมีลายนิ้วมือคือ:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

อ้างอิง


3

คุณอาจมีเหตุผลบางอย่างที่ต้องใช้ssh-addอย่างชัดเจน แต่ถ้าคุณต้องการ "ฉันต้องการให้คุณใส่ข้อความรหัสผ่านในครั้งแรกที่ฉันใช้คีย์ แต่ไม่ใช่หลังจากนั้น" openssh มีวิธีแก้ปัญหาที่ง่ายกว่า:

ใส่AddKeysToAgent yesใน.ssh/configไฟล์ของคุณ


ขอบคุณ เห็นได้ชัดว่ามีการเพิ่มใน ssh 7.2 (ดูเหมือนว่า Ubuntu 18 จะเป็นเวอร์ชั่น 7.6)
Darren Cook

Yup, "AddKeysToAgent ไม่รองรับรุ่น openssh ของฉัน" เป็นเหตุผลที่ดีที่จะใช้ ssh-add อย่างชัดเจน ;-)
เนท

0

ssh-add -K FILEทำงานได้ดีสำหรับฉันบน Mac
มันยังคงแสดงบรรทัด "เพิ่มข้อมูลประจำตัว:" แต่ไม่ขอข้อความรหัสผ่าน

จากหน้าคน:

-K เมื่อเพิ่มตัวตนข้อความรหัสผ่านแต่ละอันจะถูกเก็บไว้ในพวงกุญแจของผู้ใช้ เมื่อลบ identities ด้วย -d แต่ละวลีรหัสผ่านจะถูกลบออก

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