Let say that you need to run a command on many remote machine and you cannot use any of specialist tools (I mean i.e.
func). In such situation expect might be helpful and I even
has written about it already. Recently I had to modified my script, cause not all remote systems have the same root password.
#!/usr/bin/expect -f
set timeout -1
set machine [lindex $argv 0]
set command [lindex $argv 1]
set pass "xen4ulez\r"
puts $machine
spawn ssh -o "NumberOfPasswordPrompts 2" -o "ServerAliveCountMax 1" -l root $machine $command
match_max 100000
expect {
"assword:"
{
exp_send $pass
set pass "xen!king\r"
exp_continue
}
}
First, the script has a password set as a variable. It allows to change later. To to this I have expanded the 'expect password' part of the script. Now the script sends the password and changes it after. If the password was fine, script executes the command. The change of the password is not important. If the password is wrong the script sends the variable $pass again, but this time it is new value. I have also added to option to ssh command for script to run a bit faster.
- NumberOfPasswordPrompts 2 - ensure that ssh tries only twice to provide password.
- ServerAliveCountMax 1 - ensure that ssh sends only one Server Alive message
Finally I have set
StrictHostKeyChecking no and
UserKnownHostsFile /dev/null in the .ssh/config file for machines I'm going to use above scripts. This two options set ssh not to bother about checking Host Key. Please remember that it might be not secure.