[linux] Bash 스크립트에서 Expect를 사용하여 SSH 명령에 비밀번호를 제공하십시오.

SSH 비밀번호를 제공하기 위해 Bash 스크립트에서 Expect를 사용하려고합니다. 암호를 제공해도 작동하지만 SSH 세션에서 끝나지 않습니다. 배쉬에게 해협으로 돌아 간다.

내 스크립트 :

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"

내 스크립트의 출력 :

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out

SSH 세션이 있고 종료 할 때만 Bash 스크립트로 돌아가고 싶습니다.

내가 예상하기 전에 Bash를 사용하는 이유는 메뉴를 사용해야하기 때문입니다. 연결할 장치 / 장치를 선택할 수 있습니다.

SSH 키를 사용해야한다고 응답하려는 사람들은 기권하십시오.



답변

배쉬와 기대를 혼합하는 것은 원하는 효과를 얻는 좋은 방법이 아닙니다. Expect 만 사용하려고합니다.

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com

# Use the correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

bash의 샘플 솔루션은 다음과 같습니다.

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

그러면 Enter인터랙티브 한 세션 을 기다렸다가 잠시 기다립니다 .


답변

가장 쉬운 방법은 sshpass 를 사용하는 입니다. 우분투 / 데비안 리포지토리 에서 사용할 수 있으며 Bash와의 통합을 처리 할 필요가 없습니다.

예를 들면 :

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

위 명령은 Bash 스크립트와 쉽게 통합 할 수 있습니다.

참고 : 보안 관련 사항을man sshpass 완전히 이해 하려면 보안 고려 사항 섹션을 읽으십시오 .


답변

EOD 바로 앞에 ‘interact’Expect 명령을 추가하십시오.

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send "$PWD\n"
interact
EOD
echo "you're out"

로그 아웃 할 때까지 원격 시스템과 상호 작용할 수 있어야합니다. 그런 다음 Bash로 돌아갑니다.


답변

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

#!/usr/bin/expect

set timeout 20

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

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

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

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

끝난!


답변

또한 사용하십시오

send -- "$PWD\r"

대신 대시 (-)로 시작하는 비밀번호는 실패합니다.

위의 명령은 대시로 시작하는 문자열을 send 명령의 옵션으로 해석하지 않습니다.


답변

간단한 Expect 스크립트 :

파일 Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh $user@$ip
    expect "password"
    send "$password\r"
    interact

예:

./Remotelogin.exp <ip> <user name> <password>


답변

헬퍼 도구를 사용하십시오 fd0ssh(ppt가 아닌 hxtools에서). ssh프로그램 에서 특정 프롬프트를 기대하지 않아도 작동 합니다.