To send ID and Password for each command using expect feature in bash script

Dear Tech Guys,

I am trying to send some commands on the local server and it always asks for user name and password after each command. To serve the purpose I am using expect function as follows:

#!/usr/bin/expect

set timeout 20



spawn "./data1.sh"

expect "Please Enter UserName: " { send "admin\r" }
expect "*Password: " { send "admin123\r" }

interact

where data1.sh have the say:

#!/bin/bash
command1
command2
command3

Now the problem is that, my expect script provides username and password for only command1 but not providing username and password for command2 onwards and stops at the username prompt. Please help me out to troubleshoot this issue.

Does your OS have the sudo command?

Putting passwords in a script is not all secure.

If you would please tell us: your OS, and your shell, we could give you a good answer - which may be an expect script.

Its as follows:

NAME="Red Hat Enterprise Linux Server"
VERSION="7.3 (Maipo)"

-bash

--- Post updated at 12:38 PM ---

there is no sudo option. its the need of command to enter id password after that so must be needing such kind of solution.

Okay, what is the command? A simple example would help.

Its an application based command which shows the routing table just as below. After each such get command it asks for the user id and password. Problem with my script is that it is successfully taking id password for 101 and displaying the routing table but after that it executes the get command for 102 but doesn't takes id and password and stuck at the user name prompt.

cmcli get 101
cmcli get 102
cmcli get 103

Try a here document, assumes it it asks for a user, then outputs a line feed and wants password:

#!/bin/bash
cmdcli get 101 <<!
user
pass
!
cmdcli get 102 <<!
user
pass
!
cmdcli get 103 <<!
user
pass
!

If i connect that correctly, a command like:

cmcli get 101

asks itself for a user/password. Your expect-script provides that only once, not for every command. My suggestion is to do it the other way round. Put the following in a script "execasadmin.exp":

#!/usr/bin/expect
set timeout 20
set mycmd [lindex $argv 0];

spawn $mycmd

expect "Please Enter UserName: " { send "admin\r" }
expect "*Password: " { send "admin123\r" }

interact

This will expect a command line as argument, execute this commandline, then feed it the user and password. Call this in a loop like this:

#! /bin/bash

mycmdarr[1]="command1"
mycmdarr[2]="command2"
mycmdarr[3]="command3"
mycmdarr[4]="command4"
# [...]
i=1

while [ $i -le ${#mycmdarr[@]} ] ; do
     /path/to/execasadmin.exp "${mycmdarr[$i]}"
     (( i++ ))
done

exit 0

Notice that there might be difficulties once you include redirections, pipelines and other advanced shell features into your commands, but for single/simple commands it should work.

I hope this helps.

bakunin