programing

Bash 스크립트에서 예상을 사용하여 SSH 명령에 암호 제공

stoneblock 2023. 5. 19. 23:57

Bash 스크립트에서 예상을 사용하여 SSH 명령에 암호 제공

는 려하고합니다용사를 사용하려고 합니다.expect입니다. SSH 파일 Bash 파일 이름은 Bash 파일 이름입니다.암호를 제공하는 것은 효과가 있지만 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 스크립트로 돌아가고 싶습니다.

는 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠexpect메뉴를 사용해야 하기 때문입니다.연결할 장치/장치를 선택할 수 있습니다.

SSH 키를 사용해야 한다는 답변을 원하는 분들은 기권해 주시기 바랍니다.

Bash와 Expect를 혼합하는 것은 원하는 효과를 얻기 위한 좋은 방법이 아닙니다.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 }'

그러면 대화형 세션이 시작될 때까지 기다렸다가 (잠시) 되돌아갑니다.

가장 쉬운 방법은 sshpass를 사용하는 것입니다.Ubuntu/Debian 저장소에서 사용할 수 있으며 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\r"
interact
EOD
echo "you're out"

이렇게 하면 로그아웃할 때까지 원격 시스템과 상호 작용할 수 있습니다.그럼 다시 바시로 돌아가겠군요

몇 달 동안 질문에 대한 답을 찾다가 마침내 정말 최고의 해결책을 찾았습니다. 바로 간단한 스크립트를 작성하는 것입니다.

#!/usr/bin/expect

set timeout 20

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

eval spawn $cmd
expect "assword:"   # matches both 'Password' and 'password'
send -- "$password\r"; # -- for passwords starting with -, see https://stackoverflow.com/a/21280372/4575793
interact

!어./usr/bin/exp그러면 다음을 사용할 수 있습니다.

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

알았어!

간단한 Expect 스크립트:

파일 원격 로그인.해외의

    #!/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>

또한 사용해야 합니다.

send -- "$PWD\r"

대신 대시(-)로 시작하는 암호가 실패하기 때문입니다.

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

도구 fd0ssh(hxtools에서, unbuntu용 소스, 오픈용 소스)pmt가 아닌 SUSE).특정 프롬프트를 기대할 필요 없이 작동합니다.ssh프로그램.

또한 "sshpass가 하는 것처럼 명령줄에서 암호를 전달하는 것보다 훨씬 안전합니다."(찰스 더피의 논평)

Bash 스크립트에서 작은 Expect 스크립트를 사용하는 데 유용한 또 다른 방법은 다음과 같습니다.

...
Bash script start
Bash commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
More Bash commands
...

이는 다음과 같은 이유로 작동합니다....If the string "-" is supplied as a filename, standard input is read instead...

sshpassSublime Text 빌드 대상 내부, Makefile 내부에서 사용하려고 하면 깨집니다.대신에sshpass사용할 수 있습니다.

와 함께sshpass다음을 수행할 수 있습니다.

sshpass -p pa$$word ssh user@host

와 함께passh다음을 수행할 수 있습니다.

passh -p pa$$word ssh user@host

참고: 잊지 말고 사용하십시오.-o StrictHostKeyChecking=no그렇지 않으면 처음 사용할 때 연결이 중단됩니다.예:

passh -p pa$$word ssh -o StrictHostKeyChecking=no user@host

참조:

  1. SSH 연결에서 Expect 스크립트를 사용하여 암호에 대한 보내기 명령이 작동하지 않음
  2. SSH에서 엄격한 호스트 키 검사를 사용하지 않도록 설정하려면 어떻게 해야 합니까?
  3. SSH 호스트 키 검사를 사용하지 않도록 설정하는 방법
  4. scp known_message 확인 안 함
  5. pam_mount 및 sshfs(암호 인증 포함)

언급URL : https://stackoverflow.com/questions/4780893/use-expect-in-a-bash-script-to-provide-a-password-to-an-ssh-command