To those who want to reply that I should use SSH keys please abstain
I'm trying to use expect in an bash script to provide the SSH password. Providing the password works but I don't end up in the SSH session as I should, it goes back strait to bash.
My script:
#!/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"
The output of my script:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
I would like to have my SSH session and only when I exit it to go back to my bash script. The reason why I am using bash before expect is because I have use a menu I can choose which unit to connect to.
Thanks
Mixing bash and expect is not a good way to achieve the desired effect. I'd try to use only Expect:
Sample solution for bash could be:
This will wait for enter and than return (for a moment) interactive session.
A simple expect script
Remotelogin.exp
Example:
Also make sure to use
instead, as passwords starting with a dash (-) will fail otherwise.
The above wont interpret a string starting with a dash as an option to the send command.
The easiest way is to use sshpass. This is available in Ubuntu/Debian repos and you don't have to deal with integrating expect with bash.
An example:
The above command can be easily integrated with a bash script.
Note: Please read Security Considerations section in
man sshpass
for full understanding of security implications.Another way that I found useful to use a small expect script from a bash script is as follows.
This works because
...If the string "-" is supplied as a filename, standard input is read instead...
Add the 'interact' expect command just before your EOD:
This should let you interact with the remote machine until you logout. Then you'll be back in bash.