macOS Sierra ดูเหมือนจะไม่จดจำปุ่ม SSH ระหว่างการรีบูต


184

ฉันต้องเรียกใช้คำสั่งนี้ตั้งแต่อัปเกรดเป็น macOS:

ssh-add -K

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

หากฉันไม่ได้รันคำสั่งด้านบนกุญแจของฉัน~/.sshจะถูกข้ามและฉันถูกถามรหัสผ่านเซิร์ฟเวอร์เพื่อสร้างการเชื่อมต่อ


1
$ ssh-add -Kให้ฉันssh-add: illegal option -- K
modius

1
คุณจะต้องป้อนเส้นทางไพรเวตคีย์หลังจาก-Kนั้น ดูคำตอบของ @JakeGould
bisherbas

การอัพเดท 10.12.2 กำจัดการร้องขอรหัสผ่านเซิร์ฟเวอร์ที่ไม่จำเป็นสำหรับฉัน ตอนนี้คุณอาจไม่จำเป็นต้องเรียกใช้ ssh-add -K อีกต่อไป
คนแปลกหน้าการเดินทาง

คำตอบ:


216

ในฐานะของ macOS Sierra 10.12.2 Apple ได้เพิ่มssh_configตัวเลือกที่เรียกว่าUseKeychainช่วยให้การแก้ปัญหา 'เหมาะสม' กับปัญหา เพิ่มสิ่งต่อไปนี้ใน~/.ssh/configไฟล์ของคุณ:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

จากssh_config manหน้า 10.12.2:

UseKeychain

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


2
ตามลิงค์นี้: openradar.appspot.com/27348363 Apple ได้ "ปรับพฤติกรรมของพวกเขาให้สอดคล้องกับ OpenSSH หลักในพื้นที่นี้"
ThomasW

15
มันไร้สาระที่ Apple ได้ปรับเปลี่ยนพฤติกรรมในลักษณะที่จะทำให้เกิดปัญหาสำหรับนักพัฒนาส่วนใหญ่ (เพราะ GitHub ผลักดันถ้าไม่มีอะไรอื่น) และไม่พูดอะไรกับใครเลย!
mluisbrown

9
ฉันคิดว่าIdentityFile ~/.ssh/id_rsaมันซ้ำซ้อนและไม่จำเป็น (เมื่อดูตัวเลือกเริ่มต้น) ฉันไม่เคยตั้งค่าตัวเลือกนั้นไว้ในไฟล์ปรับแต่ง ssh
therealmarv

9
@ Jakeake การเปลี่ยนแปลง IMO ~/.ssh/config~นั้นเป็นที่นิยมมากกว่าเพราะจะช่วยแก้ปัญหาในsshระดับ ไม่แน่ใจ 100% ว่า.bash_profilemod จะทำงานกับไคลเอนต์ GUI ที่ใช้ ssh โดยไม่ต้องใช้เชลล์
mluisbrown

7
Apple เผยแพร่หมายเหตุด้านเทคนิค TN2449เกี่ยวกับการเปลี่ยนแปลงนั้น
Kentzo

106

ผมมีปัญหานี้เช่นกันเมื่อพยายามที่จะปรับใช้โค้ดบางส่วนใช้Capistrano น่าผิดหวังมาก ต่อไปนี้เป็นวิธีการสองวิธีที่ฉันทราบเพื่อจัดการกับปัญหานี้

วิธีที่ 1: เพิ่มคีย์ที่รู้จักทั้งหมดลงในตัวแทน SSH

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

ssh-add -A

ตอนนี้ใช้งานได้ แต่มันจะไม่คงอยู่ในการรีบูต ดังนั้นหากคุณไม่ต้องกังวลกับปัญหานี้อีกให้เปิด~/.bash_profileไฟล์ของผู้ใช้ดังนี้:

nano ~/.bash_profile

และเพิ่มบรรทัดนี้ที่ด้านล่าง:

ssh-add -A 2>/dev/null;

ตอนนี้เมื่อคุณเปิดหน้าต่างเทอร์มินัลใหม่ทั้งหมดน่าจะดี!

วิธีที่ 2: เพิ่มเฉพาะคีย์ SSH ที่อยู่ในพวงกุญแจไปยัง บริษัท ตัวแทน

ดังนั้นในขณะที่ssh-add -Aตัวเลือกควรทำงานในกรณีพื้นฐานส่วนใหญ่ฉันพบปัญหาเมื่อเร็ว ๆ นี้เมื่อฉันติดตั้งกล่อง Vagrant 6-7 กล่อง (ซึ่งใช้การตั้งค่า SSH คีย์ / รหัสประจำตัวสำหรับการเข้าถึง) บนเครื่องที่อยู่ด้านบนของid_rsa.pubสถานที่ทั่วไป

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

ปัญหาคือการที่ssh-add -Aจะเพิ่มคีย์ / รหัสประจำตัว SSH เดียวทุกครั้งที่คุณมีให้กับเอเจนต์แม้ว่าจะไม่จำเป็นต้องทำเช่นนั้น เช่นในกรณีของกล่อง Vagrant

วิธีการแก้ปัญหาของฉันหลังจากการทดสอบมากมีดังนี้

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

ssh-add -D

เมื่อเสร็จแล้วให้เริ่มต้นเอเจนต์ SSH เป็นกระบวนการพื้นหลังดังนี้:

eval "$(ssh-agent -s)"

ตอนนี้มันแปลกและฉันก็ไม่แน่ใจเหมือนกันว่าทำไม ในบางกรณีคุณสามารถเพิ่ม~/.ssh/id_rsaคีย์ / ข้อมูลเฉพาะตัวลงในเอเจนต์ได้ดังนี้:

ssh-add ~/.ssh/id_rsa

พิมพ์ข้อความรหัสผ่านของคุณกดปุ่มReturnและคุณควรจะไป

แต่ในกรณีอื่น ๆ เพียงแค่เรียกใช้สิ่งนี้ก็เพียงพอที่จะเพิ่มคีย์ / ข้อมูลประจำตัว:

ssh-add -K

หากใช้งานได้ดีแล้วให้พิมพ์ssh-add -lและคุณจะเห็นรหัส / ข้อมูลประจำตัวของ SSH เดียวอยู่ในรายการ

ทั้งหมดดี? ตอนนี้เปิดของคุณ.bash_profile:

nano ~/.bash_profile

และเพิ่มบรรทัดนี้ไปที่ด้านล่าง; แสดงความคิดเห็นหรือลบ-Aเวอร์ชันหากคุณมี:

ssh-add -K 2>/dev/null;

ซึ่งจะอนุญาตให้คีย์ / รหัสประจำตัว SSH ได้รับการโหลดซ้ำไปยังเอเจนต์ SSH ในการเริ่มต้น / รีบูตแต่ละครั้ง

UPDATE: ขณะนี้ Apple ได้เพิ่มUseKeychainตัวเลือกในตัวเลือกการกำหนดค่า SSH แบบเปิดและพิจารณาssh-add -Aวิธีการแก้ปัญหาเช่นกัน

ตั้งแต่ MacOS Sierra 10.12.2, Apple ได้เพิ่มUseKeychainตัวเลือกการกำหนดค่าสำหรับการกำหนดค่า SSH ตรวจสอบหน้าคน (ผ่านman ssh_config) แสดงข้อมูลต่อไปนี้:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

ซึ่งเดือดลงไปแอปเปิ้ลได้เห็นการแก้ปัญหาเป็นทั้งการเพิ่มssh-add -Aที่คุณ.bash_profile ตามที่อธิบายไว้ในตั๋วเรดาร์นี้เปิดหรือเพิ่มเป็นหนึ่งในตัวเลือกในต่อผู้ใช้UseKeychain~/.ssh/config


4
@modius: หากคุณมีรหัสป้องกัน pw ให้ทำssh-add -K [path to key]และป้อน pw เมื่อได้รับแจ้ง Keychain จะเก็บรหัสผ่านและ ssh-add จะได้รับจากที่นั่นหลังจากนั้น
Timo

2
หมายเหตุ - สำหรับการเพิ่มตัวตนให้กับตัวแทนโดยใช้ข้อความรหัสผ่านใด ๆ ที่เก็บไว้ในพวงกุญแจของคุณ หากคุณมีข้อมูลประจำตัวเพิ่มเติมโดยไม่มีข้อความรหัสผ่านคุณจะต้องละเว้นตัวเลือก -A เพื่อเพิ่มลงในตัวแทนของคุณ
Evan Pon

12
เพียงเพิ่มการมองเห็นสิ่งนี้อีกเล็กน้อย Apple ได้อัปเดต man page สำหรับ ssh_config เพื่อรวมUseKeychainและAddKeysToAgentเพื่อเพิ่มคีย์ของคุณจาก ssh_config ของคุณโดยอัตโนมัติ ไม่จำเป็นต้องใช้สคริปต์เชลล์ ดู @mluisbrown คำตอบด้านล่างสำหรับข้อมูลที่อัปเดตสำหรับ 10.12.2
Ryan Gibbons

1
@ Jake ฉันจะได้รับสิ่งที่คุณพูดฉันชอบสิ่งที่พวกเขากำลังทำ แทนที่จะบันทึกข้อความรหัสผ่านลงใน Keychain โดยอัตโนมัติและโหลดในการบู๊ตพวกเขากำลังควบคุมความปลอดภัยให้คุณ / ยัก
ไรอันกิบบอนส์

1
@RyanGibbons FWIW ดูคำแนะนำอย่างเป็นทางการจากApple Developer Relationsในคำตอบนี้บน OpenRadar: “ คุณสามารถแก้ไขปัญหานี้ได้อย่างง่ายดายโดยการเรียกใช้ssh-add -Aสคริปต์ rc ของคุณหากคุณต้องการโหลดกุญแจของคุณเสมอ” ¯\_(ツ)_/¯
JakeGould

16

ตามที่อธิบายไว้ที่นี่นี่เป็นวิธีที่แนะนำตั้งแต่macOS 10.12.2 :

  1. เพิ่มบรรทัดต่อไปนี้ใน~/.ssh/configไฟล์ของคุณ:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. คีย์ใด ๆ ที่คุณเพิ่มไปยังssh-agentโดยใช้ssh-add /path/to/your/private/key/id_rsaคำสั่งจะถูกเพิ่มในพวงกุญแจโดยอัตโนมัติและควรถูกโหลดอัตโนมัติเมื่อรีบูต


ฉันกำลังเพิ่มคำตอบนี้เพราะ:

  • คำตอบอื่น ๆ บอกให้คุณเพิ่มIdentityFile ~/.ssh/id_rsaบรรทัด แต่ตัวเลือกนั้นไม่จำเป็นสำหรับการโหลดคีย์อัตโนมัติ (และมันจะผูกคีย์นั้นให้กับส่วนโฮสต์ของคุณเพิ่มซึ่งคุณไม่ต้องการถ้าคุณใช้คีย์ที่แตกต่างกันสำหรับ hots ที่แตกต่างกัน)
  • คำตอบที่ได้รับการยอมรับกล่าวถึงUseKeychainแต่ก็ยังไม่เพียงพอที่จะคงคีย์ไว้ssh-agentหลังจากรีบูต

1
เกี่ยวกับประเด็นที่สอง คุณแน่ใจเหรอ ไม่มีอะไรเกิดขึ้นจริงเมื่อรีบูทและไม่มีการพูดถึงในเอกสารอ้างอิงของคุณ สิ่งที่เกิดขึ้นกับการตั้งค่าด้านบนคือไคลเอนต์ SSH ของคุณจะโหลดกุญแจเข้าสู่เอเจนต์เมื่อทำการเชื่อมต่อครั้งแรก (และมันจะดึงข้อความรหัสผ่านจากพวงกุญแจ) จากนั้นคีย์จะยังคงโหลดอยู่ คุณสามารถตรวจสอบคำสั่งนี้โดยรายชื่อปุ่มขวาหลังจากรีบูตผ่านและจะรายงานssh-add -L The agent has no identitiesจะไม่มีอะไรเกิดขึ้นจนกว่าคุณจะเชื่อมต่อ AddKeysToAgentไม่ได้ยังคงมีปุ่มระหว่างการเริ่มต้นใหม่ในทางใด ๆ !
Danila Vershinin

15

ฉันเขียนบทความสั้น ๆ เกี่ยวกับหัวข้อนี้ที่อาจช่วยคุณได้

โซลูชันกำลังเรียกใช้ssh-add -Aคำสั่งในทุกการเริ่มต้น

เพียงเพิ่ม.plistไฟล์ที่มีเนื้อหาต่อไปนี้ลงในพา ธ~/Library/LaunchAgents/หรือสร้างไฟล์ด้วยแอปLingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->

8

ตั้งแต่ macOS 10.12.2 คุณสามารถใช้UseKeychainตัวเลือก อ่านเพิ่มเติมได้ที่นี่man ssh_configหรือมองเข้าไปใน

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

ดังนั้นให้ทำดังนี้

echo "UseKeychain yes" >> ~/.ssh/config


1
การใช้>>มีความเสี่ยงหากคุณป้อนคำสั่งหลายครั้ง ดีกว่าทำคู่มือฉบับของไฟล์ตามที่อธิบายคำตอบ mluisbrownหรือคำตอบ ChrisJF
Cœur

คุณอยู่ตรงนั้น :-)
เบ็น

4

ฉันพบที่ssh-add -Kให้ฉัน " ตัวเลือกที่ผิดกฎหมาย - K " นี่เป็นเพราะ ssh-add เป็นรุ่นที่แปลกที่มาจาก / usr / local / bin (ติดตั้งโดยชง?) ฉันสามารถเพิ่มคีย์ด้วยการใช้ ssh-add ที่อยู่ใน / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa

นี่คือสิ่งที่ทำงานฉันหลังจากที่ล้มเหลวในการทำงานได้อย่างง่ายดายสำหรับทุกวัย
nyxee

4

ฉันมีปัญหานี้มาก่อนและฉันพบวิธีที่จะหลีกเลี่ยงปัญหานี้ ฉันเพิ่งสร้างไฟล์ชื่อconfigใน~/.sshโฟลเดอร์ของฉันซึ่งฉันได้เพิ่มบรรทัดต่อไปนี้:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

ฉันไม่แน่ใจว่าทำไม แต่HostและHostNameทั้งสองมีความสำคัญ ในกรณีของฉันหากหนึ่งในนั้นไม่ปรากฏวิธีแก้ปัญหาใช้ไม่ได้

จากนั้นฉันเพิ่งทำssh-add -Kและมันก็ทำงานได้แม้หลังจากรีสตาร์ท


1
โฮสต์คือชื่อ / นามแฝงที่ผู้ใช้กำหนดของคุณสำหรับเซิร์ฟเวอร์ที่เฉพาะเจาะจงและแยกรายการต่อเซิร์ฟเวอร์: โวหารเป็นการดีที่จะเยื้องบรรทัดที่ตามหลังรายการโฮสต์ HostName ระบุชื่อเครือข่ายของเซิร์ฟเวอร์เช่น github.com แต่คุณสามารถใช้ที่อยู่ IP ได้เช่นกัน Host และ HostName ไม่จำเป็นต้องเหมือนกัน แต่ใช่ทั้งคู่เป็นส่วนสำคัญกับรูปแบบ ssh config
Mark Fox

4

หากคุณกำลังใช้ ssh รุ่นอื่น (เช่นติดตั้งผ่าน homebrew) โซลูชันด้านบนจะไม่ทำงานนอกกรอบ ตัวอย่างเช่นAddKeysToAgent yesและUseKeychain yesใน.ssh/configไฟล์ไม่ได้รับการยอมรับจากเวอร์ชันที่ไม่ใช่ของ Apple ssh และจะทำให้เกิดข้อผิดพลาด เหมือนกันสำหรับ-Aหรือ-Kตัวเลือกสำหรับsshลูกค้า

นั่นหมายความว่าคำตอบของ@mluisbrownจะไม่ทำงานเลย คุณสามารถใช้วิธีที่ 1 ของคำตอบ@JakeGouldและใช้ssh-addยูทิลิตี้macOS ในของคุณ.bash_profileเพื่อเพิ่มคีย์ทั้งหมดลงในพวงกุญแจอย่างชัดเจน:

/usr/bin/ssh-add -A

ดังที่ได้กล่าวไว้ในความคิดเห็นข้างต้นคุณอาจต้องเพิ่มรหัสลงในพวงกุญแจก่อนเช่น:/usr/bin/ssh-add -K .ssh/github


2

การแก้ไข ~ / .ssh / config เพื่อเพิ่ม UseKeyChain สำหรับโฮสต์ทั้งหมดก็เพียงพอที่จะหยุดฝันร้ายที่เกิดขึ้นนี้ได้)

Host *
 UseKeychain yes

หากไฟล์ว่างเปล่าหรือไม่มีอยู่ให้สร้างและ / หรือเพิ่มการกำหนดค่าข้างต้นอย่างง่าย


1

ฉันอัปเดตเป็น Mac OS X Sierra (10.12.6) ฉันสามารถ ssh ไปยังโฮสต์อื่น ๆ แต่ไม่สามารถเข้าไปใน github.com

นี่คือสิ่งที่ฉันต้องแทรกลงใน ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

หลังจากการเปลี่ยนแปลงนั้นฉันสามารถใช้ GitHub ได้เหมือนก่อน

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