Tôi có thể tự động đăng nhập vào ssh bằng mật khẩu từ móc khóa OS X không?


9

Tôi cần đăng nhập vào máy chủ ssh không hỗ trợ xác thực dựa trên khóa. Và tôi không muốn gõ mật khẩu mỗi lần.

Tôi đang sử dụng OS X Lion (10.7.2). Tôi đã thêm mật khẩu vào móc khóa OS X [1]. Bây giờ tôi có thể lấy lại mật khẩu tự động từ móc khóa bằng cách sử dụng /usr/bin/security, tuy nhiên tôi không thể tìm cách gửi mật khẩu này đến dấu nhắc ssh.

Tôi cũng đã thử sshpass. Tuy nhiên, khi tôi cố chạy nó, ssh thoát với lỗi sau:

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).

Có cách nào tôi có thể đăng nhập vào máy chủ này mà không phải nhập mật khẩu mỗi lần không?

Ghi chú

  1. Lược đồ tôi sử dụng trong móc khóa trông như thế này
    • Loại: Mật khẩu Internet
    • Tài khoản người dùng
    • Trong đó: ssh: // tên máy chủ

Câu trả lời:


11

Các phiên SSH không tương tác

Nếu bạn không cần phải có phiên tương tác trên máy chủ từ xa, bạn có thể thực thi sshtrong môi trường mà không cần tty, ví dụ như một phần của hành động Run Shell Script trong Automator .

Bạn cần tạo một chương trình mà khi được gọi sẽ in mật khẩu thành tiêu chuẩn, ví dụ tập lệnh bash sau đây bạn cần để thực thi bằng cách sử dụng chmod +x pwd.sh:

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

Sau đó, đặt SSH_ASKPASSbiến môi trường cho đường dẫn đến chương trình này, rồi chạy sshtrong hành động Automator, như sau:

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

Khi không có tty, nhưng SSH_ASKPASSDISPLAY(đối với X11, được đặt mặc định) được đặt, SSH sẽ thực thi chương trình được chỉ định bởi SSH_ASKPASSvà sử dụng đầu ra của nó làm mật khẩu. Điều này được dự định sẽ được sử dụng trong môi trường đồ họa, để một cửa sổ có thể bật lên hỏi mật khẩu của bạn. Trong trường hợp này, chúng tôi chỉ bỏ qua cửa sổ, trả lại mật khẩu từ chương trình của chúng tôi. securityThay vào đó, bạn có thể sử dụng để đọc từ móc khóa của mình, như thế này:

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

ls(trên sshdòng lệnh) là lệnh được thực thi khi sshđã đăng nhập và đầu ra của nó được in trong Automator. Tất nhiên, bạn có thể chuyển hướng nó đến một tệp để ghi nhật ký đầu ra của chương trình bạn bắt đầu.


Phiên SSH tương tác bằng cách sử dụng sshpass

Tôi đã tải xuống, biên dịch và cài đặt sshpassvà nó hoạt động hoàn hảo. Đây là những gì tôi đã làm:

  1. Nhận các công cụ dành cho nhà phát triển của Apple
  2. Tải xuống và mở sshpass-1.05.tar.gz
  3. Mở một vỏ vào thư mục sshpass-1.05
  4. Chạy ./configure
  5. Chạy make
  6. Chạy make install(bạn có thể cần sudocho nó)

Bây giờ chương trình được cài đặt để /usr/local/bin/sshpass. Thực hiện bằng cách sử dụng một dòng như sau:

sshpass -pYourPassword ssh username@hostname

Bạn có thể đọc mật khẩu securityngay trước khi làm điều đó và sử dụng nó như thế này:

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

Bao bọc điều này trong một hàm shell và bạn chỉ có thể gõ ví dụ ssh-yourhostnameđể kết nối, tự động lấy và nhập mật khẩu.


Xin chào, tôi đã nêu lên câu trả lời của bạn vì nó dẫn tôi đến giải pháp. Tuy nhiên, những gì bạn mô tả ở đây không hoạt động chính xác (điều này có thể cụ thể với phiên bản ssh của Lion) 1) Đối với các phiên không tương tác, ssh vẫn hỏi tôi mật khẩu và sau khi tôi nhập mật khẩu, tôi đã nhận được STDIN is not a terminal. 2) Đối với các phiên tương tác với sshpass, -ptùy chọn dường như không làm gì cả. Nhưng chạy sshpasstrong khi SSH_ASKPASSđược thiết lập không hoạt động!
Chaitanya Gupta

@ChaitanyaGupta lẻ. Nó hoạt động với tôi không tương tác từ bên trong Automator trên Lion. Về vấn đề thứ hai đó, có thể tôi đã có một phiên vỏ bẩn vào thời điểm đó, tôi không chắc nữa. +1 cho bạn và cảm ơn vì đã thêm giải pháp của bạn vào trang web.
Daniel Beck

Điểm xấu của tôi (liên quan đến 1) - Tôi đã cố gắng chạy phiên không tương tác trong thiết bị đầu cuối và không phải Máy tự động. Tôi đã thử nó trong Automator bây giờ, và tôi vẫn gặp STDIN is not a terminallỗi. Tuy nhiên, lần này tôi không được nhắc nhập mật khẩu nào; Tôi tin rằng SSH_ASKPASSđang làm việc trong Automator vì nếu tôi tạo tệp SSH_ASKPASStrả lại mật khẩu sai, tôi sẽ Permission denied, please try again.gặp lỗi.
Chaitanya Gupta

1
Đối với các ví dụ cuối cùng lưu ý rằng trong Unix như các đối số dòng lệnh và biến môi trường có thể hiển thị cho những người dùng khác trên hệ thống, vì vậy điều này không an toàn trong môi trường đa người dùng nhạy cảm.
Jürgen Strobel

@DanielBeck bất kỳ ý tưởng nào làm cho nó hoạt động trongmacOs >= 10.13
nbari

7

Tôi tìm thấy một giải pháp (cảm ơn Daniel Beck vì đã cung cấp thông tin chính cần thiết cho việc này). Lưu ý rằng tôi chỉ thử nghiệm điều này với OS X Lion 10.7.2. Nếu điều này không hiệu quả với bạn, hãy thử giải pháp của Daniel.

Đầu tiên chúng ta cần đặt SSH_ASKPASSbiến môi trường - giá trị của nó phải là đường dẫn đến chương trình in mật khẩu thành đầu ra tiêu chuẩn. Để lấy mật khẩu từ móc khóa, đây là giao diện cần thiết (tôi gọi nó 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

Một vài điểm cần lưu ý:

  1. Điều này giả định rằng bạn đã lưu trữ mật khẩu trong móc khóa theo cách tôi đã mô tả trong câu hỏi

  2. Chương trình đưa ra SSH_ASKPASSsẽ được gọi mà không có bất kỳ đối số; vì vậy chúng tôi sử dụng các biến môi trường để truyền tên người dùng và tên máy chủ cho nó.

Bây giờ chúng tôi có thể thiết lập SSH_PASSWORD_USERSSH_PASSWORD_HOSTNAMEchạy sshpassđể đăng nhập vào máy chủ của chúng tôi.

Tôi đã tạo một kịch bản khác ssh-kcpass, để làm điều này:

#!/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"

Để đăng nhập vào máy chủ ssh mà không cần nhập bất kỳ mật khẩu nào, bạn chỉ cần chạy ssh-kcpass user@hostname.


Làm thế nào để làm cho nó hoạt động trongmacOS >= 10.13
nbari

-3

Xin chào mọi người, tôi đã bắt gặp chủ đề này để tìm kiếm một số thứ khác nhưng ... Không biết liệu tôi có bỏ sót điều gì ở đây không ... nhưng cách tiếp cận của bạn có vẻ kỳ lạ đối với tôi. tại sao không sử dụng xác thực khóa công khai ... Tạo khóa rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Lý tưởng nhất là bạn sử dụng một lần người dùng ssh-copy-id @ host và xác thực bằng mật khẩu một lần để cài đặt khóa trên máy chủ khác hoặc sử dụng bất kỳ loại tập lệnh hoặc công cụ xác thực nào để triển khai khóa thành ~ / .ssh / ủy quyền máy chủ khác (đối với người dùng bạn muốn đăng nhập) Nếu thực hiện bằng lệnh theo cách thủ công, bạn phải chỉnh sửa / etc / ssh / sshd_config và tự động hóa (đầu bếp, ansible) bạn sẽ đẩy toàn bộ condiga cho trạng thái mong muốn.

Khóa quan trọng cần phân phối là id_rsa.pub, giữ an toàn cho khóa riêng

Để sử dụng móc khóa để xác thực với máy chủ theo cách tự động chỉnh sửa thời trang đơn giản trên máy của bạn, ~ / .ssh / config và thêm:

Máy chủ * UseKeychain có

Tìm kiếm thêm thông tin về các tùy chọn tập tin cấu hình ssh hy vọng bất kỳ điều này có ích


1
Đọc câu đầu tiên của nội dung câu hỏi: '' Tôi cần đăng nhập vào máy chủ ssh không hỗ trợ xác thực dựa trên khóa. ''
Scott

Xin chào Scott Tôi nghĩ rằng bạn cũng đã bỏ lỡ phần mà anh ấy nói rằng anh ấy không muốn nhập mật khẩu mọi lúc, điều đó có nghĩa là anh ấy đang làm điều đó.
Ricardo Mendes

Không, tôi đã không bỏ lỡ điều đó. Tại sao bạn tin rằng tôi đã làm?
Scott

Bc bạn vẫn đang nói chuyện
Ricardo Mendes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.