!/usr/bin/env bash

!/usr/bin/env bash

Desde un script bash:

source ./expect.sh

Estoy incluyendo un código de espera:

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

Y me sale esto:

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: 

Luego intento conectarme y me pide una contraseña...

Al verificar el servidor, estoy seguro de que no se cargó ninguna clave porque esperaría incluir el archivo "claves_autorizadas":

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

¿Qué estoy haciendo mal?

Respuesta1

El problema es que el cliente ssh lee directamente la contraseña desde la terminal, no desde la entrada estándar.

La forma más sencilla que conozco para solucionar este problema es instalar 'sshpass' y luego usar esto (sin esperar):

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

Respuesta2

El siguiente script también debería funcionar

#!/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"; }
}

Debe hacerlo ejecutable y llamarlo de la siguiente manera:

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

En tu caso:

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

Respuesta3

Está copiando la clave en /root/.ssh/authorized_keyslugar de la cuenta de usuario. Fíjate donde dice:[email protected]'s password:

Respuesta4

!/usr/bin/env bash

          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 }
                          }
                      }
                  }
              }
          }"
          }

huellas dactilares

información relacionada