0

I have this script I run from a Linux machine to change root password on remote Solaris machine reachable by ssh. All seems to be fine, passwd command asks for a password, second password, reply that is not 8 chars long and finishes with ... updated successfully, but when I go to Solaris and I check, password is not changed. shadow file is not modified. I can change password directly on the Solaris box with no problems.

$ cat ./expect2.txt
#!/usr/bin/expect --
# Input: username password hostname
set USER [lindex $argv 0]
set PASS [lindex $argv 1]
set IP   [lindex $argv 2]
  
spawn ssh user1@$IP
expect "user1" 
spawn sudo passwd $USER
expect "assword:"
send "$PASS\r"
expect "assword:"
send "$PASS\r"
expect eof

exit
exit

I run the script:

$ expect  ./expect2.txt root abc123 host1
spawn ssh user1@host1
host1 user1 : spawn sudo passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

Debug

$ expect -d ./expect2.txt root abc123 host1
expect version 5.45.4
argv[0] = expect  argv[1] = -d  argv[2] = ./expect2.txt  argv[3] = root  argv[4] = abc123  argv[5] = host1
set argc 3
set argv0 "./expect2.txt"
set argv "root abc123 host1"
executing commands from command file ./expect2.txt
spawn ssh user1@host1
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {2669765}

expect: does "" (spawn_id exp4) match glob pattern "user1"? no
match glob pattern "user1"? yes
expect: set expect_out(0,string) "user1"
expect: set expect_out(spawn_id) "exp4"
spawn sudo passwd root
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {2669769}

expect: does "" (spawn_id exp7) match glob pattern "assword:"? no
Changing password for user root.
New password:
expect: does "Changing password for user root.\r\nNew password: " (spawn_id exp7) match glob pattern "assword:"? yes
expect: set expect_out(0,string) "assword:"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "Changing password for user root.\r\nNew password:"
send: sending "abc123\r" to { exp7 }

expect: does " " (spawn_id exp7) match glob pattern "assword:"? no

BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
expect: does " \r\nBAD PASSWORD: The password is shorter than 8 characters\r\nRetype new password: " (spawn_id exp7) match glob pattern "assword:"? yes
expect: set expect_out(0,string) "assword:"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) " \r\nBAD PASSWORD: The password is shorter than 8 characters\r\nRetype new password:"
send: sending "abc123\r" to { exp7 }

passwd: all authentication tokens updated successfully.
expect: read eof
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) " \r\npasswd: all authentication tokens updated successfully.\r\n"
2
  • This does not caused the problem here, it's just warning, I tested with longer passwords too. The password is shorter than 8 characters
    – Nicco
    May 16, 2022 at 14:26
  • Incidentally, if you receive an answer that works for you, please remember to accept it with the ✔. This applies not only here but to your previous questions too (1 and 2), as well as answers on other StackOverflow sites. May 16, 2022 at 15:08

1 Answer 1

1

This starts a remote session to the host represented by $IP:

spawn ssh user1@$IP
expect "user1"

This starts a new session to change the password for the user represented by $USER:

spawn sudo passwd $USER
expect "assword:"

Note that the two sessions are independent of each other, and you are changing the password for $USER on the local host. You probabably intended send rather than spawn.

1
  • And this is it, thanks so much!
    – Nicco
    May 16, 2022 at 15:22

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .