How to use expect in Bash script and ssh-copy-id

8,740

Solution 1

The problem is that the ssh client is reading directly from the terminal for the password, not from stdin.

The easiest way I know around this is to install 'sshpass', then use this (without Expect):

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

Solution 2

You are copying the key to /root/.ssh/authorized_keys rather than the user account. Note where it says: [email protected]'s password:

Solution 3

The following script should do the trick too

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

You need to make it executable, and call it as follow:

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

In your case:

./ssh-copy-id.exp root 111.111.111.111 thepassword
Share:
8,740

Related videos on Youtube

Roger
Author by

Roger

Be the change you want in the world! - M. Gandhi

Updated on September 18, 2022

Comments

  • Roger
    Roger over 1 year

    From a bash script:

    source ./expect.sh

    I am including a expect code:

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

    And I am getting this:

    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: 
    

    Then I try to connect and I am prompted for a password...

    Checking the server, I'm certain no key was uploaded because I would expect to list the "authorized_keys" file:

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

    What am I doing wrong?

  • FooBee
    FooBee over 8 years
    Fixed that to contain the actual username, see @seumasmac's answer.
  • derHugo
    derHugo over 6 years
    This is still missing to continue when getting the ECDSA key message..
  • Andrew Schulman
    Andrew Schulman almost 6 years
    Welcome to ServerFault. If you want your answer to be useful, please take time to format it correctly, and also explain it.