ssh-keygen อัตโนมัติโดยไม่มีข้อความรหัสผ่านเป็นอย่างไร


86

ฉันต้องการสร้างสคริปต์อัตโนมัติที่โทรออกssh-keygenและสร้างคู่คีย์ผับ / ส่วนตัวที่ฉันจะใช้ในภายหลัง ในหลักการทุกอย่างทำงานได้ดีกับ ....
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
... ยกเว้นว่ามันจะถามฉันสำหรับวลีรหัสผ่านที่จะเข้ารหัสคีย์ สิ่งนี้ทำให้ - ปัจจุบัน - อัตโนมัติยาก

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

ทางออกที่ดีที่สุดสำหรับปัญหานี้คืออะไร

-qตัวเลือกซึ่งคาดว่าหมายถึง "ที่เงียบสงบ / เงียบ" ไม่ยังไม่หลีกเลี่ยงการมีปฏิสัมพันธ์วลีรหัสผ่าน นอกจากนี้ฉันไม่พบสิ่งนี้
ssh-keygen ...... -q --no-passphrase

โปรดอย่าเริ่มเทศนาเกี่ยวกับหรือบรรยายให้ฉันถึงข้อดีข้อเสียของ "ข้อความรหัสผ่านที่หายไป" ฉันรู้แล้ว ในรูปแบบโต้ตอบ (ไม่ใช่สคริปต์) ผู้ใช้สามารถกด [ENTER] สองครั้งและคีย์จะถูกบันทึกเป็นข้อความธรรมดา นี่คือสิ่งที่ฉันต้องการบรรลุในสคริปต์เช่นนี้:

#! / bin / ทุบตี

Command1
Command2
var = $ (Command3)

# นี่ไม่ควรหยุดสคริปต์และขอรหัสผ่าน
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

คำตอบ:


105

วิธีนี้จะป้องกันไม่ให้ข้อความรหัสผ่านปรากฏขึ้นและตั้งค่าคีย์คู่ให้เก็บไว้ในข้อความธรรมดา (ซึ่งแน่นอนว่ามีข้อเสียและความเสี่ยงทั้งหมด):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""

3
วิธีนี้ใช้ได้ผล ในกรณีที่/tmp/sshkeyมีอยู่แล้วคนหนึ่งจะได้รับพรอมต์เขียนทับ นี้สามารถป้องกันได้ผ่านการเปลี่ยนเส้นทาง / stdin ปิด - 0>&-เช่นผ่านทางเพิ่ม
maxschlepzig

34

วิธีที่ง่ายที่สุดที่ฉันพบในการทำสิ่งที่คุณต้องการคือ (ตัวอย่างเช่นการใช้ชื่อไฟล์เริ่มต้น)

    cat /dev/zero | ssh-keygen -q -N ""

หาก~/.ssh/id_rsaไฟล์มีอยู่แล้วคำสั่งจะออกโดยไม่แก้ไขอะไรเลย

ถ้าไม่คุณจะได้รับรหัสใหม่ในชื่อไฟล์นั้น

ไม่ว่าจะด้วยวิธีใดคุณไม่ได้เขียนทับอะไรเลยและคุณรู้ว่าท้ายที่สุดคุณมีกุญแจ


ยืนยัน: ใน lubuntu 14.04.2
user77115

ถ้าคุณอยากที่มันเงียบ, ท่อส่งออกไป / dev / null:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
คริสเกร็ก

เปิด (โบราณยอมรับ) SLES 11 คำสั่งด้านบนไม่สามารถสร้างรหัสได้ yes "" | ssh-keygen -N "" >&- 2>&-ทำงานได้ดี แต่ไม่สามารถส่งออกอะไรได้ (ไม่ว่าจะมีไฟล์คีย์อยู่หรือไม่ก็ตาม) และไม่เขียนทับไฟล์คีย์ที่มีอยู่ก่อนหน้านี้
zrajm

ตรวจสอบแล้วใน Ubuntu ที่ไว้ใจได้ (14.04)
Binita Bharati

2
ทำไมคุณถึง cat / dev / zero
maxschlepzig

9

สิ่งนี้ใช้ได้กับฉัน:

ssh-keygen -t rsa -f /home/oracle/.ssh/id_rsa -q -P ""

-Pเป็นตัวเลือกรหัสผ่านและ""เป็นรหัสผ่านที่ว่างเปล่า


key_save_private: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Dimitri Kopriwa

5
-P <passphrase>ตัวเลือกคือการให้ (เดิม) วลีรหัสผ่าน linux.die.net/man/1/ssh-keygen
Gianfranco P.

5

คุณสามารถใช้ความคาดหวังในการส่ง "ป้อน" ให้คุณ

cat test.sh
#!/bin/bash
set -x
XYZ=$(expect -c "
spawn ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
expect \"Enter passphrase (empty for no passphrase):\"
send \"\r\"
expect \"Enter same passphrase again:\"
send \"\r\"
")

แต่ระวังว่าถ้าไฟล์ / tmp / sshkey มีอยู่แล้วมันจะล้มเหลวเพราะผลลัพธ์ของคำสั่งจะแตกต่างกัน


1
ขอบคุณสำหรับการสนับสนุน ความคาดหวังดูเหมือนจะยิ่งหลากหลายมากขึ้นสำหรับปัญหาในลักษณะเดียวกัน .... ดีที่ผู้เขียนสคริปต์และการโต้ตอบผู้ใช้จะขัดแย้งกัน ฉันจะรับรู้ถึงความเชื่อมั่นที่อาจเกิดขึ้นว่า / tmp / sshkey มีอยู่แล้วและตรวจสอบก่อนที่จะใช้คำสั่งของคุณ
humanityANDpeace

2

ฉันทำเสียงสะท้อนง่าย ๆ ต่อหน้า ssh-keygen ดังนั้นsu - <user> -c "echo |ssh-keygen -t rsa"

นี่คือการทดสอบใน Redhat 6


ฉันไม่คิดว่านี่เป็นคำตอบที่ดีที่สุด แต่ฉันคิดว่าไม่มีเหตุผลอะไรที่จะต้องลงคะแนนเช่นกัน
cubuspl42

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