스크립트를 사용하여 SSH 비밀번호 자동 입력


194

OpenSSH ssh클라이언트에 자동으로 비밀번호를 입력하는 스크립트를 작성해야합니다 .

myname@somehost비밀번호 를 사용하여 SSH로 연결해야한다고 가정 해 봅시다 a1234b.

이미 시도했습니다 ...

#~/bin/myssh.sh
ssh myname@somehost
a1234b

...하지만 작동하지 않습니다.

이 기능을 스크립트로 가져 오려면 어떻게해야합니까?

답변:


278

먼저 sshpass 를 설치해야합니다 .

  • 우분투 / 데비안 : apt-get install sshpass
  • 페도라 / CentOS : yum install sshpass
  • 아치: pacman -S sshpass

예:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM

맞춤 포트 예 :

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400

노트:

  • sshpass-f플래그가 전달 될 때 파일에서 암호를 읽을 수도 있습니다 .
    • 를 사용 -f하면 ps명령이 실행될 때 비밀번호가 표시되지 않습니다 .
    • 비밀번호가 저장된 파일에는 보안 권한이 있어야합니다.

12
이것은 Expect를 사용하는 것보다 훨씬 낫습니다.
Per Mejdal Rasmussen

5
sshpass가 같은 명령으로 암호를 차단하는 동안 ps -aux같은 컴퓨터의 다른 사용자가 암호를 볼 수 있기 때문에 암호를 입력하여 명령을 실행하면 안됩니다 ps -aux. 가능하다면 다른 답변에서 언급했듯이 공개 키 인증을 대신 사용하려고합니다. 이렇게하면 인증 정보를 스크립트와 분리하여 스크립트를 걱정없이 다른 사람들과 공유 할 수 있으며 나중에 스크립트를 암호화하지 않고도 ~ / .ssh 폴더에서 암호화를 활성화 할 수 있습니다.
Alexander Taylor

2
불행히도 이것은 사용자 정의 ssh 포트가있는 서버에서 작동하지 않습니다 ... ssh가 왜 명령 줄에 암호를 삽입하는 옵션을 제공 할 수 없습니까?
Andy

2
사용자 정의 포트가 작동하려면 명령 끝에 "-p port-number"를 추가하십시오
Ye Lwin Soe


96

몇 달 동안 질문에 대한 답을 찾은 후 마침내 더 나은 해결책을 찾았습니다. 간단한 스크립트 작성.

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

에 넣으면 /usr/bin/exp다음을 사용할 수 있습니다.

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

끝난!


2
이 답변은 더 많은 표를 얻습니다. 훌륭한 래퍼입니다. 다양한 플래그를 사용한 rsyncing 및 원격 명령 실행과 같은 몇 가지 일반적인 작업을 시도했지만 매번 작동했습니다. 유용한 스크립트의 도구 상자에 추가되었습니다. @damn_c 감사합니다!
user2082382

7
사람들이 기대하지 않았기 때문에 더 많은지지를 얻지 못했을 수도 있습니다.
clearlight

7
이것이 IMO가 그다지 좋은 대답이 아닌 이유는 암호가 스크립트에서 가장 안전하지 않은 방법으로 작성 되었기 때문입니다.
PierreE

8
컴퓨터에서 ps를 실행하는 모든 사람이 비밀번호를 볼 수 있습니다.
Daniel Persson


71

공개 키 인증 사용 : https://help.ubuntu.com/community/SSH/OpenSSH/Keys

소스 호스트에서 이것을 한 번만 실행하십시오.

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost

그 후에는 비밀번호없이 ssh를 수행 할 수 있습니다.


21
내가 참조. 그러나 암호를 사용하여 ssh해야합니다. "I"는 썸 드라이브에 스크립트가있을 수 있고 모든 컴퓨터에서 스크립트를 실행해야하기 때문입니다. 비밀번호 필요를 비활성화하지 않습니다.
user1467855

3
@ user1467855, 요구 사항을 더 잘 설명해야한다고 생각합니다. 아무도 당신이 안전하지 않은 네트워크를 가지고 있다고 제안하지 않습니다. 공개 키 방식에서는 여전히 사용자가 비밀번호로 로그인 할 수 있습니다. 그러나 개인 키를 썸 드라이브에 복사하면 썸 드라이브 만 암호없이 로그인 할 수 있습니다.
Aaron McDaid

5
불행히도 sysadmin은 rsa / dsa 키의 인증을 허용하지 않으며 암호가 필요하기 때문에 OP 상황에 있습니다. 당신은 무엇을 할 것입니다.
Karel Bílek

27
이것은 실제 질문에 대답조차하지 않기 때문에 하향 투표되었습니다.
Parthian Shot

2
여전히 첫 번째 로그인을 요구하고 스크립트에서 사용할 수 없습니다!
Mehrdad Mirreza

29

expects 스크립트를 사용할 수 있습니다. 나는 꽤 오랫동안 글을 쓰지 않았지만 아래와 같이 보일 것입니다. 스크립트를 사용하여#!/usr/bin/expect

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:" 
send "username\r"
expect "Password:"
send "password\r"
interact

제안한대로 다음과 같은 오류가 발생합니다./bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found
user1467855

내 대답을 올바르게 수정 해 준 Aaron에게 감사합니다. 예상을 위해 올바른 경로를 찾으려면 아래 명령을 실행해야 할 수도 있습니다. which expect
Lipongo

1
이 shebang 회선을 사용할 수도 있습니다.#!/usr/bin/env expect
glenn jackman

1
interactssh 세션이 실제로 대화식이되도록 끝에 추가 했습니다
Karel Bílek

스크립트에 일반 텍스트 비밀번호를 유지하는 데 큰 보안 위험이있는 경우 -1입니다.
Aaron Digulla

21

변형 I

sshpass -p PASSWORD ssh USER@SERVER

변형 II

#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact

-p플래그는 포트 번호를 지정하기위한 것입니다.
Kookerus

4
아니요. sshpass는 ssh가 아닙니다. SYNOPSIS sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
RemiZOffAlex

리눅스 CentOS는 당신이 필요 sshpass를 실행하기 위해 yum -y install epel-release다음과yum -y install sshpass
주니어 Mayhé

이러한 맥락에서이 데이터는 무시 될 수 있습니다.
RemiZOffAlex

나는 이것이 오래된 게시물이라는 것을 알고 있지만 Variant II 방법은 세션에 주어진 암호를 bash 기록에서 취약하게 남겨두면 매우 바람직하지 않습니다.
커클랜드

11

sshpass + autossh

이미 언급 한 것의 한 가지 좋은 보너스는와 sshpass함께 사용할 수 autossh있어 대화식 비 효율성을 더 많이 제거 한다는 것입니다 .

sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com

예를 들어 랩톱을 닫아서 Wi-Fi가 중단 된 경우 자동 재 연결이 가능합니다.


2
harding.motd.ca/autossh/README.txt 또한 superuser.com/questions/1278583/…-fwhen used with autossh, ssh will be *unable* to ask for passwords or passphrases.
allenyllee

9

sshpass 더 나은 보안

나는이 스레드를 우연히 발견하여 보그 다운 된 서버로 ssh하는 방법을 찾았습니다 .SSH 연결 시도를 처리하는 데 1 분이 걸렸으며 암호를 입력하기 전에 시간이 초과되었습니다. 이 경우 프롬프트가 표시되면 즉시 비밀번호를 제공 할 수 있기를 원했습니다 .

서버가이 상태 인 경우 공개 키 로그인을 설정하기에는 너무 늦습니다.

sshpass구조에. 그러나 이것보다 더 좋은 방법이 sshpass -p있습니다.

내 구현은 대화 형 암호 프롬프트로 직접 건너 뛰고 (공개 키 교환이 가능한지 시간을 낭비하지 않음) 암호를 일반 텍스트로 표시하지 않습니다.

#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh $@"

# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS 
export SSHPASS

# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"

# clear the exported variable containing the password
unset SSHPASS

1
참고 사항 : trapctrl-C가 SSHPASS변수 를 유출하지 못하도록 스크립트 업데이트
Ian

1
나는 PreferredAuthentications=keyboard-interactive그것이 PreferredAuthentications=password효과가 없지만 그것을 대체하는 것으로 나타났습니다 .
Mike Partridge

8

이것이 내가 서버에 로그인하는 방법입니다.

ssp <server_ip>
  • 별명 ssp = '/ home / myuser / Documents / ssh_script.sh'
  • 고양이 /home/myuser/Documents/ssh_script.sh

#! / bin / bash

sshpass -p mypassword ssh 루트 @ $ 1

따라서...

ssp server_ip

5
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1

# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh root@owned.com -p 22

참조 : https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card


3
나는이 기사가 냉소적이라고 생각한다.
Yan Foto

5

나는 누군가가 이것을 제안하는 것을 보지 못하고 OP는 방금 "스크립트"라고 말했습니다.

나는 같은 문제를 해결해야했고 가장 편안한 언어는 Python입니다.

나는 paramiko 라이브러리를 사용했습니다. 또한을 사용하여 에스컬레이션 된 권한이 필요한 명령을 실행해야했습니다 sudo. sudo는 "-S"플래그를 통해 stdin을 통해 비밀번호를 수락 할 수 있습니다! 아래를보십시오 :

import paramiko

ssh_client = paramiko.SSHClient()

# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)

# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"

ssh_client.connect(hostname="my.host.name.com",
                       username="username",
                       # Uncomment one of the following...
                       # password=password
                       # pkey=pkey
                       )

# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)

# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)

exit_status = chan.recv_exit_status()

if exit_status != 0:
    stderr = chan.recv_stderr(5000)

# Note that sudo's "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.

    logger.error("Uh oh")
    logger.error(stderr)
else:
    logger.info("Successful!")

이것이 누군가를 돕기를 바랍니다. 내 유스 케이스는 한 번에 ~ 300 서버에서 디렉토리를 작성하고 파일을 보내거나 untarring하고 프로그램을 시작하는 것이었다. 따라서 자동화가 가장 중요했습니다. 나는 시도 sshpass, expect다음이 함께했다.


2

나는 다음과 같이 작동했다.

.ssh / config가 yes / no 프롬프트를 제거하도록 수정되었습니다. 방화벽 뒤에있어 스푸핑 된 ssh 키에 대해 걱정하지 않습니다.

host *
     StrictHostKeyChecking no

응답에 대한 응답 파일을 작성하십시오 (예 : answer.expect).

set timeout 20
set node [lindex $argv 0]
spawn ssh root@node service hadoop-hdfs-datanode restart

expect  "*?assword {
      send "password\r"   <- your password here.

interact

bash 스크립트를 만들고 파일에서 expect를 호출하십시오.

#!/bin/bash
i=1
while [$i -lt 129]    # a few nodes here

  expect answer.expect hadoopslave$i

  i=[$i + 1]
  sleep 5

done

hadoop / conf 파일에 NFS 마운트를 사용한다고 가정하면 새로운 구성으로 128 hadoop 데이터 노드를 새로 고칩니다.

이것이 누군가에게 도움이되기를 바랍니다-나는 Windows numpty이고 이것은 알아내는 데 약 5 시간이 걸렸습니다!


"방화벽 뒤에있어 스푸핑 된 ssh 키에 대해 걱정하지 않습니다." 이 경우 방화벽은 정확히 아무 것도 수행하지 않습니다. HostKeyCheck는 다른 쪽의 호스트가 트로이 호스트가 아닌지 확인할 수 있도록합니다. 즉, 당신이 연결하고자하는 곳 인 척하는 것입니다. 알 수없는 호스트에 연결하고 자격 증명이나 토큰이있는 파일을 작성하거나 암호를 입력하는 등 민감한 작업을 수행하는 경우 해당 정보는 이제 효과적으로 공개됩니다. 방화벽 뒤에있는 것은 관련이 없습니다.
JCGB

2

Windows 시스템에서이 작업을 수행하는 경우 Plink (PuTY의 일부)를 사용할 수 있습니다.

plink your_username@yourhost -pw your_password




0

다음 예제에서는 내가 사용한 솔루션을 작성합니다.

시나리오 : sh 스크립트를 사용하여 서버에서 파일을 복사하고 싶습니다.

#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp userName@server-name:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")

echo "$my_script"

-2

스크립트 내에서이 스크립트를 사용하십시오. 첫 번째 인수는 호스트 이름이고 두 번째는 비밀번호입니다.

#!/usr/bin/expect
set pass [lindex $argv 1]
set host [lindex $argv 0]
spawn ssh -t root@$host echo Hello
expect "*assword: " 
send "$pass\n";
interact"

기존 답변 위에 무엇이 표시됩니까? 특히 damn_c, Lipongo 또는 RemiZOffAlex와 다른 사람들에 의해 ...
Martin Prikryl

ssh #! / usr / bin / expect set pass [lindex $ argv 1] set host [lindex $ argv 0] 스폰 ssh -t root @ $ host sh /tmp/anyscript.sh와 함께 스크립트 실행 "* assword :" "$ pass \ n"을 보내십시오; 상호 작용 "
Shivam Mehrotra

-3

쉘 스크립트를 통해 원격 컴퓨터를 연결하려면 아래 명령을 사용하십시오.

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS

여기서 IPADDRESS, USERNAMEPASSWORD스크립트에 제공 할 필요가 입력 값은, 또는 우리가 런타임 사용에 제공하려는 경우 명령을 "읽기".


5
이 답변은 기존 답변 위에 무엇을 표시합니까? + StrictHostKeyChecking=no결과를 설명하지 않고 사용하도록 제안하지 마십시오 .
Martin Prikryl

-5
sudo ssh username@server_ip_address -p port_number

키 입력을 누른 다음 시스템 암호를 입력하고 마지막으로 서버 암호를 입력하십시오

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