วิธีที่ง่ายที่สุดในการคัดลอกคีย์ ssh ไปยังเครื่องอื่น?


342

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

ฉันกำลังมองหาวิธีที่ง่ายที่สุดและแนะนำในการคัดลอกคีย์ทับหวังว่าจะมี wrapper ความสะดวกบางแห่งในแพ็คเกจ ssh ของ Ubuntu หรือไม่

ฉันรู้แล้วว่าจะปิดการเข้าสู่ระบบด้วยรหัสผ่านได้อย่างไร


คำตอบ:


463

ssh-copy-idคำสั่ง (ในopenssh ลูกค้าแพคเกจและติดตั้งโดยค่าเริ่มต้น) ไม่ตรงนี้:

ssh-copy-id user@hostname.example.com

คัดลอกกุญแจสาธารณะของตัวตนเริ่มต้นของคุณ (ใช้-i identity_fileสำหรับตัวตนอื่น ๆ ) ไปยังโฮสต์ระยะไกล

ข้อมูลเฉพาะตัวเริ่มต้นคือคีย์ "ssh" มาตรฐานของคุณ ประกอบด้วยสองไฟล์ (คีย์ภาครัฐและเอกชน) ของคุณใน~/.sshไดเรกทอรีชื่อตามปกติidentity, id_rsa, id_dsa, id_ecdsaหรือid_ed25519(และเช่นเดียวกันกับการ.pub) ทั้งนี้ขึ้นอยู่กับชนิดของคีย์ หากคุณไม่ได้สร้างคีย์ ssh มากกว่าหนึ่งคีย์คุณไม่ต้องกังวลกับการระบุตัวตน ssh-copy-id จะเลือกโดยอัตโนมัติ

ssh-keygenในกรณีที่คุณไม่ได้มีตัวตนคุณสามารถสร้างเป็นหนึ่งเดียวกับเครื่องมือ

นอกจากนี้หากเซิร์ฟเวอร์ใช้พอร์ตที่แตกต่างจากค่าเริ่มต้นหนึ่ง ( 22) คุณควรใช้เครื่องหมายคำพูดด้วยวิธีนี้ ( แหล่งที่มา ):

ssh-copy-id "user@hostname.example.com -p <port-number>"

1
ตัวตนเริ่มต้นคืออะไร?
Oxwivi

17
สำหรับพอร์ตอื่นให้ใช้สิ่งนี้:ssh-copy-id "user@host -p 6842"
jibon57

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

10
ใน mac คุณสามารถทำbrew install ssh-copy-idและเรียกใช้คำสั่ง
Avishai

1
@MarcelStimberg โปรดอัปเดตคำตอบเพื่อรวมโปรไฟล์ -i; คนน่าจะมีมากกว่า 1 คีย์และผลักดันพวกเขาทั้งหมดหรือต้องตามหาตัวเลือก -i ในความคิดเห็น
Nick

129

ฉันชอบคำตอบจาก Marcel ฉันไม่ทราบคำสั่งนี้ ฉันใช้สิ่งที่ฉันพบในเว็บไซต์ Oracle มาตลอด :

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'

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

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

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys && echo "Key copied"'

2
คำสั่งที่แน่นอนนี้สามารถทำงานได้จาก Mac เช่นกัน
Mihai P.

มันควรจะทำงานภายใต้ระบบยูนิกซ์ที่มีเชลล์ส่วนใหญ่ ฉันอัปเดตโพสต์ด้วยคำสั่งที่อัปเดตแล้วในกรณีที่โฟลเดอร์.sshไม่มีอยู่บนฝั่งระยะไกล
Huygens

1
catไม่จำเป็น - เปลี่ยนเส้นทางการป้อนข้อมูลตามปกติก็พอเช่น< ~/.ssh/id_rsa.pub | ssh ...
maxschlepzig

@Huygens ขอบคุณ มีประโยชน์มากกว่าที่จะจำอันนี้เพราะคุณไม่จำเป็นต้องติดตั้งอะไรและมันก็ดีสำหรับการรันคำสั่งต่างประเทศเช่นการเปลี่ยนการอนุญาตฝั่งเซิร์ฟเวอร์ตามที่คุณแสดงในตัวอย่างขั้นสูงของคุณ
Jonathan Komar

2
ฉันชอบวิธีนี้มากกว่าเพราะช่วยให้คุณใช้ verbose ssh ซึ่งมีประโยชน์ในการหาสาเหตุที่สิ่งต่าง ๆ แตก sshcopyid แค่แข็งและไม่เคยทำงาน
ไซเรน

31

วิธีการแบบกราฟิก

  1. เปิดโปรแกรมรหัสผ่านและคีย์ ▸ คีย์ส่วนตัวของฉัน
  2. เลือกที่สำคัญของคุณและจากนั้นคลิกระยะไกล ▸ กำหนดค่าที่สำคัญสำหรับการรักษาความปลอดภัยของเชลล์

ตั้งค่าคอมพิวเตอร์สำหรับการเชื่อมต่อ SSH


ฉันไม่มี "รหัสผ่านและคีย์เข้ารหัส" ในเมนูของฉัน
Jorge Castro

คุณใช้ Ubuntu รุ่นใดอยู่? ใน Ubuntu 10.04 LTS สิ่งนี้ควรมีให้โดยปริยาย
ændrük

10.10 เพิ่งเพิ่มแท็ก คำตอบของ Marcel คือสิ่งที่ฉันกำลังมองหา แต่ +1 สำหรับคำตอบเชิงเดสก์ทอปของคุณ!
Jorge Castro

4
seahorseโปรแกรมนี้เป็น
Gilles

1
ฉันคิดว่าแอปพลิเคชันนี้อยู่ในเมนู System-> Preferences ใน 10.10 (ไม่สามารถตรวจสอบได้ตอนนี้ฉันใช้เวลา 10.04)
Huygens

18

บน Ubuntu คุณสามารถดึงกุญแจได้จาก Launchpad:

ssh-import-id [launchpad account name]

รายละเอียด :

  1. คุณต้องมีบัญชี Launchpad เพื่อลงชื่อเข้าใช้หรือสร้างบัญชี
  2. หลังจากเข้าสู่ระบบคลิกที่ปุ่มถัดจากคีย์ SSH:
  3. วางเนื้อหาของไฟล์กุญแจสาธารณะของคุณในฟิลด์นั้น (รวมถึงความคิดเห็น) กุญแจสำคัญดูเหมือนว่า:

    ssh-rsa AAAAB3Nza .... UyDOFDqJp lekensteyn
    

    ที่นี่ssh-rsaระบุว่าคีย์เป็นคีย์ RSA AAAAB3Nza .... UyDOFDqJpเป็นคีย์จริงและlekensteynเป็นความคิดเห็น

  4. บันทึกคีย์โดยกดนำเข้าคีย์สาธารณะ
  5. หากทุกอย่างไปด้วยดีตอนนี้คีย์ของคุณควรจะอยู่ในรายการภายใต้คีย์ SSH:

แพคเกจssh-import-idจะต้องติดตั้งบนเครื่องซึ่งจะต้องสามารถเข้าถึงได้จากระยะไกล แพคเกจนี้มีการติดตั้งพร้อมกับแพคเกจที่เป็นแพคเกจแนะนำสำหรับopenssh-server openssh-serverหลังจากตรวจสอบให้แน่ใจว่าssh-import-idได้รับการติดตั้งบนเครื่องไคลเอ็นต์ให้รัน:

ssh-import-id [launchpad account name]

สิ่งนี้จะดาวน์โหลดกุญแจสาธารณะจากเซิร์ฟเวอร์ Launchpad ผ่าน HTTPS ซึ่งปกป้องคุณจากการโจมตีของ MITM

บน Ubuntu Lucid และก่อนหน้านี้คุณสามารถทำสิ่งเดียวกันกับ:

wget https://launchpad.net/~[lp acount name]/+sshkeys -O - >> ~/.ssh/authorized_keys && echo >> ~/.ssh/authorized_keys

echoคำสั่งเป็นสิ่งจำเป็นที่จะได้รับการขึ้นบรรทัดใหม่พิเศษหลังจากบรรทัดที่มีคีย์จุ๊


14

สำหรับพอร์ตที่กำหนดเอง

ssh-copy-id -i "user@hostname.example.com -p2222"

-i สวิตช์เริ่มต้นที่ ~ / .ssh / id_rsa.pub หากคุณต้องการคีย์อื่นให้ใส่พา ธ ของคีย์หลังจาก -i

คำเตือน:หากคุณไม่ได้เขียน -i มันจะคัดลอกกุญแจทั้งหมดของคุณที่พบใน ~ / .ssh


1
คุณแน่ใจเกี่ยวกับคำเตือนนั้นหรือไม่ "-i identity_file - ใช้เฉพาะคีย์ที่มีอยู่ใน identity_file (แทนที่จะค้นหา identities ผ่าน ssh-add (1) หรือใน default_ID_file) หากชื่อไฟล์ไม่ได้ลงท้ายด้วย. pub สิ่งนี้จะถูกเพิ่มหากชื่อไฟล์นั้น ถูกละเว้นจะใช้ default_ID_file "
Yousha Aleayoub

0

ssh-copy-idทำอย่างนั้น ฉันไม่แน่ใจว่าทำไมคำตอบอื่น ๆ ที่นี่เพิ่มข้อมูลที่ไม่ถูกต้อง ความช่วยเหลือแสดงดังต่อไปนี้:

~$ ssh-copy-id -h
Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
    -f: force mode -- copy keys without trying to check if they are already installed
    -n: dry run    -- no keys are actually copied
    -h|-?: print this help

ฉันลองทำสิ่งต่อไปนี้บนไคลเอนต์ Ubuntu 18.04 กับเซิร์ฟเวอร์ CentOS 7.6 และมันทำงานได้อย่างมีเสน่ห์ ตัวอย่างแสดงการใช้พอร์ตที่กำหนดเอง2222และระบุคีย์สาธารณะที่~/.ssh/path-to-rsa.pub

$ ssh-copy-id -i ~/.ssh/path-to-rsa.pub -p 2222 myusername@hostname.tld

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

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