비밀번호로 SSH 로그인을 자동화하는 방법은 무엇입니까?


419

비밀번호로 SSH 로그인을 자동화하는 방법은 무엇입니까? 테스트 VM을 구성하고 있으므로 강력한 보안은 고려되지 않습니다. 최소한의 구성으로 허용 가능한 보안을 위해 SSH를 선택했습니다.

전의)

echo password | ssh id@server

작동하지 않습니다.

누군가 나를 안내하는 몇 가지 트릭 으로이 작업을 수행했지만 지금 사용했던 트릭을 기억할 수 없습니다 ...


2
FreeBSD는 암호가없는 키를 허용하지 않았습니다. 유혹하지 마십시오. 그러나 일부 Linux 서버는이를 승인했습니다. Linux 서버가 잘못 구성되었다고 생각합니다.
Eonil

16
이것은 유효한 질문입니다. 예를 들어, 사용자가 암호를 입력 한 다음이를 사용하여 다른 컴퓨터에 로그인 할 수 있도록하려고합니다. 모든 머신에 ssh 키가 분산되어 있다고 가정 할 수는 없습니다. 지금까지 아래 답변은이 상황에 도움이되지 않습니다.
dfrankow


매우 중요한 질문입니다. 웹 공간 공급자가 서버에 키 파일을 넣으려면 블록이 필요하므로 키 파일없이 암호를 전달해야합니다.
Radon8472

답변:


382

비밀번호를 사용하지 마십시오. 암호가없는 SSH 키를 생성하여 VM에 푸시하십시오.

이미 SSH 키가있는 경우이 단계를 건너 뛸 수 있습니다 Enter. 키와 두 암호를 모두 누르십시오.

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

키를 대상 서버에 복사하십시오.

$ ssh-copy-id id@server
id@server's password: 

이제로 시스템에 로그인 ssh 'id@server'하고 체크인하십시오.

.ssh/authorized_keys

예상치 못한 키를 추가하지 않았는지 확인하십시오.

마지막으로 로그인을 확인하십시오…

$ ssh id@server

id@server:~$ 

ssh-agent암호를 사용하여 키를 보호하려는 경우 사용 방법을 살펴볼 수도 있습니다 .


14
마침내 키 페어를 사용하기로 결정했습니다. 그것이 가장 간단한 방법이라는 것을 깨달았 기 때문에.
Eonil

9
@Eonil : 암호 문구없이 키를 사용하려는 유혹을받지 마십시오. ssh-agent 또는 pageant 사용법에 대해 알아보십시오.
user619714

119
이것은 정답이지만 질문에 대한 정답은 아닙니다.
존 헌트

74
이런 종류의 답변은 정말로 나를 귀찮게합니다. 그것은 질문이 아니었다. 아무도 키 페어를 사용하는 방법을 묻지 않았습니다.
Matt Fletcher

16
이것은 질문에 대답하지 않습니다. 완전히 다른 질문에 대한 좋은 대답이지만 질문 한 사람에게는 끔찍합니다.
srchulo

594
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
그렇습니다. 때로는 여러 가지 이유로 키 기반 인증을 사용할 수 없습니다. 예를 들어 지금은 상자가 활성화되어 있지 않고 루트가 없기 때문에 plesk 서버에서 키 인증을 사용할 수 없습니다.
존 헌트

17
+1! 참고로, RSA 지문을 확인 sshsshpass
하려면를

21
명령에서 비밀번호를 사용해야하는 경우 -1입니다. .bash_history컴퓨터에서 비밀번호를 일반 텍스트로 기록합니다.

15
@MisterDood history -r명령을 실행 한 후 실행 기록을 지울 수 있습니다. 그래도 좋은 지적입니다.
NuclearPeon

20
전문가 팁 : .bash_history에 특정 명령을 표시하지 않으려면 명령 앞에 공백을 추가하십시오. 그냥 작동합니다. 그러나이 명령을 사용하는 사용자는 시스템의 권한이없는 사용자가 ps를 사용하여 전체 명령 행을 볼 수 있다는 점에 더욱 관심을 가져야합니다. 물론 암호도 포함되어 있습니다. ssh 세션은 오래 지속되는 경향이 있기 때문에 이는 보안 문제입니다.
CubicleSoft

71

귀하의 질문에 대한 정답은 sshkey 이지만 더 안전한 방법은 SSH 키입니다. 당신은있는 3 단계 떨어져 솔루션에서 :

rsa 키 쌍을 생성하십시오 .

# ssh-keygen

그런 다음 하나의 간단한 명령으로 서버에 복사하십시오 .

# ssh-copy-id userid@hostname

이제 비밀번호없이 로그인 할 수 있습니다 .

# ssh userid@hostname

1
기본값으로 잘 작동합니다. ~ / rsa4live.pub를 사용하면 시도하지 않았습니다 ssh-copy-id.
Cees Timmerman 2016 년

1
이 단계를 다른 사용자에게 적용하려면 다음을 수행하십시오. 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
나에게 그것은ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair

21
이것은 질문에 대한 답변이 아닙니다.
Steve Bennett

2
과? 대답은 위에있다, sshpass ...
lzap

40

사용 예상 :

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

예:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
작동했지만 원격 시스템의 stdout을 인쇄 할 수 없습니다.
Eonil

IP 주소가 매번 변경되므로 일부 컴퓨터에서는 키를 미리 넣을 수 없습니다.
larrycai

4
-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullssh 명령 을 추가 하고 known_hosts에 시스템을 허용하지 않도록하는 것이 좋습니다.
larrycai

B .. b하지만 muh ssh 키 ...
Damien Ó Ceallaigh

이 스크립트에 대한 더 자세한 예는 다음에서 찾을 수 있습니다. linuxaria.com/howto/… 이 예제는 원격 명령에서도 작동합니다.
Radon8472

16

이것은 당신에게 유용하지 않을 수도 있지만 Perl로 할 수 있습니다.

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";


15

내가 언급 한 놀라 누구도 생각하지 plink으로부터 putty-tools우분투 패키지를 :

plink user@domain -pw mypass  [cmd]

Windows에서도 사용할 수 있으며 구문은 대부분 openssh 클라이언트와 호환됩니다.


Windows 용 당신의 대답은 좋다, unfurtunally 리눅스 / 유닉스 사용자는 일반적으로 가용 스루풋 필요 없다
Radon8472

2
그것은에 putty-tools패키지
eadmaster

10

SSH 싱글 사인온은 일반적으로 공개 키 인증 및 인증 에이전트를 사용하여 수행됩니다. 테스트 VM 키를 기존 인증 에이전트에 쉽게 추가 할 수 있습니다 (아래 예 참조). gssapi / kerberos와 같은 다른 방법이 존재하지만 더 복잡합니다.

sshpass

상황에서 password사용할 수있는 유일한 인증 방법입니다, sshpass가 자동으로 암호를 입력 할 수 있습니다. 맨 페이지보안 고려 사항 섹션에 특히주의 하십시오 . 세 가지 옵션 모두 에서 비밀번호는 어느 시점에서 일반 텍스트로 표시되거나 저장됩니다 .

익명 파이프 (sshpass에서 권장)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

bash에서는 꽤 번거롭고 프로그래밍 언어로는 더 쉽습니다. 암호를 작성하기 전에 다른 프로세스가 파이프 / fd에 부착 될 수 있습니다. 기회의 창은 상당히 짧으며 프로세스 또는 루트로 제한됩니다.

환경 변수

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

sshpass가 실행되는 동안 귀하와 root는 프로세스의 환경 변수 (예 : 비밀번호)를 읽을 수 있습니다 ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). 기회의 창은 훨씬 길지만 여전히 다른 사용자가 아닌 자신의 프로세스 또는 루트로 제한됩니다.

명령 줄 인수 (최소 보안)

 sshpass -p my_secret_password ssh user@host

이 매뉴얼 페이지에 설명 된 것처럼 편리하지만 덜 안전합니다. 명령 줄 인수는 모든 사용자에게 표시됩니다 (예 :) ps -ef | grep sshpass. sshpass는 인수를 숨기려고하지만 모든 사용자 가 인수에 의해 전달 된 암호를 볼 수 있는 창이 여전히 있습니다.

사이드 노트

bash HISTCONTROL 변수 를 설정 ignorespace하거나 ignoreboth민감한 명령 앞에 공백을 추가하십시오. 그들은 역사에 저장되지 않습니다.


SSH 공개 키 인증

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

암호는 매우 중요합니다. 개인 키 파일을 얻는 사람은 암호 없이는 사용할 수 없습니다.

SSH 인증 에이전트 설정

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

평소와 같이 연결

ssh user@host

개인 키는 암호화되어 있으며 암호 입력을 한 번만 입력하면됩니다 (안전한 입력 방법을 통해서도).


8

암호 대신 SSH 키를 사용하고 싶지 않습니까? 그렇게하면 안전하고 자동적입니다.


3
비밀번호없이 SSH 키를 사용하는 것은 파일에서 비밀번호를 사용하는 것보다 약간 더 안전합니다.
yunzen

10
@yunzen 잘못되었습니다. 키 인증은 호스트 키를 모르더라도 미트 공격으로부터 사용자를 보호합니다. 침입자는 서버를 가장 할 수는 있지만 실제 서버에 연결하지는 않습니다. 비밀번호 인증을 사용하면 연결 한 (법적이든 아니든) 모든 서버에 비밀번호가 표시됩니다. 이러한 이유로 비밀번호가없는 ssh 키는 비밀번호를 파일에 저장하는 것보다 훨씬 안전합니다.
kasperd

14
이것은 답이 아닙니다.
Steve Bennett

@SteveBennett 허용되는 답변과 동일하며 세부 정보는 적지 만 게시되었습니다.
Michael Hampton

3
글쎄, 나는 대답이 대답하지 않은 질문에 대한 적절한 대답이라고 말하고 싶습니다. 이것은 아무것도 아닙니다.
Steve Bennett

4

자동화 요구에 따라 아마도 Ansible이 적합 할 것입니다. 암호 묻기, sudo 암호 묻기, 다양한 사용 변경 방법, 암호화 된 비밀 (볼트)을 안전하게 사용하는 등의 작업을 훌륭하게 관리 할 수 ​​있습니다.

그것이 적합하지 않다면 다른 답변에서 제안한 것처럼 Expect를 제안합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.