OS X 키 체인의 비밀번호를 사용하여 ssh에 자동으로 로그인 할 수 있습니까?


9

키 기반 인증을 지원하지 않는 ssh 서버에 로그인해야합니다. 그리고 매번 암호를 입력하고 싶지 않습니다.

OS X Lion (10.7.2)을 사용하고 있습니다. OS 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 세션

원격 서버에서 대화식 세션이 필요하지 않은 경우 Automator 에서 Run Shell Script 작업의 일부로 ssh환경없이 실행할 수 있습니다 .tty

호출 할 때 비밀번호를 표준 출력으로 인쇄하는 프로그램을 작성해야합니다 (예 : 다음 bash 스크립트를 사용하여 실행 가능해야 함) chmod +x pwd.sh.

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

그런 다음 SSH_ASKPASS환경 변수를이 프로그램의 경로로 설정 한 후 다음 ssh과 같이 Automator 조치에서 실행 하십시오.

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

더있는 경우 tty만, SSH_ASKPASSDISPLAY설정 (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를 들어 입력하여 자동으로 암호를 검색하고 입력하도록 할 수 있습니다 .


안녕하세요, 귀하의 답변이 나를 해결책으로 인도했기 때문에 귀하의 답변을 상향 조정했습니다. 그러나 여기에 설명 한 내용이 제대로 작동하지 않았습니다 (이것은 Lion의 ssh 버전에 따라 다를 수 있습니다) 1) 비 대화식 세션의 경우 ssh는 여전히 암호를 요구했으며 입력 한 후에을 얻었습니다 STDIN is not a terminal. 2) 대화식 세션의 sshpass경우 -p옵션이 아무것도 수행하지 않는 것 같습니다. 그러나 설정된 sshpass동안 실행하면 SSH_ASKPASS작동합니다!
Chaitanya Gupta

트윗 담아 가기 Lion의 Automator 내에서 비 ​​대화식으로 작동했습니다. 두 번째 문제와 관련하여 그 시점에서 더러운 셸 세션이 있었을 가능성이 더 이상 확실하지 않습니다. +1하고 사이트에 솔루션을 추가해 주셔서 감사합니다.
Daniel Beck

내 나쁜 (1에 관한)-나는 Automator가 아닌 터미널에서 비 대화식 세션을 실행하려고했습니다. 지금 Automator에서 시도했지만 여전히 STDIN is not a terminal오류가 발생합니다. 그러나 이번에는 비밀번호를 묻지 않았습니다. SSH_ASKPASS파일을 SSH_ASKPASS잘못된 암호 로 반환하면 Permission denied, please try again.오류가 발생하기 때문에 Automator에서 작업하고 있다고 생각 합니다.
Chaitanya Gupta

1
마지막 예제에서 OS와 같은 Unix에서는 명령 행 인수 및 환경 변수가 시스템의 다른 사용자에게 표시 될 수 있으므로 민감한 다중 사용자 환경에서는 안전하지 않습니다.
Jürgen Strobel 2016 년

@DanielBeck 어떤 아이디어가 이것을 작동하게하는지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 'email / id'

이상적으로는 ssh-copy-id user @ host를 한 번 사용하고 암호로 한 번 인증하여 다른 서버에 키를 설치하거나 모든 종류의 스크립트 또는 인증 도구를 사용하여 ~ / .ssh / authorized_keys에 키를 배포하십시오. 다른 호스트 (로그인하려는 사용자의 경우) 수동으로 명령을 수행 한 경우 / etc / ssh / sshd_config를 적절하게 편집하고 자동화 (chef, ansible)를 편집하여 원하는 상태로 전체 condiga를 푸시합니다.

배포해야 할 키는 id_rsa.pub이며 개인 키를 안전하게 유지하십시오.

키 체인을 사용하여 자동 간단한 방식으로 호스트를 인증하려면 ~ / .ssh / config를 편집하고 다음을 추가하십시오.

호스트 * UseKeychain 예

ssh 설정 파일 옵션에 대한 자세한 정보는이 중 하나가 유용하기를 바랍니다.


1
질문 본문의 첫 문장을 읽으십시오 : '' 키 기반 인증을 지원하지 않는 ssh 서버에 로그인해야 합니다. ''
Scott

안녕 스캇 나는 당신이 그가 암호를 매번 입력하고 싶지 않다고 말하는 부분을 놓쳤다 고 생각합니다.
Ricardo Mendes

아니, 나는 그것을 놓치지 않았다. 내가 왜 그렇게 믿겠 니?
Scott

Bc 당신은 여전히 ​​이야기
리카르도 멘데스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.