자동 로그인을 허용하도록 .ssh / config에서 비밀번호를 설정할 수 있습니까?


93

우분투 11.10을 사용하고 있습니다. ssh매일 많은 서버에 연결하는 데 사용 하고 있으므로 매개 변수를 다음 .ssh/config과 같이 파일 에 넣습니다 .

Host Home
User netmoon
Port 22
HostName test.com

서버가 비밀번호를 요청할 때 터미널이 비밀번호를 입력하여 서버로 전송하도록이 파일에 각 연결에 대한 비밀번호를 넣는 방법이 있습니까?

때로는 PC에서 멀리 떨어져서 돌아가서 비밀번호를 입력하고 Enter터미널을 누르기 때문에 이것이 필요합니다 CONNECTION CLOSED.

추신 공개 / 개인 키 쌍을 사용하고 싶지 않습니다.


1
같은 상황에 있고 svn에 대해서만 ssh 액세스 권한이 있기 때문에 공개 키를 업로드 할 수 없습니다. 내가 ssh svnhost를 시도하면 "(성공 (2 2 () (편집 파이프 라인 svndiff1 부재 항목 commit-revprops 깊이 log-revprops 부분 재생))))"svnserve 응답 및 쉘이 아님
Uberto

답변:


56

편의를위한 보안 거래는 결코 끝나지 않습니다 ...

패키지 ssh-copy-id에서 사용할 수 openssh-client있습니까?

보낸 사람 man ssh-copy-id:

ssh-copy-id는 ssh를 사용하여 원격 시스템에 로그인하고 표시된 ID 파일을 해당 시스템의 ~ / .ssh / authorized_keys 파일에 추가하는 스크립트입니다.


12
원격 관리자가 공개 키 인증 비활성화를 주장하는 경우에는 작동하지 않습니다 ...
tomasz

2
그렇습니다. 그러나 전체 감독과 통제하에있는 시스템에서 현실적이라는 것은 타협하지 않습니다. 예를 들어, 단일 좌석에서 개발 목적으로 만 사용되는 외부 연결이없는 유창한 가상 머신을 예로 들어 보겠습니다.
Scott

36
이유없이 드라코 니안 보안을 주장하는 것도 결코 끝나지 않습니다.
cwallenpoole

6
때로는 잘 끝납니다.
devth

3
IMHO는 인증을 위해 암호를 고집하는 것이 아닌 위험보다 더 위험합니다. 나는 종종 임의의 문자열 집합을 기억하기 싫기 때문에 종종 ssh에 사용되는 암호를 환경 변수로 설정합니다. 사용자가 입력하도록 요구하면 단순히 저장이 제대로되지 않는 것입니다.
eggmatters

26

공개 / 개인 키 쌍을 사용하지 않으려면 expect대상 주소에 따라 자동으로 암호를 입력 하는 스크립트를 작성할 수 있습니다 .

편집 : 내 말은 당신이 한편 expect으로 당신을 위해 암호를 입력하는 데 사용하는 스크립트를 가질 수 있고, 다른 한편으로, 구성 파일에서 주어진 사용자와 호스트의 암호를 읽는다는 것입니다. 예를 들어 다음 Python 스크립트는 화창한 날 시나리오에서 작동합니다.

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

구성 파일 형식은 다음과 같습니다.

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

참고 : 설명 된 것처럼 python 스크립트는 ssh 및 가능한 모든 URL의 모든 가능한 오류 및 질문 메시지를 처리하기 위해 훨씬 더 복잡해야합니다 (이 예제 user@host에서는와 같을 것으로 가정 하지만 사용자 부분은 ' t는 대부분의 시간을 사용했지만 기본 아이디어는 여전히 동일합니다. 구성 파일과 관련하여 다른 구성 파일을 사용하거나 .ssh/config해당 파일을 구문 분석하고 지정된 사용자 및 호스트의 비밀번호를 얻기 위해 고유 코드를 사용 하고 작성할 수 있습니다.


더 자세히 설명해 주시겠습니까?
Netmoon

@Netmoon 나는 그것에 대한 명확한 대답에 작은 예를 추가했습니다.
jcollado

이것은 .ssh / config 파일에 암호를 넣는 방법에 대한 질문에는 답하지 않습니다
Eric Woodruff

1
실제로, 그것은 그 질문에 대답하지 않습니다. 그러나 문제를 해결합니다. 암호를 수동으로 입력하지 않고 파일에 저장하지 않아도됩니다. OP가 요구하는 것은 꽤 큽니다.
Arcesilas

19

이를 sshpass위한 프로그램 도 있습니다 . 사용하는 방법: sshpass -p MyPa55word ssh me@myservor.com


29
공백 sshpass대신 () 대신 명령을 시작하지 않으면 sshpass, 쉘의 히스토리 파일에 비밀번호 ( "MyPa55word")를 저장 한 것입니다.
waltinator 2016 년

1
@waltinator 좋은 지적
igor

3
글쎄요, asker에 관한 질문은 괜찮습니다 .ssh/config. 왜 쉘 역사에도 있지 않습니까?
Darth

공식적으로 Homebrew에 있지 않지만을 사용하여 타사 저장소에서 설치할 수 있습니다 brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. 더 : gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. 이렇게하면 암호가 기록에 표시되지 않습니다
Alexander Bird

19

ProxyCommand는 어떻습니까 :

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

ssh -W대신 사용할 수도 있습니다 nc.

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

-W옵션 으로는 예상대로 작동하지 않습니다 . 해결 방법이 있습니까?
Toan Nguyen

2
여전히이 프록시 명령으로 암호를 묻습니다.
Victor Piousbox

1
또한 여전히 암호를 요구합니다. 이 모든 것은 test.com암호를 Home요구하는 것에서 암호를 요구하는 것으로 문제를 옮기는 것 같습니다 . 점은 무엇인가? 작동시키는 비결은 무엇입니까?
마틴 브

15

아니요. 두려워 할 수 없습니다.

유일한 대안은 개인 키를 사용하는 것이지만 원하지 않는다고 말한 이유는 무엇입니까?


7
서버에 다른 키를 넣을 권한이 없기 때문입니다.
Netmoon

2
@Netmoon : 로그인 할 수 있다면 키를 추가 할 수 있습니다. sysadmin이 이상하게 설정하지 않는 한 홈 디렉토리에 대한 쓰기 액세스 권한 만 있으면됩니다.
Scott Severance

4
@ScottSeverance이 질문이 언급 한 상황이라고 생각합니다. 키를 추가 할 수 없습니다. 예, 이상하지만 종종 발생합니다.
user239558 2016 년

5
공개 키 액세스가 비활성화되어있는 공유 호스팅 환경에 대한 매우 일반적인 경험이 있으므로 키를 추가 할 수는 있지만 사용되지는 않습니다. 그렇습니다. 그러나 많은 호스팅 제공 업체들이 서버를 설정하는 방식입니다
billynoah

1
가능하다는 것을 보여주는 답변이 있습니다
Eric Woodruff

8

/ usr / local / bin에서 간단한 ssh 스크립트 대체를 만들 수 있습니다.

#!/bin/bash

host=$1
password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

~ / .ssh / config 파일에서 사용할 수 있습니다

Host foohost
    User baruser
    #Password foobarpassword

4

SecureCRT 라는 VanDyke Software의 응용 프로그램을 사용합니다 .

http://www.vandyke.com/products/securecrt/

무료는 아니지만 매우 합리적인 가격입니다. 원격 액세스, 터미널 에뮬레이션 및 (분산 된) 네트워크 관리에 수년 동안 (Windows에서 실행하거나 Wine을 사용하여) 사용했습니다. 그들은 마침내 2011 년 초에 기본 Linux 버전을 출시했습니다.

복잡한 로그인 설정 (또는 스크립트), 저장된 비밀번호 (또는 인증서), 여러 세션 탭 등을 지원합니다.

시작할 때 저장된 원격 (또는 로컬) 시스템의 구조화 된 목록 (트리보기)에서 원격 대상 (및 프로토콜)을 선택하거나 연결을 생성 한 다음 저장합니다.

고급 인증, 비표준 포트 또는 방화벽 액세스 협상이있는 원격 사이트에 특히 유용하다는 것을 알았습니다.

원격 액세스를 많이 수행하는 경우 (주 역할의 일부),이 응용 프로그램은 사용 첫 달에 비용을 정당화합니다.


미안, 이해가 안 돼 설명 할 수 있습니까?
Netmoon

1
당신을 위해 reworded ..
david6

2
위의 답변을 게시 한 후 2013 년 12 월 초에 방금 출시 된 최신 VanDyke를 포함하여 SecureCRT가 여러 차례 반복되었습니다. 각 반복은 프로그램을 개선하여 더욱 다양하게 만들었습니다. 또한 프로그램을 Python / VB 스크립트로 제어 / 인터페이스 할 수있는 풍부한 API가 있습니다. SecureCRT는 지난 10 년간 핵심 툴킷의 일부 였으므로 강력히 추천합니다.
Ville

동의했다. 나는 각각의 새로운 릴리스를 계속 베타 테스트했으며 우분투 로 포팅하기위한 초기 테스트에 크게 관여했습니다 .
david6

2

요청한 질문에 대답하면 ssh 구성 파일에서 기본 비밀번호를 구성 할 수 없습니다.

그러나 실제로, 당신이 말하는 것처럼, "때로는 PC에서 멀리 떨어져서 되돌아 가면 암호를 입력하고 Enter터미널을 누르 십시오 CONNECTION CLOSED" 라고 말하면 세션을 닫지 않는 것이 어떻습니까? SSH는 연결을 유지시켜줍니다.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2

1

감사합니다. Arek는 영감을주었습니다 ...

다른 쉘 프로세스를 실행하는 것이 아니라 현재 bash 쉘에서 실행되는 함수일뿐입니다. 그것은 하나의 실행 awk은 (와 쉘 변수 또는 SSH를 설정 파일에 암호가 기록 된 일반 텍스트에서 암호를해야하는 경우 설정 파일을 구문 분석하고 파악하는 명령 awkeval대신 describe내가 사용 충돌 문제로 인해이 describe).

ProxyCommand를 사용하여 구성 파일 sshpass에서 직접 사용하는 많은 방법을 시도했지만 sshRSA를 통해 상자에 로그인 할 수있는 경우를 제외하고는 예상대로 작동하지 않는 것 같습니다. 그러나 암호화 된 디렉토리를 열려면 암호를 보내야했습니다. 그러나 아래의 기능은 Cygwin에서도 모든 경우에 효과적입니다.

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

그런 다음 ~/.ssh/config섹션은 다음과 같습니다.

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

#Passvar 구성 섹션에가 있으면 이를 재정의합니다 #Password.
$MYPASS_ENVVAR비밀번호를 보유한 환경 변수입니다.

즐겨!


1

@BrunoPereira에의 대답 이 질문은 명시 적으로 암호를 입력하고 SSH 키 회피없이 연결하는 대안적인 방법을 도시한다.

스크립트, 별명 또는 함수를 작성하여 ~/.bashrc해당 명령을 빠르게 실행할 수 있습니다.

분명히이 접근 방식에는 고려해야 할 보안 고려 사항이 있습니다.


솔루션에 연결하는 것이 좋지만 여기에 솔루션을 게시하는 것이 좋습니다. 이런 식으로 링크가 제거되면 (때로는 스택 교환에서 발생하는 것처럼) 여기에 여전히 유용한 대답이 있습니다.
Paul

0

@ArekBurdach의 대답에 대한 정교한 변형이 있습니다. 다음과 같은 확장 기능을 제공합니다.

  • 호스트는 어디서나 할 수 있습니다 ssh명령 줄; 즉, 그것은 또한 ssh <args> <host> <commands>구문을 지원 합니다
  • 경로를 하드 코딩하지 않습니다 ssh
  • 보다 강력한 구문 분석 ssh_config
  • 보너스 :에 대한 래퍼 scp

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

설치

에 별칭을 정의하십시오 ~/.bashrc.

alias ssh=ssh-wrapper
alias scp=scp-wrapper

구성

IgnoreUnknown지시문을 사용하면 ssh새로 도입 된 Password지시문 에 대해 불평하지 않으므로 @ArekBurdach의 답변과 달리 "실제"구성으로 표시 할 수 있습니다. 마음에 들지 않으면 스크립트를 주석 처리 된 스크립트로 다시 변경하는 것이 쉽지 않습니다.

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword

0

키 쌍에 직접 액세스 할 수없는 경우 로컬 컴퓨터에서 비밀번호를 암호화 할 수 있습니다.

이를 수행하는 방법은 @Eric Woodruff의 ProxyCommand 외에도 사용하여 비밀번호를 암호화하는 것 입니다.

결합하는 방법은 파이프를 사용하는 것입니다.

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

어디

Host real-destination
    Hostname test.com
    User netmoon

0

블로그에서 사용 sshpass 하는 방법에 대한 약간의 변형이 있습니다 . gpg 암호화 된 암호 (블로그에서 설명하는 방법) 파일이 있다고 가정하면 다음과 같이 할 수 있습니다.

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

해당 명령을에 별칭으로 저장하면됩니다 .bashrc.

해당 연결을 통해 터널링하려는 경우 다음과 같은 작업을 수행 할 수 있습니다

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.