How to pass argument in Expect through the command line in a shell script

LinuxBashShellExpect

Linux Problem Overview


I am passing argument in Expect through the command line in a shell script.

I tried this

#!/usr/bin/expect -f
    
set arg1 [lindex $argv 0]
    
spawn lockdis -p
expect "password:" {send "$arg1\r"}
expect "password:" {send "$arg1\r"}
expect "$ "

But it's not working. How can I fix it?

Linux Solutions


Solution 1 - Linux

If you want to read from arguments, you can achieve this simply by

set username [lindex $argv 0];
set password [lindex $argv 1];

And print it

send_user "$username $password"

That script will print

$ ./test.exp user1 pass1
user1 pass1

You can use Debug mode

$ ./test.exp -d user1 pass1

Solution 2 - Linux

A better way might be this:

lassign $argv arg1 arg2 arg3

However, your method should work as well. Check that arg1 is retrieved. For example, with send_user "arg1: $arg1\n".

Solution 3 - Linux

I like the answer provided with this guide.

It creates a parse argument process.

#process to parse command line arguments into OPTS array
proc parseargs {argc argv} {
    global OPTS
    foreach {key val} $argv {
        switch -exact -- $key {
            "-username"   { set OPTS(username)   $val }
            "-password"   { set OPTS(password)   $val }
        }
    }
}
parseargs $argc $argv
#print out parsed username and password arguments
puts -nonewline "username: $OPTS(username) password: $OPTS(password)"

The above is just a snippet. It's important to read through the guide in full and add sufficient user argument checks.

Solution 4 - Linux

#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
log_file -a "/tmp/expect.log"
set timeout 600
spawn /anyscript.sh
expect "username: " { send "$username\r" }
expect "password: " { send "$password\r" }
interact

Solution 5 - Linux

Note, sometimes argv 0 is the name of the script you are calling. So if you run it that way, argv 0 doesn't work.

For me I run

expect script.exp  password

That makes argv 1 = password and argv 0 = script.exp.

Solution 6 - Linux

Arguments with spaces are fine, assuming the argument you want is the first after the script name ($0 is script name, $1 is the first argument, etc.)

Make sure you use "$ARG", not $ARG as it will not include the whitespace, but break them up into individual arguments. Do this in your Bash script:

#!/bin/bash

ARG="$1"
echo WORD FROM BASH IS: "$ARG" #test for debugging

expect -d exp.expect "$ARG"

exit 0

Also, as the first answer states, use debug mode, (the -d flag). It will output your argv variables as Expect sees them and should show you what is going on.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionlk121View Question on Stackoverflow
Solution 1 - LinuxbartimarView Answer on Stackoverflow
Solution 2 - LinuxspbnickView Answer on Stackoverflow
Solution 3 - LinuxDuffmannenView Answer on Stackoverflow
Solution 4 - Linuxuser128364View Answer on Stackoverflow
Solution 5 - LinuxSid DakotaView Answer on Stackoverflow
Solution 6 - LinuxeulerworksView Answer on Stackoverflow