Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在远程服务器中发送Bash命令时使用List元素_List_Tcl_Expect - Fatal编程技术网

在远程服务器中发送Bash命令时使用List元素

在远程服务器中发送Bash命令时使用List元素,list,tcl,expect,List,Tcl,Expect,我的expect脚本成功地连接到多个远程服务器并回显命令,但我无法让它回显列表中的项目 例如,当切换到server1时,我想输出到终端水果:苹果 但是apple保存在expect中,而send将其发送到未定义列表的本地终端。是否可以向bash发送expect变量 特别是代码中与此相关的行: set counter 0 set types {apple orange} set var $types($counter) send -- "echo 'fruit:$var'\r" set $count

我的expect脚本成功地连接到多个远程服务器并回显命令,但我无法让它回显列表中的项目

例如,当切换到
server1
时,我想输出到终端
水果:苹果
但是
apple
保存在
expect
中,而
send
将其发送到未定义列表的本地终端。是否可以向bash发送
expect
变量

特别是代码中与此相关的行:

set counter 0
set types {apple orange}
set var $types($counter)
send -- "echo 'fruit:$var'\r"
set $counter [expr $counter+1]
完整代码:

#!/usr/bin/expect -f
# ./sshlogin.exp uptime
#declare hosts array"
set hosts {server1 server2}
set types {apple orange}
# setting credentials
set user jack
set password welcome
set counter 0
foreach vm $hosts {
        set var $types($counter)
        set timeout -1
        # now ssh
        spawn ssh $user@$vm -o StrictHostKeyChecking=no
        match_max 100000 # Look for passwod prompt
        expect "*?assword:*"
        # Send password aka $password
        send -- "$password\r"
        # send blank line (\r) to make sure we get back to gui
        expect "$ "
        send -- "echo 'fruit:$var'\r"
       expect "$ " 
       send -- "exit\r"
       set $counter [expr $counter+1]
expect eof }

将第二个列表添加到foreach循环中,由于两者的长度相同,因此效果非常好

foreach
现在看起来像这样:

foreach vm $hosts fruit $types {....
此链接包含一个示例: 这是错误的

set counter 0
set types {apple orange}
set var $types($counter)
Tcl有两种类型,一种是数字索引数组,另一种是关联数组(散列)

您通常使用命令访问列表的元素。
您可以使用
$arrname($key)
语法访问数组的元素

要解决这三行的直接问题:您想要

set var [lindex $types $counter]
您的答案是在2个列表上进行迭代的最佳方式,可以提取具有相同数字索引的元素


通过对两个列表使用foreach找到解决方法/解决方案;现在效果很好。谢谢。谢谢你的评论。格伦,我肯定计划今晚晚些时候再看一遍教程。