วิธีการ SSH ในหนึ่งบรรทัด


26

ฉันจะเชื่อมต่อกับคอมพิวเตอร์เครื่องอื่นผ่าน SSH ในหนึ่งบรรทัดได้อย่างไร ถ้าฉันต้องทำssh host@IPฉันจะต้องป้อนรหัสผ่านในบรรทัดที่สอง ฉันคิดว่าฉันสามารถทำสิ่งนี้: ssh host@IP | echo passwordแต่ใส่รหัสก่อนที่จะขอรหัสผ่าน


3
ความคิดแบบนี้มาจากยุคของ telnet และคาดหวังว่าเมื่ออินเทอร์เน็ตเป็นสถานที่ที่ปลอดภัย คำตอบของอัลเลนนั้นถูกต้องคำตอบของจาคุจินั้นเป็นจริงทางเทคนิค แต่ไม่ใช่เครื่องมือสำหรับงานในสถานที่ส่วนใหญ่
Criggie

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

หากsshจะอ่านรหัสผ่านจาก stdin echo password | ssh host@IPจะใช้งานได้ แต่โดยปกติแล้ว SSH จะพยายามอ่านจากเทอร์มินัลโดยตรง
Paŭlo Ebermann

คำตอบ:


82

คุณควรใช้คีย์ SSH เพื่อรับรองความถูกต้องแทนที่จะใส่รหัสผ่านในบรรทัดคำสั่งเนื่องจากไม่ปลอดภัยอย่างยิ่ง

วิธีการทำงานนี้คือเมื่อคุณตั้งค่าคีย์ SSH ของคุณแล้วสิ่งที่คุณต้องทำคือออกคำสั่ง:

ssh user@host

และโดยไม่ต้องพิมพ์สิ่งอื่นคุณจะเข้าสู่ระบบโดยอัตโนมัติ


คัดลอกกุญแจสาธารณะ SSH ไปยัง Mac / FreeBSD / Linux จาก macOS

สิ่งนี้ถือว่าคุณสามารถเข้าถึงเซิร์ฟเวอร์ระยะไกลผ่านการตรวจสอบความถูกต้องด้วยรหัสผ่าน (พิมพ์รหัสผ่าน) และคุณได้สร้างรหัสส่วนตัว / สาธารณะของคุณแล้ว (ถ้าไม่ใช่ดูด้านล่าง) ในตัวอย่างต่อไปนี้เรากำลังใช้ RSA ในการเริ่มต้นให้ลองคัดลอกคีย์ (โปรดทราบว่าไดเรกทอรี "home" แตกต่างกันระหว่าง macOS, Linux, BSD และอื่น ๆ ):

ใช้ SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

หรือเพียงแค่ cat ไฟล์เพื่อauthorized_keys(ฉันชอบวิธีนี้):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(ชื่อคีย์ของคุณอาจแตกต่างกัน) หากไดเรกทอรี. ssh ไม่มีอยู่บนเซิร์ฟเวอร์ระยะไกลคุณจะต้องลงชื่อเข้าใช้และสร้างขึ้น

ตอนนี้คีย์ถูกคัดลอกจาก mac ไปยังเซิร์ฟเวอร์ระยะไกล ตั้งค่าการอนุญาตที่ถูกต้องสำหรับ SSH Public Key บนเซิร์ฟเวอร์ระยะไกล:

chmod 600  ~/.ssh/id_rsa.pub

ถัดไปเพิ่มคีย์ไปยังไฟล์ SSH authorized_keys หากไฟล์ไม่มีอยู่ให้สร้างขึ้น

หากไฟล์authorized_keysมีอยู่แล้วใน~/.sshการใช้คำสั่งต่อไปนี้:

cat id_rsa.pub >> authorized_keys

หากไฟล์ไม่มีอยู่ให้ป้อนคำสั่งต่อไปนี้:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


สร้างคีย์สาธารณะ / ส่วนตัว SSH บน macOS

เปิด Terminal โดยไปที่ Applications -> Utilities -> Terminal

ในเทอร์มินัลใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นการสร้างคีย์

ssh-keygen -t rsa

ถัดไปคุณจะได้รับแจ้งให้ระบุตำแหน่งที่คุณต้องการสร้างไฟล์กุญแจส่วนตัว:

ป้อนไฟล์ที่จะบันทึกคีย์ ( /Users/username/.ssh/id_rsa):

/Users/username/.ssh/id_rsaปล่อยว่างนี้เพื่อสร้างที่สำคัญในการตั้งค่าเริ่มต้นซึ่งเป็น ไฟล์กุญแจสาธารณะจะถูกสร้างขึ้นในตำแหน่งเดียวกันและมีชื่อเดียวกัน แต่ใช้นามสกุล. PUUB

หลังจากนั้นคุณจะได้รับแจ้งให้เลือกข้อความรหัสผ่าน นี่คือรหัสผ่านที่เป็นทางเลือกเพื่อใช้ไพรเวตคีย์

Enter passphrase (empty for no passphrase):

สร้างคีย์ SSH ของคุณแล้ว

อย่าลืมว่าถ้าคุณใส่วลีรหัสผ่านคุณจะต้องใส่มันทุกครั้งที่คุณเชื่อมต่อ ยูทิลิตี้ssh-agentนี้จะเก็บข้อความรหัสผ่านในหน่วยความจำเพื่อลดความจำเป็นในการป้อนข้อมูลด้วยตนเองทุกครั้งที่คุณเชื่อมต่อในขณะที่คุณอยู่ในเซสชันเดียวกัน สำหรับรายละเอียดเพิ่มเติมดูman ssh-agent


6
อย่างนี้ - กุญแจสามารถและควรแทนที่รหัสผ่านสำหรับการเข้าถึง ssh ใด ๆ ผ่านทางอินเทอร์เน็ต ฉันขอแนะนำให้คุณขยายความจำเป็นในการรักษาความปลอดภัยของรหัสส่วนตัวซึ่งไม่ใช่สิ่งที่จะมีในคอมพิวเตอร์ทุกเครื่องของคุณ
Criggie

+1 นี่เป็นคำตอบที่ดีมากไม่เพียงเพราะสิ่งที่มันพูด แต่ยังเป็นเพราะคุณอธิบายได้อย่างไร สิ่งที่ง่ายสำหรับผู้ใช้ในการติดตามและช่วยให้พวกเขาปลอดภัยมากขึ้นคือข้อดีในหนังสือของฉัน!
Monomeeth

7
คำตอบที่ดี แค่อยากจะเพิ่มนั่นssh-copy-idเป็นเครื่องมือที่ดีสำหรับการทำงานบางอย่างโดยอัตโนมัติ
ชาวสกอต

การเอ่ยถึงssh-agentอาจช่วยได้เช่นกัน OS X / macOS เวอร์ชันส่วนใหญ่ (ทั้งหมด) มาพร้อมกับมันและอนุญาตให้เข้าสู่ระบบโดยไม่ต้องใช้รหัสผ่านแม้ว่ารหัสจะถูกป้องกันด้วยรหัส
Qsigma

1
@Scot - ยังไม่ได้เป็นส่วนหนึ่งของ MacOS โดยค่าเริ่มต้นและจะต้องติดตั้งผ่าน Homebrew หรือ MacPorts ฉันไม่ใช่แฟนของการติดตั้งซอฟต์แวร์สำหรับสิ่งต่าง ๆ สามารถทำได้ใน 1 บรรทัดหรือสคริปต์สั้น ๆ ที่เขียนด้วยตนเองและด้วยเหตุผลเหล่านั้นฉันคิดว่ามันอยู่นอกขอบเขตของคำตอบ อย่างไรก็ตามมันเป็นยูทิลิตี้ตัวน้อยที่ดีและคุ้มค่าที่จะกล่าวถึง
อัลลัน

13

มีความเป็นไปได้หลายอย่าง ตัวอย่างของคุณจะไม่ทำงานอย่างชัดเจน แต่คุณสามารถทำสิ่งที่คล้ายกันโดยใช้sshpassยูทิลิตี้:

sshpass -p password ssh host@IP

หมายเหตุไม่แนะนำให้ทำเช่นนี้เพราะpasswordจะสามารถมองเห็นได้สำหรับกระบวนการอื่น ๆ หรือในประวัติเชลล์

วิธีที่ดีกว่าในการทำเช่นเดียวกันคือตั้งค่าการตรวจสอบสิทธิ์ด้วยรหัสผ่านโดยใช้คีย์ SSH ในระยะสั้น:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

ฉันลองsshpassตามที่คุณแนะนำ แต่มันบอกว่าไม่พบคำสั่ง
Ben A.

8
ดี ... คุณอาจจะต้องติดตั้ง และไม่ฉันไม่แนะนำ ตั้งค่าการตรวจสอบสิทธิ์ด้วยรหัสผ่านโดยใช้คีย์ ssh
Jakuje

4
@BenA ตั้งค่าการตรวจสอบสิทธิ์ด้วยรหัสผ่านโดยการกำหนดปุ่มกดสาธารณะ / ส่วนตัวและตั้งค่าบนเครื่องทั้งสองที่เกี่ยวข้อง ที่ง่ายมาก (จริงและปลอดภัยมากขึ้นกว่า) รหัสผ่านใด ๆ
nohillside

8
ไม่นับพันครั้ง sshpass เป็นแฮ็คสกปรกที่ใช้สำหรับเชื่อมต่อกับอุปกรณ์ที่พูด ssh แต่ทำคีย์ไม่ถูกต้องและการใช้งานหลักคือสคริปต์การตั้งค่า คุณจะไม่ใช้ sshpass บนเครื่องที่มีผู้ใช้หลายคน ps auxw | grep sshpass จะบอกรหัสผ่าน ssh แก่ผู้ใช้รายอื่น
Criggie

1
@Criggie ไม่ใช่ทั้งหมด ในขณะที่ฉันอยู่เบื้องหลังโซลูชันแบบอิงคีย์ 100% ฉันมี sshpass บน Raspberry Pis ภายในเดียวเท่านั้น (สำหรับงานสุ่มและเข้าถึงได้โดยไคลเอนต์แบบสุ่ม การรันคำสั่งของคุณจะให้ผลลัพธ์ต่อไปนี้: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. zzzzzzzzเป็นตัวอักษร; sshpass ปิดบังเนื้อหาของรหัสผ่าน การทำซ้ำก่อนหน้านี้อาจไม่ทราบถึงความเป็นส่วนตัว
flith

3

ฉันใช้เวลานานในการหาคำตอบสำหรับเรื่องนี้เช่นกัน แม้ว่าจะไม่ปลอดภัยและคนเหล่านี้บอกให้คุณใช้คีย์ RSA ( ซึ่งเป็นแนวคิดที่ปลอดภัยและเชื่อถือได้มากกว่า ) แต่ก็เป็นไปได้ทีเดียว

ใช้โปรแกรมที่เรียกว่าexpectสำหรับสิ่งนี้ คาดว่าจะดู stdout (และฉันคิดว่า stderr หากกำหนดค่าอย่างถูกต้อง) สำหรับคุณรอข้อความบางอย่างและตอบสนองพวกเขาด้วยการส่งออก คาดว่าตัวเองเป็นภาษาสคริปต์จริงและเมื่อฉันทำสิ่งเดียวกันฉันมีเวลายากมากที่สคริปต์ของตัวเองจะทำงานอย่างถูกต้องเนื่องจากเวลา autoexpectแต่คาดว่ายังมีสาธารณูปโภคที่มีประโยชน์ที่เรียกว่า

ด้วย autoexpect มันจะเฝ้าดูคุณและสร้างสคริปต์คาดหวังให้คุณ เพียงเรียกใช้ autoexpect และคำสั่งที่คุณต้องการ:

autoexpect ssh host@ip 

และทำสิ่งที่คุณทำตามปกติ เมื่อคุณออกจากโปรแกรม (โดยพิมพ์exitในเชลล์ ssh'd) มันจะสร้างสคริปต์ ในกรณีที่คุณไม่ต้องการให้สคริปต์ทั้งหมดที่คุณเขียนอยู่ในสคริปต์ที่คาดหวังคุณสามารถแก้ไขสคริปต์จาก autoexpect (เรียกว่าscript.exp) เพื่อออกก่อนที่จะพิมพ์exitคำสั่งลงในเปลือก บรรทัดที่คุณต้องการย้ายเพื่อเปลี่ยนการสิ้นสุดสคริปต์คือ:

expect eof

ซึ่งหมายถึงคาดว่าจะสิ้นไฟล์ หวังว่านี่จะช่วยได้!


1
ในกรณีที่ไม่มีใครพูดถึง: ยินดีต้อนรับสู่ถามที่แตกต่าง!
Synoli

2

การใช้expectเป็นเรื่องผิดธรรมดาในการเข้าสู่การเชื่อมต่อ ssh สำหรับสิ่งอื่นนอกเหนือจากในชุดทดสอบ

สิ่งที่ @ ben-a กำลังมองหาถูกนำไปใช้ใน ssh แล้ว เคล็ดลับคือวิธีการใช้งาน ดังนั้นที่นี่ไป:

  1. สร้างสาธารณะ keypair ส่วนตัว / ssh-keygenใช้ ใช้ ECDSA หรือ RSA เป็น-t(หรือพิมพ์) และสำหรับ RSA ให้ใช้ 2048 หรือ 4096 เป็น-b(หรือความยาว BITS) สิ่งนี้น่าจะพอเพียงในขณะที่เขียน ใช้รหัสผ่านเสมอ!
  2. ใช้ssh-copy-idหรือวิธีการดังกล่าวข้างต้นเพื่อสร้างบนเครื่องที่คุณเข้าสู่ระบบ (หรือเซิร์ฟเวอร์) ~/.ssh/authorized_keysไฟล์ ภายในมีสำเนาของกุญแจสาธารณะที่คุณเพิ่งสร้างขึ้น
  3. ตอนนี้บนเครื่องที่คุณใช้ในการเข้าสู่ระบบ 'เซิร์ฟเวอร์' (หรือลูกค้า) ~/.ssh/configคุณเปิดแฟ้ม หากไม่มีอยู่คุณสามารถสร้างมันได้
  4. ในไฟล์นี้คุณเพิ่มสิ่งต่อไปนี้ตามความต้องการของคุณ

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. ตอนนี้คุณสามารถใช้เพียงssh <name>เพื่อตั้งค่าการเชื่อมต่อ แต่ก็ยังจะต้องใช้รหัสผ่านสำหรับคีย์ของคุณ เพื่อแก้ปัญหานี้ให้ใช้เพื่อจุดประสงค์นี้พัฒนาและรวม ssh-agent ssh-add <path to keyfile>การเพิ่มคีย์ของคุณเพื่อการใช้งานเพียงแค่ตัวแทน คุณจะถูกถามรหัสผ่านและมันจะเก็บกุญแจไว้ให้คุณอย่างปลอดภัยสำหรับเซสชั่นนี้ หากพบข้อผิดพลาด "ไม่พบ ssh-agent" (หรือคล้ายกัน) นั่นหมายความว่าอาจไม่ได้เริ่มต้นเอเจนต์ ssh-agent bashคุณสามารถเริ่มต้นสำหรับการประชุมครั้งนี้ใช้ สิ่งนี้จะเริ่มเชลล์ใหม่โดยที่เอเจนต์ใช้งานอยู่

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

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