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.
set timeout -1
set machine [lindex $argv 0]
set command [lindex $argv 1]
set pass "xen4ulez\r"
spawn ssh -o "NumberOfPasswordPrompts 2" -o "ServerAliveCountMax 1" -l root $machine $command
set pass "xen!king\r"
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.