Tcl 期望lrange在开头和结尾添加{}
我观察到一件奇怪的事情,当我用命令行执行下面的脚本时,发送密码并没有被发送。如果我在没有命令行参数的情况下执行,它就可以正常工作。可能是密码末尾有Tcl 期望lrange在开头和结尾添加{},tcl,expect,Tcl,Expect,我观察到一件奇怪的事情,当我用命令行执行下面的脚本时,发送密码并没有被发送。如果我在没有命令行参数的情况下执行,它就可以正常工作。可能是密码末尾有$的问题。如果$出现在末尾,则puts$pass正在打印{}中包含的密码。 因此,发送密码被错误地发送,我无法执行ssh #!/usr/bin/expect set name [lrange $argv 0 0] set pass [lrange $argv 1 1] set server [lrange $argv 2 2] puts $na
$
的问题。如果$
出现在末尾,则puts$pass
正在打印{}
中包含的密码。
因此,发送密码被错误地发送,我无法执行ssh
#!/usr/bin/expect
set name [lrange $argv 0 0]
set pass [lrange $argv 1 1]
set server [lrange $argv 2 2]
puts $name
puts $server
puts $pass
spawn ssh $name@$server
sleep 2
expect "assword:"
send "$pass\r"
send "\r"
interact
执行
lrange
将返回一个列表。您应该使用lindex
:
set name [lindex $argv 0]
set pass [lindex $argv 1]
set server [lindex $argv 2]
或者,在一行中:
lassign$argv name pass server
--lassign
是非常新的(在Tcl 8.5中)。在考虑可移植性时,我宁愿使用foreach{abc}{123}
。:-)哦,我的天,对于“非常新”的某些定义:Tcl 8.5是在2007年发布的(}有好几年了,没有lassign
的Tcl支持版本了。(8.4上非常旧的代码可以添加到TclX中,它有一个功能性但非常慢的实现,是我偷取语法的地方。)关于Tcl/expect编程,有一点是:您必须知道数据何时是列表,何时不是。
set name [lindex $argv 0]
set pass [lindex $argv 1]
set server [lindex $argv 2]