จะเพิ่มรหัสส่วนตัวอย่างถาวรด้วย ssh-add บน Ubuntu ได้อย่างไร [ปิด]


474

ฉันมีรหัสส่วนตัวป้องกันด้วยรหัสผ่านเพื่อเข้าถึงเซิร์ฟเวอร์ผ่าน SSH

ฉันมีเครื่อง linux (ubuntu 10.04) 2 เครื่องและพฤติกรรมของคำสั่ง ssh-add นั้นแตกต่างกันในทั้งสองเครื่อง

ในเครื่องเดียวเมื่อฉันใช้ "ssh-add .ssh / identity" และป้อนรหัสผ่านของฉันคีย์จะถูกเพิ่มอย่างถาวรนั่นคือทุกครั้งที่ฉันปิดคอมพิวเตอร์และเข้าสู่ระบบอีกครั้งกุญแจจะถูกเพิ่มเข้าไปแล้ว

ในอีกอันหนึ่งฉันต้องเพิ่มรหัสทุกครั้งที่ลงชื่อเข้าใช้

เท่าที่ฉันจำได้ฉันก็ทำแบบเดียวกันทั้งคู่ ข้อแตกต่างเพียงอย่างเดียวคือรหัสถูกสร้างขึ้นในรหัสที่ถูกเพิ่มอย่างถาวร

ไม่มีใครรู้วิธีเพิ่มอย่างถาวรไปยังเครื่องอื่นเช่นกัน?


1
ตัวแทนควรจะชั่วคราวเท่านั้น แต่มันเป็นไปได้ที่คุณจะมีคำสั่ง ssh-add ที่ใดที่หนึ่งใน ~ / .bashrc หรืออย่างใดอย่างหนึ่งของทั้งสองเครื่อง
mirek

คำตอบ:


632

วิธีแก้ไขคือการบังคับให้เก็บไฟล์สำคัญไว้อย่างถาวรโดยเพิ่มลงใน~/.ssh/configไฟล์ของคุณ:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

หากคุณไม่มีไฟล์ 'config' ในไดเรกทอรี ~ / .ssh คุณควรสร้างไฟล์ขึ้นมา ไม่จำเป็นต้องมีสิทธิ์รูทดังนั้น:

nano ~/.ssh/config

... และป้อนบรรทัดด้านบนตามความต้องการของคุณ

สำหรับการทำงานความต้องการของไฟล์ที่จะมี chmod 600 chmod 600 ~/.ssh/configคุณสามารถใช้คำสั่ง

หากคุณต้องการให้ผู้ใช้ทุกคนในคอมพิวเตอร์ใช้รหัสให้ใส่บรรทัดเหล่านี้/etc/ssh/ssh_configและกุญแจในโฟลเดอร์ที่ทุกคนสามารถเข้าถึงได้

นอกจากนี้หากคุณต้องการตั้งค่าคีย์เฉพาะสำหรับโฮสต์หนึ่งคุณสามารถทำสิ่งต่อไปนี้ใน ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

สิ่งนี้มีข้อได้เปรียบเมื่อคุณมีข้อมูลเฉพาะตัวมากมายที่เซิร์ฟเวอร์ไม่ปฏิเสธคุณเพราะคุณลองใช้ข้อมูลประจำตัวที่ไม่ถูกต้องก่อน เฉพาะข้อมูลเฉพาะที่จะลอง


82
สิทธิ์ในไฟล์ปรับแต่งควรเป็น 600chmod 600 config
generalopinion

6
ฉันต้องใส่รหัสผ่านของฉันทุกครั้งที่กดดึงหรือโคลนด้วยวิธีนี้ฉันจะหลีกเลี่ยงได้อย่างไร
Asaf

9
ใช้แทนssh-add ~/.ssh/gitHubKeyมันจะจดจำข้อความรหัสผ่านที่สำคัญของคุณ ทางออกที่ฉันเสนอคือตั้งไว้อย่างถาวรตลอดการรีบูต
daminetreg

28
คำตอบนี้ดีมากที่ไม่ควรมี ssh-add ใครอยากมีคำสั่งที่ "ชั่วคราว" แก้ไขปัญหาและหยุดพักโดยไม่คาดคิดเมื่อคุณสามารถแก้ไขไฟล์กำหนดค่าได้อย่างถาวร
RussellStewart

2
ปัญหาคือการกำหนดค่าประเภทนี้หากคุณไม่ได้ทำใน. ssh / config สำหรับโฮสต์ที่เฉพาะเจาะจงคุณจะได้รับกุญแจทั้งหมดสำหรับเซิร์ฟเวอร์ทุกครั้ง
daminetreg

118

สิ่งนี้ไม่ได้ตอบปัญหาเดียวกันสำหรับฉันภายใต้ Mac OS X Lion ฉันสิ้นสุดการเพิ่ม:

ssh-add ~/.ssh/id_rsa &>/dev/null

ถึง. zshrc ของฉัน (แต่. profile ก็ใช้ได้เช่นกัน) ซึ่งดูเหมือนว่าจะแก้ไขแล้ว

(ตามที่แนะนำไว้ที่นี่: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )


6
นี่คือฉันคิดว่าดีกว่าโซลูชันที่ฉันเสนอเนื่องจาก ssh-add ใช้ตัวแทนการรับรองความถูกต้องซึ่งสามารถจดจำวลีรหัสผ่านของคีย์ส่วนตัวที่มีการป้องกันเพื่อให้คุณไม่จำเป็นต้องพิมพ์ทุกครั้งที่คุณพยายามรับรองความถูกต้อง ข้อดีอีกอย่างของโซลูชันที่คุณเสนอคือถ้าคุณมีคีย์จำนวนมากไคลเอ็นต์ ssh จะไม่เสนอคีย์ที่ไม่เกี่ยวข้องกับเซิร์ฟเวอร์ที่คุณพยายามเชื่อมต่อด้วยแน่นอนว่ามันจะให้เฉพาะคีย์ที่ใช้สำหรับเซิร์ฟเวอร์นี้และจะได้รับ ' ไม่นำไปสู่เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่อเนื่องจากมีการเข้าถึง MaxAuthTries ในขณะที่พยายามใช้คีย์ทั้งหมดที่แสดงรายการใน ssh / config
daminetreg

1
ขอบคุณ @daminetreg ปัญหาเฉพาะของฉันคือต้องเข้าถึง gitosis บนเครื่องพัฒนาโดยไม่ต้องโอนคีย์ส่วนตัวของฉันไป โซลูชันนี้ (รวมForwardAgent yesถึงการเพิ่มของฉัน.ssh/config) แก้ไขปัญหานั้นได้อย่างน่าอัศจรรย์ เมื่อปรากฎว่ามันอาจssh-add &>/dev/nullเป็นพฤติกรรมเริ่มต้นของการssh-addปรากฏขึ้นเพื่อเพิ่มคีย์ที่พบใน.sshโฟลเดอร์ของคุณ
แอรอน

1
ความเข้าใจของฉันคือว่ามีสวิตช์ -K ใน Mac OS: stackoverflow.com/questions/1909651/…
Nicu Tofan

3
@TNick -Kเพิ่มคีย์ให้กับพวงกุญแจของ OS X ซึ่ง OS X GUIs ใช้ในการตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ต่างประเทศ โปสเตอร์ใน Q นั้นกำลังเชื่อมต่อผ่าน SSH Tunnel แต่ยังคงเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล A - [SSH Tunnel] -> B กรณีที่ฉันอยู่คือฉันอยู่บนเซิร์ฟเวอร์ระยะไกล แต่ต้องการให้มีการตรวจสอบสิทธิ์กับข้อมูลประจำตัวในระบบที่บ้านของฉัน A <- [Auth] - B - [เชื่อมต่อ] -> C ดังนั้น-Kจริงๆแล้วไม่ได้ช่วย แต่เป็นทางออกที่ดีสำหรับ Q. อื่น ๆ
Aaron

112

ฉันแก้ไขปัญหานั้นบน Mac OSX (10.10) โดยใช้ตัวเลือก -K สำหรับ ssh-add:

ssh-add -K ~/.ssh/your_private_key

สำหรับ macOS 10.12 และใหม่กว่าคุณจะต้องแก้ไขการกำหนดค่า ssh เพิ่มเติมดังที่อธิบายไว้ที่นี่: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain


3
นี่เป็นคำตอบที่ดีกว่าสำหรับผู้ที่ต้องการตั้งไว้อย่างถาวร
punkrockpolly

12
ดังนั้นบิตนี้: "บน Mac OSX (10.10)" ...
Andrew K.

1
นี่เป็นสิ่งที่ดีและทำงานบน Mac OSX ได้ แต่ไม่ทำงานบน Ubuntu (14.04 กับการทดสอบของฉัน)
haxpor

5
สิ่งนี้ไม่ได้ผลสำหรับฉัน (บน OSX 10.12.4)
guptron

2
ตามman ssh-addmacOS High Sierra ssh-add -Kจะบันทึกข้อความรหัสผ่านลงในพวงกุญแจและหลังจากรีบูตเครื่องให้ใช้งานssh-add -Aซึ่งไม่ต้องการให้คุณป้อนข้อความรหัสผ่านของคุณ
DawnSong

36

เพียงแค่เพิ่มพวงกุญแจดังที่อ้างอิงในเคล็ดลับด่วนของ Ubuntu https://help.ubuntu.com/community/QuickTips

อะไร

แทนที่จะเริ่มต้น ssh-agent และ ssh-add อย่างต่อเนื่องคุณสามารถใช้ keychain เพื่อจัดการคีย์ ssh ของคุณ ในการติดตั้ง Keychain คุณสามารถคลิกที่นี่หรือใช้ Synaptic เพื่อทำงานหรือรับ apt-get จากบรรทัดคำสั่ง

บรรทัดคำสั่ง

อีกวิธีในการติดตั้งไฟล์คือการเปิดเทอร์มินัล (Application-> Accessories-> Terminal) และพิมพ์:

sudo apt-get install keychain

แก้ไขไฟล์

จากนั้นคุณควรเพิ่มบรรทัดต่อไปนี้ใน $ {HOME} /. bashrc หรือ /etc/bash.bashrc ของคุณ:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh

คำสั่งที่สองทำในสิ่งที่แน่นอนจากความอยากรู้? เพียงแค่เปิดสิทธิ์ให้กับผู้ใช้ปัจจุบัน?
Vincent Buscarello

1
นี่.คือนามแฝงสำหรับsource
แบรดโซโลมอน

18

ฉันลองใช้วิธีแก้ปัญหาของ @ Aaron และมันก็ไม่ได้ผลสำหรับฉันเพราะมันจะเพิ่มกุญแจของฉันทุกครั้งที่ฉันเปิดแท็บใหม่ในเทอร์มินัลของฉัน ดังนั้นฉันจึงแก้ไขมันเล็กน้อย (โปรดทราบว่าคีย์ของฉันส่วนใหญ่มีการป้องกันด้วยรหัสผ่านด้วยดังนั้นฉันจึงไม่สามารถส่งออกไปยัง / dev / null ได้):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

สิ่งนี้ไม่สามารถที่จะตรวจสอบการส่งออกของssh-add -l(ซึ่งแสดงคีย์ทั้งหมดที่ได้รับการเพิ่ม) ssh-addสำหรับคีย์ที่เฉพาะเจาะจงและถ้ามันไม่พบมันแล้วมันจะเพิ่มความมันด้วย

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

เนื่องจากฉันมีพวงกุญแจฉันจึงเก็บเอาท์พุทของssh-add -lตัวแปรเพื่อปรับปรุงประสิทธิภาพ (อย่างน้อยฉันคิดว่ามันช่วยปรับปรุงประสิทธิภาพ :))

PS: ฉันอยู่ใน linux และรหัสนี้ไปที่~/.bashrcไฟล์ของฉัน- ถ้าคุณอยู่ใน Mac OS X ฉันคิดว่าคุณควรเพิ่ม.zshrcหรือ.profile

แก้ไข: ตามที่ @Aaron ชี้ให้เห็นในความคิดเห็น.zshrcไฟล์จะถูกใช้จากzshเชลล์ - ดังนั้นหากคุณไม่ได้ใช้ (ถ้าคุณไม่แน่ใจว่าเป็นไปได้มากว่าคุณกำลังใช้bashแทน) รหัสนี้ควร ไปที่.bashrcไฟล์ของคุณ


3
.zshrcมีไว้สำหรับเปลือกซึ่งผมใช้แทนzsh bashหากคุณใช้งานbashบน Mac OS X (ค่าเริ่มต้น) ก็จะ.bashrcมีเช่นกัน
แอรอน

1
หลังจากssh-add -lส่งคืนรหัสecho $?สามารถใช้ในการตัดสินใจว่าจะเพิ่มรหัสหรือไม่ ฉันใช้เครื่อง linux ของฉันพร้อมกับทุบตีssh-add -lจะไม่ส่งชื่อไฟล์ที่สำคัญ โค้ดส่งคืนใช้ได้เสมอ
Bharat G

12

ในกรณีของฉันการแก้ปัญหาคือ:

สิทธิ์ในไฟล์กำหนดค่าควรเป็น 600 chmod 600 config

ตามที่ระบุไว้ในความคิดเห็นข้างต้นโดย generalopinion

ไม่จำเป็นต้องแตะเนื้อหาของไฟล์กำหนดค่า


ไม่เพียงพอสำหรับฉันใน Linux Mint 17.1
Benares

ฉันไม่คิดว่า 600 มีเหตุผล man sshบอกเราว่า~/.ssh/configไฟล์อ่าน / เขียนสำหรับผู้ใช้และไม่สามารถเขียนได้โดยผู้อื่น
DawnSong

600 เป็นแบบอ่านและเขียนสำหรับผู้ใช้เท่านั้น
Enthusiasmus

6

ฉันมีปัญหาเดียวกันบน Ubuntu 16.04: มีการเพิ่มปุ่มบางปุ่มอย่างถาวรสำหรับคนอื่น ๆ ที่ฉันต้องเรียกใช้งานssh-addในทุกครั้ง ฉันพบว่ากุญแจที่เพิ่มอย่างถาวรมีทั้งกุญแจส่วนตัวและกุญแจสาธารณะที่ตั้งอยู่ใน~/.sshและกุญแจที่ถูกลืมในทุกครั้งมีเฉพาะกุญแจส่วนตัวใน~/.sshdir ดังนั้นวิธีการแก้ปัญหาเป็นเรื่องง่าย: คุณควรคัดลอกทั้งที่สำคัญภาครัฐและเอกชนในการก่อนที่จะดำเนิน~/.sshssh-add

PS:เท่าที่ฉันเข้าใจจากGnome wikiวิธีการของฉันทำงานได้ด้วยเครื่องมือ gnome-keyring ซึ่งเป็นส่วนหนึ่งของ Gnome Desktop Environment ดังนั้นวิธีการของฉันอาจจะใช้ได้ก็ต่อเมื่อคุณใช้ Gnome หรือ Gnome-based DE


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

Flarkin สุดยอด! งานนักสืบที่ยอดเยี่ยม ฉันไม่คิดว่าฉันจะหาสิ่งนี้ได้
nicorellius

4

การเพิ่มบรรทัดต่อไปนี้ใน "~ / .bashrc" ช่วยแก้ปัญหาให้ฉัน ฉันใช้ Ubuntu 14.04 เดสก์ท็อป

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"

3

บน Ubuntu 14.04 (อาจจะเร็วกว่านี้) คุณไม่จำเป็นต้องใช้คอนโซล:

  • เริ่มต้นseahorseหรือเปิดสิ่งที่คุณค้นหาด้วยการค้นหา "กุญแจ"
  • สร้างคีย์ SSH ที่นั่น (หรือนำเข้าหนึ่ง)
    • ไม่จำเป็นต้องปล่อยให้ข้อความรหัสผ่านว่างเปล่า
    • มันเสนอให้คุณแม้แต่กดรหัสสาธารณะไปยังเซิร์ฟเวอร์ (หรือมากกว่า)
  • คุณจะจบลงด้วยการเรียกใช้ ssh-agent และคีย์นี้ถูกโหลด แต่ถูกล็อค
  • การใช้sshจะดึงข้อมูลประจำตัว (เช่นคีย์) ผ่านตัวแทน
  • เมื่อใช้ครั้งแรกในช่วงเซสชั่นข้อความรหัสผ่านจะถูกตรวจสอบ
    • และคุณมีตัวเลือกในการปลดล็อคกุญแจโดยอัตโนมัติเมื่อเข้าสู่ระบบ
    • นี่หมายความว่าการเข้าสู่ระบบจะใช้ในการตัดข้อความรหัสผ่านของคีย์
  • หมายเหตุ: หากคุณต้องการส่งต่อตัวตนของคุณ (เช่นการส่งต่อตัวแทน) เรียกใช้ของคุณsshด้วย-Aหรือทำให้เป็นค่าเริ่มต้น
    • ไม่เช่นนั้นคุณจะไม่สามารถตรวจสอบสิทธิ์ด้วยคีย์นั้นในเครื่องที่คุณลงชื่อเข้าใช้ในภายหลังไปยังเครื่องที่สาม

3

ฉันเรียกใช้ Ubuntu โดยใช้คีย์ id_rsa สองอัน (หนึ่งส่วนบุคคลสำหรับการทำงาน) ssh-add จะจดจำรหัสเดียว (ส่วนบุคคล) และลืมรหัส บริษัท ทุกครั้ง

ตรวจสอบความแตกต่างระหว่างสองฉันเห็นกุญแจส่วนตัวของฉันมี 400 สิทธิ์ในขณะที่ บริษัท หนึ่งมี 600 สิทธิ (มี u + w) การลบผู้ใช้เขียนจากคีย์ บริษัท (uw หรือตั้งค่าเป็น 400) แก้ไขปัญหาของฉันได้ ssh-add ตอนนี้จดจำทั้งสองคีย์



1

ง่ายมาก ^ _ ^ สองขั้นตอน

1. ติดตั้งพวงกุญแจ

2. เพิ่มรหัสด้านล่างเป็น. bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh

12
Ubuntu ไม่มียำโง่;)
Adam F

1

สำหรับผู้ที่ใช้เปลือกปลาคุณสามารถใช้ฟังก์ชั่นต่อไปแล้วเรียกมันว่าในหรือในแฟ้มการกำหนดค่าที่แยกต่างหากใน~/.config/fish/config.fish ~/.config/fish/conf.d/loadsshkeys.fishมันจะโหลดคีย์ทั้งหมดที่เริ่มต้นด้วยid_rsassh-agentเข้าไปใน

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

หากคุณต้องการssh-agentเริ่มต้นอัตโนมัติเมื่อคุณเปิดเทอร์มินัลคุณสามารถใช้tuvistavie / fish-ssh-agentเพื่อทำสิ่งนี้

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