คุณจะคัดลอกกุญแจสาธารณะไปยังเซิร์ฟเวอร์ ssh ได้อย่างไร?


33

นี่คือสิ่งที่ฉันได้ลองและฉันพบข้อผิดพลาด:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

ทำไมไม่ทำสองขั้นตอนล่ะ? คัดลอกมาแล้วต่อท้าย?
Faheem Mitha

@FaheemMitha: ได้ผลขอบคุณ! จริง ๆ แล้วฉันอาจตระหนักถึงสาเหตุของปัญหา โปรดดูโพสต์ใหม่ของฉัน ?
ทิม

ด้วยพารามิเตอร์ -f คุณไม่จำเป็นต้องใช้คีย์ส่วนตัวดังนั้นคุณสามารถส่งคีย์ให้พวกเขาด้วยกุญแจสาธารณะของใครบางคนเท่านั้น!
Kzqai

คำตอบ:


67

OpenSSH มาพร้อมกับคำสั่งเพื่อทำสิ่งนี้, ssh-copy-id. คุณเพียงแค่ให้ที่อยู่ระยะไกลและมันจะเพิ่มกุญแจสาธารณะของคุณไปยังauthorized_keysไฟล์บนเครื่องระยะไกล:

$ ssh-copy-id tim@just.some.other.server

คุณอาจต้องใช้การ-iตั้งค่าสถานะเพื่อค้นหากุญแจสาธารณะของคุณบนเครื่องท้องถิ่นของคุณ:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
ขอบคุณ! ทำไมคำสั่งของฉันไม่ทำงาน
ทิม

@Tim คำตอบนี้อธิบายมัน; >>ถูกจัดการโดยเชลล์ของคุณและคุณกำลังเรียกใช้คำสั่งผ่าน SSH แทนการใช้เชลล์ การแก้ไขให้ SSH เรียกใช้เชลล์ซึ่งจะรันคำสั่งของคุณควรจะทำงาน
Michael Mrozek

ขอบคุณ! (1) ssh-copy-id ไม่ทำงานเช่นกัน ฉันคัดลอกไฟล์ไปยังรีโมตด้วยตนเองและต่อท้ายเนื้อหาจากนั้นทำงาน ฉันสงสัยว่าทำไมนี้ ฉันพบว่าเชลล์เริ่มต้นของฉันบนเซิร์ฟเวอร์เป็นสคริปต์ซึ่งฉันอัปเดตเป็นโพสต์ดั้งเดิมของฉันและอาจเป็นเหตุผล กรุณาดู (2) ฉันสงสัยว่า ssh-copy-id เป็นเพียงแค่คัดลอกกุญแจสาธารณะไปยังรีโมทแล้วมันไม่ได้สร้างกุญแจส่วนตัวและกุญแจสาธารณะใช่มั้ย
ทิม

1
สมมติว่าเซิร์ฟเวอร์ SSH ได้รับการกำหนดค่าในลักษณะที่จะยอมรับการรับรองความถูกต้องของรหัสสาธารณะเป็นกลไกการตรวจสอบสิทธิ์เท่านั้น ในกรณีนี้การใช้ssh-copy-idจะไม่ทำงานใช่ไหม
Abdull

1
@Abdull ไม่เว้นแต่คุณจะมีคีย์อื่น ๆ บนเครื่องที่จะเชื่อมต่อด้วย เป็นเพียงการเชื่อมต่อผ่าน SSH
Michael Mrozek

31

คุณสามารถทำสิ่งนี้ได้เสมอ:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

ฉันไม่แน่ใจว่าคุณสามารถcatจากเครื่องท้องถิ่นไปยังเซสชัน ssh เพียงแค่ย้ายไปที่ / tmp ตามที่แนะนำ

แก้ไข: ตรงนี้เป็นสิ่งที่ssh-copy-idไม่ เหมือนกับที่ไมเคิลพูด


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

ไม่มันไม่ได้สร้างมันขึ้นมา เพียงเพิ่ม
Mr. Monkey

@ Mr.Monkey ใช่คุณสามารถไพพ์ข้อมูลลงในเซสชัน ssh (จากcatหรืออย่างอื่น) สิ่งที่คุณอธิบายเป็นวิธีที่ล้าสมัย; ssh-copy-idขอแนะนำเนื่องจากมีความเสี่ยงน้อยกว่าการพิมพ์ผิดหรือให้สิทธิ์ไฟล์ผิด
Gilles 'หยุดความชั่วร้าย'

@Gilles คุณไม่สามารถเข้าถึงเซิร์ฟเวอร์ไปยังไคลเอนต์ได้เสมอโดยเฉพาะอย่างยิ่งเมื่อคุณเตรียมคอมพิวเตอร์สำหรับการทำงานดังนั้นวิธีนี้ดีกว่าการใช้ ssh-cpy-id มากเพราะคุณไม่จำเป็นต้องใช้อุปกรณ์หรือ เชื่อมต่อกับเครือข่ายก่อนการตั้งค่า
e-info128

1
หรือคุณสามารถเพียงแค่ท่อโดยตรงไปยังปลายทางcat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys' :
Pablo

7

คำตอบนี้อธิบายวิธีทำให้วิธีที่ต้องการในคำถามทำงานได้

คุณสามารถดำเนินการเชลล์บนคอมพิวเตอร์ระยะไกลเพื่อตีความความหมายพิเศษของ>>โอเปอเรเตอร์การเปลี่ยนเส้นทาง:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

ผู้ประกอบการเปลี่ยนเส้นทาง >>ปกติแล้วจะถูกตีความโดยเชลล์

เมื่อคุณดำเนินการssh host 'command >> file'แล้วจะไม่รับประกันว่าcommand >> fileจะถูกตีความโดยเชลล์ ในกรณีของคุณcommand >> fileจะถูกดำเนินการแทนเชลล์โดยไม่มีการตีความพิเศษและ>>ถูกกำหนดให้กับคำสั่งเป็นอาร์กิวเมนต์ - เช่นเดียวกับที่ทำงานcommand '>>' fileในเชลล์

SSH บางเวอร์ชัน (OpenSSH_5.9) จะเรียกใช้เชลล์บนรีโมตเซิร์ฟเวอร์โดยอัตโนมัติและส่งคำสั่งไปยังเชลล์เมื่อตรวจพบโทเค็นที่ถูกตีความโดยเชลล์เช่น; > >>ฯลฯ


3

opensshssh-copy-idไม่ให้ ลำดับจะเป็น:

  • สร้างคีย์ 4k ที่เหมาะสม

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • เริ่มต้น ssh-agent ของคุณและดูดข้อมูลเช่นSSH_AGENT_PIDฯลฯ

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • ตอนนี้เริ่มโหลดกุญแจเข้าสู่ตัวแทน SSH ของคุณ

    ssh-add ~/.ssh/id_rsa4k
    
  • ตรวจสอบว่ามีการโหลด

    ssh-add -l
    ssh-add -L
    

    นี่จะแสดงสิ่งที่คุณมีใน ssh-agent

  • ตอนนี้ SSH จริงกับระบบระยะไกล

    ssh username@remotehost.network
    
  • ตอนนี้คุณสามารถรัน ssh-copy-id โดยไม่มีอาร์กิวเมนต์:

    ssh-copy-id
    

    สิ่งนี้สร้าง~/.ssh/authorized_keysและเติมข้อมูลพื้นฐานที่จำเป็นจาก ssh-agent


BTW ฉันสร้างสคริปต์ขนาดเล็กที่github.com/centic9/generate-and-send-ssh-keyซึ่งใช้งานขั้นตอนส่วนใหญ่เหล่านี้ในครั้งเดียวและช่วยให้มั่นใจว่าสิทธิ์ของไฟล์ / ไดเรกทอรีซึ่งมักทำให้ฉันปวดหัว ...
centic

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

1

ฉันมีปัญหากับ ssh-copy-id เมื่อเลือกพอร์ตอื่นมากกว่า 22 ... ดังนั้นนี่คือ oneliner ของฉันที่มี ssh-port อื่น (เช่น 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

แท้จริงthe ssh-copy-idคำสั่งไม่ตรงนี้ (จากopenssh-clientแพคเกจ):

ssh-copy-id user@host

หมายเหตุ:
hostหมายถึงที่อยู่ IPหรือโดเมน


ฉันต้องการเพิ่มข้อมูลเพิ่มเติมให้กับสิ่งนี้

1) เราสามารถระบุพอร์ตอื่นสำหรับ SSH บนเซิร์ฟเวอร์ปลายทาง:

ssh-copy-id "-p 8127 user@host"

หมายเหตุ: พอร์ตจะต้องอยู่ในด้านหน้าของหรือมันจะไม่แก้ไข
user@host

แหล่ง

2) เราสามารถระบุไฟล์ด้วยพับลิกคีย์ :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

หมายเหตุ:
-iตัวเลือกที่ช่วยให้เราสามารถระบุตำแหน่งที่เหมาะสมของชื่อกับไฟล์ที่มีคีย์สาธารณะ

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

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