!/usr/bin/env 배쉬

!/usr/bin/env 배쉬

Bash 스크립트에서:

source ./expect.sh

예상 코드를 포함하고 있습니다.

#!/bin/bash
/usr/bin/expect <<EOL
spawn ssh-copy-id -i /home/user/.ssh/id_rsa.pub 111.111.111
expect '*?assword*'
send 'thepassword'
interact
EOL

그리고 나는 이것을 얻고 있습니다 :

spawn ssh-copy-id -i /home/user/.ssh/id_rsa.pub 111.111.111.111
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: 

그런 다음 연결을 시도하면 비밀번호를 묻는 메시지가 나타납니다.

서버를 확인한 결과 "authorized_keys" 파일을 나열할 것으로 예상되므로 키가 업로드되지 않은 것으로 확신합니다.

root@server: ls /home/user/.ssh/
known_hosts

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

문제는 SSH 클라이언트가 stdin이 아닌 터미널에서 직접 비밀번호를 읽는다는 것입니다.

내가 아는 가장 쉬운 방법은 'sshpass'를 설치한 다음 이것을 사용하는 것입니다(Expect 없이):

sshpass -p "thepassword" ssh-copy-id -i /home/user/.ssh/id_rsa.pub [email protected]

답변2

다음 스크립트도 트릭을 수행해야합니다

#!/usr/bin/expect -f
#
# Install RSA SSH KEY with no passphrase
#

set user [lindex $argv 0]
set host [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh-copy-id -i /path/to/your/.ssh/id_rsa.pub $user@$host

expect {
    "continue" { send "yes\n"; exp_continue }
    "assword:" { send "$password\n"; }
}

실행 가능하게 만들고 다음과 같이 호출해야 합니다.

./ssh-copy-id.exp <user> <host> <password>

귀하의 경우:

./ssh-copy-id.exp root 111.111.111.111 thepassword

답변3

/root/.ssh/authorized_keys사용자 계정이 아닌 키를 복사하고 있습니다 . 다음 내용을 참고하세요.[email protected]'s password:

답변4

!/usr/bin/env 배쉬

          fingerprints(){
          /usr/bin/expect -c "set timeout 50; spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p\ <port num>\ root@$<your server>;
          
          expect {
                  \"assword: \" {
                  send \<your pwd>\n\"
                  expect {
                      \"again.\"     { exit 1 }
                      \"expecting.\" { }
                      timeout      { exit 1 }
                  }
              }
              \"(yes/no)? \" {
                  send \"yes\n\"
                  expect {
                      \"assword: \" {
                          send \"<your pwd>\n\"
                          expect {
                              \"again.\"     { exit 1 }
                              \"expecting.\" { }
                              timeout      { exit 1 }
                          }
                      }
                  }
              }
          }"
          }

지문

관련 정보