2

I am automating the process of:
Connect to a system named "alpha" via ssh with password "alpha" for username "alpha". Once connected I would like to set the root password (to "kickass"). The system I am connecting to doesn't have a root password by default. I wrote this expect script to do the job but it doesn't work consistently. It works once and then if I change the password to test again, it waits at the "Enter new UNIX password:" prompt after issuing "sudo passwd root". Any ideas?

#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
set force_conservative 1  ;# set to 1 to force conservative mode even if
              ;# script wasn't run conservatively originally
if {$force_conservative} {
    set send_slow {1 .1}
    proc send {ignore arg} {
        sleep .1
        exp_send -s -- $arg
    }
}

set timeout -1
spawn ssh alpha@$arg1
match_max 100000
expect -exact "password: "
send -- "alpha\r"
expect -exact "alpha@alpha:~\$ "
send -- "sudo passwd root\r"
expect -exact "password for alpha: "
send -- "alpha\r"
expect -exact "new UNIX password: "
send -- "kickass\r"
expect -exact "Retype new UNIX password: "
send -- "kickass\r"
expect -exact "alpha@alpha:~\$ "
send -- "exit\r"
expect eof

Thanks.

fzkl
  • 977
  • 3
  • 11
  • 17
  • It's better, if you can, to use short strings in the `expect` command. It may make a difference to include only the last few characters of the prompt. – Dennis Williamson Dec 31 '10 at 00:50
  • Tried this. Didn't work :(. I can't figure why it works the first time around and then fails if I change the password in the script and run it again. – fzkl Dec 31 '10 at 07:36
  • 2
    Maybe sudo works the second time without requesting a password. – Andrei Sfrent Jan 08 '11 at 20:51

1 Answers1

2

Expanding on Andrei Sfrent's comment:

Sudo normally has some kind of time-out value, so that if you issue a second sudo command within the time-out period you will not be asked for your password again. You could modify the code to something like this:

send -- "sudo passwd root\r"
expect {
        -exact "password for alpha: "
            {
                send -- "alpha\r"
                exp_continue
            }

        -exact "new UNIX password: "
            {
                send -- "kickass\r"
            }
        }
dr-jan
  • 2,124
  • 2
  • 21
  • 22