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
프로그램 에서 특정 프롬프트를 기대하지 않아도 작동 합니다.