如何从外壳返回“读”命令传递希望脚本?(How to return from shell '

2019-10-23 02:35发布

我真的很新的使用期望,并且有点糊涂关于通过命令的expect脚本,所以请多多包涵......我寻觅各种论坛,但似乎无法找到使用读命令的期望脚本示例获取用户输入。

在我Korn Shell脚本,我叫expect脚本(expectssh.exp)SSH登录到另一台主机,并得到关于该主机的网络配置(网络接口卡号码和子网掩码信息),用户输入。 我通过四个参数的expect脚本:远程主机的IP地址,用户名,密码,以及运行命令的列表。 我期待脚本如下:

#!/usr/bin/expect
# Usage: expectssh <host> <ssh user> <ssh password> <script>

set timeout 60
set prompt "(%|#|\\$) $"
set commands [lindex $argv 3];

spawn ssh [lindex $argv 1]@[lindex $argv 0]

expect {
"*assword:" { 
send -- "[lindex $argv 2]\r" 
expect -re "$prompt"
send -- "$commands\r" 
}

"you sure you want to continue connecting" {
send -- "yes\r"
expect "*assword:"
send -- "[lindex $argv 2]\r"
expect -re "$prompt"
send -- "$commands\r" 
}

timeout {
exit }
}

该脚本运行良好,除了当它到达“读”命令,脚本不会在用户按下回车后继续或退出。 它只是挂起。

是我传递给期待脚本和其呼叫的命令如下:

SCRIPT='hostname > response.txt;netstat -rn;read net_card?"What is the network interface card number?   " >> response.txt; read net_mask?"What is the subnet mask? " >> response.txt'

/usr/bin/expect ./expectssh.exp $hostip $usr $pswd "$SCRIPT"

我如何可以通过我通过读命令的任何建议,希望没有它挂脚本?

在一个侧面说明,因为我知道这将拿出 - 我不允许这样做基于密钥的自动SSH登录。 我要提示输入用户名和密码,这是从调用此预期脚本Korn Shell脚本来完成。

感谢您的任何建议和帮助,您可以提供!

Answer 1:

任何有兴趣,我可以得到read命令做的几件事情对用户输入的工作:

(1)把它的内-re $prompt块代替追加send -- "$commands\r"密码输入后。

(2)硬编码的命令到脚本,而不是将它们传递英寸

(3)在与一个命令interact语句,以便用户做出响应之前,不进入下一发送指令。

我希望块现在看起来是这样的:

expect {
    -re "(.*)assword:" { 
        send -s "$pswd\r" 
        exp_continue
    }
    "denied, please try again" {
        send_user "Invalid password or account.\n"
        exit 5
    }
    "incorrect" {
        send_user "Invalid password or account.\n"
        exit 5
    }
    "you sure you want to continue connecting" {
        send -s "yes\r"
        exp_continue
    }
    -re $prompt {
        set timeout -1
        send -- "hostname > partnerinit\r"
        expect -exact "hostname > partnerinit\r"
        send -s "netstat -rn\r"
        expect -re "$prompt"
        send -- "read n_card?'Enter the network interface card number for this server (i.e. eth0):  '\r"
        interact "\r" return
        send -- "\r"
        send -- "echo \$n_card >> partnerinit\r"
        send -- "msk=\$(cat /etc/sysconfig/network-scripts/ifcfg-\$n_card | grep NETMASK)\r"
        send -- "msk=\$(echo \${msk#NETMASK=})\r"
        send -- "echo \$msk >> partnerinit\r"
        send -- "cat partnerinit\r"
        set retval 0
    }
    timeout {
        send_user "Connection to host $host timed out.\n"
        exit 10
    }
    eof {
        send_user "Connection to host $host failed.\n"
        exit 1
    }
}

我也更新了脚本来自动确定基于用户输入的网络接口卡号码子网掩码。 它带给我的注意,寻求网络接口卡号码将是非常困难的在具有多个接口卡盒的情况下实现自动化。 更好地从小事做起,并让用户输入并微调/后自动一次整体脚本工作。

现在,我正在修改这SCP的我partnerinit文件恢复到我的本地主机和从每个期望条件返回有意义的退出状态。



文章来源: How to return from shell 'read' command passed in expect script?