ฉันจะลงชื่อเข้าใช้ ssh โดยอัตโนมัติโดยใช้รหัสผ่านจาก OS X keychain ได้หรือไม่


9

ฉันต้องลงชื่อเข้าใช้เซิร์ฟเวอร์ ssh ซึ่งไม่รองรับการตรวจสอบสิทธิ์ด้วยรหัส และฉันไม่ต้องการพิมพ์รหัสผ่านทุกครั้ง

ฉันใช้ OS X Lion (10.7.2) ฉันได้เพิ่มรหัสผ่านไปยัง Keychain X [1] ตอนนี้ฉันสามารถดึงรหัสผ่านจากพวงกุญแจได้โดยอัตโนมัติ/usr/bin/securityอย่างไรก็ตามฉันไม่สามารถหาวิธีส่งรหัสผ่านนี้ไปยังพรอมต์ ssh ได้

sshpassฉันยังพยายาม อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้มันออกจาก SSH ด้วยข้อผิดพลาดต่อไปนี้:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

มีอยู่แล้วฉันสามารถเข้าสู่ระบบเซิร์ฟเวอร์นี้โดยไม่ต้องป้อนรหัสผ่านทุกครั้งหรือไม่

หมายเหตุ

  1. แบบแผนที่ฉันใช้ในพวงกุญแจดูเหมือนว่านี้
    • ชนิด: รหัสผ่านอินเทอร์เน็ต
    • บัญชี: ชื่อผู้ใช้
    • โดยที่: ssh: // server-name

คำตอบ:


11

เซสชัน SSH แบบไม่โต้ตอบ

ถ้าคุณไม่จำเป็นต้องมีการโต้ตอบเซสชั่นบนเซิร์ฟเวอร์ระยะไกลคุณสามารถดำเนินการsshในสภาพแวดล้อมโดยไม่ต้องttyเช่นเป็นส่วนหนึ่งของการเรียกใช้ Shell Scriptการดำเนินการในอัตโนมัติ

คุณต้องสร้างโปรแกรมที่เมื่อเรียกว่าพิมพ์รหัสผ่านเพื่อออกมาตรฐานเช่นสคริปต์ทุบตีต่อไปนี้คุณต้องทำให้สามารถใช้งานได้โดยใช้chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

จากนั้นตั้งค่าSSH_ASKPASSตัวแปรสภาพแวดล้อมเป็นพา ธ ไปยังโปรแกรมนี้จากนั้นเรียกใช้sshในการดำเนินการอัตโนมัติเช่นนี้:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

เมื่อไม่มีttyแต่SSH_ASKPASSและDISPLAY(สำหรับ X11 ตั้งค่าเริ่มต้น) SSH จะเรียกใช้งานโปรแกรมที่ระบุโดยSSH_ASKPASSและใช้เอาต์พุตเป็นรหัสผ่าน สิ่งนี้มีวัตถุประสงค์เพื่อใช้ในสภาพแวดล้อมแบบกราฟิกเพื่อให้หน้าต่างสามารถปรากฏขึ้นเพื่อขอรหัสผ่านของคุณ ในกรณีนี้เราเพิ่งข้ามหน้าต่างคืนรหัสผ่านจากโปรแกรมของเรา คุณสามารถใช้securityอ่านจากพวงกุญแจแทนเช่นนี้:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

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


ใช้เซสชัน SSH แบบโต้ตอบ sshpass

ฉันดาวน์โหลดรวบรวมและติดตั้งsshpassและทำงานได้อย่างสมบูรณ์ นี่คือสิ่งที่ฉันทำ:

  1. รับเครื่องมือสำหรับนักพัฒนาของ Apple
  2. ดาวน์โหลดและเปิด sshpass-1.05.tar.gz
  3. เปิดเชลล์ไปยังไดเร็กทอรี sshpass-1.05
  4. วิ่ง ./configure
  5. วิ่ง make
  6. เรียกใช้make install(คุณอาจต้องการsudoมัน)

ตอนนี้โปรแกรมได้รับการติดตั้ง/usr/local/bin/sshpassแล้ว ดำเนินการโดยใช้บรรทัดดังต่อไปนี้:

sshpass -pYourPassword ssh username@hostname

คุณสามารถอ่านรหัสผ่านได้securityก่อนที่จะทำเช่นนั้นและใช้รหัสนี้:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

ล้อมสิ่งนี้ในฟังก์ชั่นเชลล์และคุณสามารถพิมพ์เช่นssh-yourhostnameเพื่อเชื่อมต่อโดยดึงมันแล้วป้อนรหัสผ่านโดยอัตโนมัติ


สวัสดีฉันได้ยกคำตอบของคุณขึ้นมาเพราะมันนำฉันไปสู่ทางออก แต่สิ่งที่คุณอธิบายไว้ที่นี่ไม่ได้ทำงานตรง (นี้อาจจะมีที่เฉพาะเจาะจงกับรุ่นของสิงโตของ SSH) 1) สำหรับการประชุมที่ไม่ใช่แบบโต้ตอบ, SSH STDIN is not a terminalยังคงถามผมสำหรับรหัสผ่านและหลังจากที่ผมเข้ามันฉันได้ 2) การประชุมแบบโต้ตอบกับsshpassที่-pตัวเลือกที่เห็นได้ชัดไม่ได้ทำอะไร แต่การทำงานsshpassในขณะที่SSH_ASKPASSตั้งค่าใช้งานไม่ได้!
Chaitanya Gupta

@ChaitanyaGupta มันใช้งานได้สำหรับฉันแบบไม่โต้ตอบจากภายใน Automator on Lion สำหรับประเด็นที่สองนั้นเป็นไปได้ว่าฉันมีเซสชันเชลล์สกปรก ณ จุดนั้นฉันไม่แน่ใจอีกต่อไป +1 ถึงคุณและขอขอบคุณที่เพิ่มโซลูชันของคุณไปยังไซต์
Daniel Beck

My bad (เกี่ยวกับ 1) - ฉันพยายามเรียกใช้เซสชันที่ไม่โต้ตอบในเทอร์มินัลไม่ใช่ Automator ฉันลองใช้งานใน Automator แล้วและฉันก็ยังพบSTDIN is not a terminalข้อผิดพลาด อย่างไรก็ตามฉันไม่ได้รับแจ้งให้ใส่รหัสผ่านใด ๆ ในครั้งนี้ ฉันเชื่อว่าSSH_ASKPASSใช้งานได้กับ Automator ตั้งแต่ถ้าฉันสร้างไฟล์SSH_ASKPASSคืนรหัสผ่านผิดฉันได้รับPermission denied, please try again.ข้อผิดพลาด
Chaitanya Gupta

1
สำหรับตัวอย่างล่าสุดโปรดทราบว่าภายใต้ Unix เช่น OSes อาร์กิวเมนต์บรรทัดคำสั่งและตัวแปรสภาพแวดล้อมสามารถมองเห็นได้โดยผู้ใช้รายอื่นในระบบดังนั้นจึงไม่ปลอดภัยในสภาพแวดล้อมที่มีผู้ใช้หลายคนที่มีความละเอียดอ่อน
Jürgen Strobel

@Daniel ตรวจสอบความคิดใด ๆ วิธีการทำงานในmacOs >= 10.13
nbari

7

ฉันพบวิธีแก้ปัญหา (ขอบคุณ Daniel Beck ที่ให้ข้อมูลสำคัญที่จำเป็นสำหรับสิ่งนี้) โปรดทราบว่าฉันได้ทดสอบกับ OS X Lion 10.7.2 เท่านั้น หากสิ่งนี้ไม่ได้ผลสำหรับคุณลองใช้วิธีแก้ปัญหาของ Daniel

ก่อนอื่นเราต้องตั้งค่าSSH_ASKPASSตัวแปรสภาพแวดล้อม - ค่าควรเป็นพา ธ ไปยังโปรแกรมที่พิมพ์รหัสผ่านไปยังเอาต์พุตมาตรฐาน ในการรับรหัสผ่านจากพวงกุญแจนี่คือสิ่งที่จำเป็นต้องมีหน้าตา (ฉันเรียกว่าget-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

ข้อควรทราบ:

  1. นี่ถือว่าคุณเก็บรหัสผ่านไว้ในพวงกุญแจตามที่ฉันอธิบายไว้ในคำถาม

  2. โปรแกรมที่ให้ในSSH_ASKPASSจะถูกเรียกโดยไม่มีข้อโต้แย้งใด ๆ ดังนั้นเราจึงใช้ตัวแปรสภาพแวดล้อมเพื่อส่งผ่านชื่อผู้ใช้และชื่อโฮสต์ให้

ตอนนี้เราสามารถตั้งค่าSSH_PASSWORD_USERและSSH_PASSWORD_HOSTNAMEรันsshpassเพื่อเข้าสู่เซิร์ฟเวอร์ของเรา

ฉันสร้างสคริปต์อื่นssh-kcpassเพื่อทำสิ่งนี้:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

เข้าสู่เซิร์ฟเวอร์ SSH โดยไม่ต้องพิมพ์รหัสผ่านใด ๆ ssh-kcpass user@hostnameที่คุณเพียงแค่ต้องวิ่ง


วิธีทำให้สิ่งนี้ทำงานได้macOS >= 10.13
nbari

-3

สวัสดีมีคนที่ฉันเจอในหัวข้อนี้กำลังมองหาสิ่งอื่น แต่ ... ไม่ทราบว่าฉันขาดอะไรบางอย่างที่นี่ ... แต่วิธีการของคุณดูแปลกสำหรับฉัน ทำไมไม่ใช้การตรวจสอบคีย์สาธารณะ ... สร้างคีย์ rsa $ ssh-keygen -t rsa -b 2048 -C 'อีเมล / รหัส'

เป็นการดีที่คุณจะใช้เมื่อ ssh-copy-id user @ host และรับรองความถูกต้องด้วยรหัสผ่านหนึ่งครั้งเพื่อติดตั้งคีย์บนเซิร์ฟเวอร์อื่น ๆ หรือใช้สคริปต์หรือเครื่องมือ authomation ใด ๆ เพื่อปรับใช้คีย์กับ ~ / .ssh / authorized_keys บน โฮสต์อื่น (สำหรับผู้ใช้ที่คุณต้องการเข้าสู่ระบบ) หากทำด้วยคำสั่งด้วยตนเองคุณจะต้องแก้ไข / etc / ssh / sshd_config ตามนั้นและ w automation (พ่อครัว ansible) คุณจะต้องกด condiga เต็มรูปแบบสำหรับสถานะที่ต้องการ

รหัสที่สำคัญสำหรับการแจกจ่ายคือ id_rsa.pub ให้รักษาความปลอดภัยของรหัสส่วนตัว

ในการใช้ Keychain เพื่อรับรองความถูกต้องกับโฮสต์ในการแก้ไขแบบอัตโนมัติที่ตรงไปตรงมาบนเครื่องของคุณ ~ / .ssh / config และเพิ่ม:

โฮสต์ * UseKeychain ใช่

ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกไฟล์ ssh config หวังว่าสิ่งนี้จะเป็นประโยชน์


1
อ่านประโยคแรกของเนื้อความคำถาม: '' ฉันต้องลงชื่อเข้าใช้เซิร์ฟเวอร์ ssh ซึ่งไม่รองรับการตรวจสอบตามคีย์ ''
สกอตต์

สวัสดีสกอตต์ฉันคิดว่าคุณพลาดส่วนที่เขาบอกว่าเขาไม่ต้องการพิมพ์รหัสผ่านทุกครั้งซึ่งหมายความว่าเขากำลังทำอยู่
Ricardo Mendes

ไม่ฉันไม่พลาด ทำไมคุณถึงเชื่อว่าฉันทำ
สกอตต์

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