Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle multiple spawned processes in Expect script

Tags:

expect

Here is my use case for expect script ( one of few i have)

I want to run multiple sed command over ssh. Its like pre-build environment setup. I want to run something like this :-

#!/usr/bin/expect
set timeout -1

spawn -noecho bash -c "ssh -t user@host 'sed -i <some_stuff1> <file1>'"
spawn -noecho bash -c "ssh -t user@host 'sed -i <some_stuff2> <file2>'"
spawn -noecho bash -c "ssh -t user@host 'sed -i <some_stuff3> <file3>'"

expect {
  -re ".*sword.*" {
     exp_send "$env(PASS_WORD)\n"
     exp_continue
  }
}

But only last sed command will execute. 1st and 2nd will be skipped.

What could be the hidden gem i am missing?

Here is what i looked at so far but not helpful

  • Handle multiple statement in expect script
  • Expect script: How to handle two processes?
  • Handling multiple process simuntaneously - safari online book
like image 733
mihir6692 Avatar asked Nov 29 '25 16:11

mihir6692


1 Answers

You don't really need multiple (means parallel) spawn here.

#!/usr/bin/expect

set timeout 60

set cmds [list "ssh host1 ..." "ssh host2 ..." "ssh host3 ..."]

foreach cmd $cmds {
    spawn -noecho bash -c $cmd
    expect {
        -nocase "password" {
            exp_send "$env(PASS_WORD)\r"
            exp_continue
        }
        eof { wait } ; # at this time the last spawn'ed process has exited
    }
}
like image 168
pynexj Avatar answered Dec 02 '25 07:12

pynexj



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!