비밀번호로 SSH 로그인을 자동화하는 방법은 무엇입니까? 테스트 VM을 구성하고 있으므로 강력한 보안은 고려되지 않습니다. 최소한의 구성으로 허용 가능한 보안을 위해 SSH를 선택했습니다.
전의)
echo password | ssh [email protected]
작동하지 않습니다.
누군가 나를 안내하는 몇 가지 트릭 으로이 작업을 수행했지만 지금 사용했던 트릭을 기억할 수 없습니다 ...
비밀번호를 사용하지 마십시오. 암호가없는 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 [email protected]
[email protected]'s password:
이제 ssh '[email protected]'
하고 체크인하십시오.
.ssh/authorized_keys
예상치 못한 키를 추가하지 않았는지 확인하십시오.
마지막으로 로그인을 확인하십시오…
$ ssh [email protected]
[email protected]:~$
ssh-agent
암호를 사용하여 키를 보호하려는 경우.
$ Sudo apt-get install sshpass
$ sshpass -p your_password ssh [email protected]
귀하의 질문에 대한 정답은 sshpass ( 자세한 내용은 다른 답변 참조 )이지만 더 안전한 방법은 SSH 키입니다. 당신은 단지 세 가지 쉬운 단계 해결책에서 떨어져 있습니다.
rsa keypair 생성을 시작하려면 다음 명령을 입력하십시오.
# ssh-keygen
'키를 저장할 파일을 입력하십시오'라는 메시지가 나타나면 Enter를 눌러 파일 이름을 비워 두십시오.
터미널에서 암호를 입력하라는 메시지가 표시되면이 암호도 비워두고 Enter를 누르십시오.
그런 다음 one simple command을 사용하여 키 쌍을 서버에 복사하십시오.
# ssh-copy-id [email protected]
이제 비밀번호없이 로그인 할 수 있습니다 :
# ssh [email protected]
사용 예상 :
#!/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 [email protected]$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact
예:
# ./1.ex password localhost ooshro
spawn ssh [email protected]
[email protected]'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
아무도 plink
에서 PuTTY-tools
우분투 패키지 :
plink [email protected] -pw mypass [cmd]
Windows에서도 사용할 수 있으며 구문은 대부분 openssh 클라이언트와 호환됩니다.
이것은 당신에게 유용하지 않을 수도 있지만 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! $!";
SSH 싱글 사인온은 일반적으로 공개 키 인증 및 인증 에이전트를 사용하여 수행됩니다. test VM 키를 기존 인증 에이전트에 쉽게 추가 할 수 있습니다 (아래 예 참조). gssapi/kerberos와 같은 다른 방법이 존재하지만 더 복잡합니다.
password
가 사용 가능한 유일한 인증 방법 인 경우 sshpass 를 사용하여 자동으로 암호를 입력 할 수 있습니다. man page 의 보안 고려 사항 섹션에 특히주의하십시오. 세 가지 옵션 모두 암호는 어느 시점에서 일반 텍스트로 표시되거나 저장됩니다 .
# 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 [email protected]
# 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 [email protected]
Sshpass가 실행되는 동안 귀하와 root는 프로세스의 환경 변수 (예 : 비밀번호)를 읽을 수 있습니다 (cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=
). 기회의 창은 훨씬 길지만 여전히 다른 사용자가 아닌 자신의 프로세스 또는 루트로 제한됩니다.
sshpass -p my_secret_password ssh [email protected]
매뉴얼 페이지에 설명 된 것처럼 편리하지만 덜 안전합니다. 명령 줄 인수는 모든 사용자에게 표시됩니다 (예 : ps -ef | grep sshpass
). sshpass는 인수를 숨기려고 시도하지만 모든 사용자 가 인수에 의해 전달 된 비밀번호를 볼 수있는 창이 여전히 있습니다.
Bash HISTCONTROL 변수 를 ignorespace
또는 ignoreboth
로 설정하고 민감한 명령 앞에 공백을 추가하십시오. 그들은 역사에 저장되지 않습니다.
# 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 [email protected]
암호는 매우 중요합니다. 개인 키 파일을 얻는 사람은 암호 없이는 사용할 수 없습니다.
# 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 [email protected]
개인 키는 암호화되어 있으며 암호 입력을 한 번만 입력하면됩니다 (안전한 입력 방법을 통해서도).
암호 대신 SSH 키를 사용하고 싶지 않습니까? 그렇게하면 안전하고 자동적입니다.
자동화 요구에 따라 아마도 Ansible이 적합 할 것입니다. 암호 묻기, Sudo 암호 묻기, 다양한 사용 변경 방법, 암호화 된 비밀 (볼트)을 안전하게 사용하는 등의 작업을 훌륭하게 관리 할 수 있습니다.
그것이 적합하지 않은 경우 다른 답변에서 제안한대로 Expect를 제안합니다.
나는 passh
https://github.com/clarkwang/passh
sshpass는 의도적으로 손상되었습니다.
ssh 서버가 이미 내 known_hosts
에 추가되지 않은 경우 sshpass
에서 서버를 알려진 호스트에 추가하라는 메시지를 표시하지 않습니다. passh
에는이 문제가 없습니다.
원격 서버에 로그인하십시오.
$ passh -p password ssh [email protected]