当对expect脚本进行子进程调用时,Python避免使用花括号

时间:2014-11-06 01:29:40

标签: python tcl expect

我有以下期望脚本名为autossh.exp

#!/usr/bin/expect -f
set user [lrange $argv 0 0] 
set password [lrange $argv 1 1] 
set ipaddr [lrange $argv 2 2]
set command [lrange $argv 3 3]
set timeout 10
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh -o StrictHostKeyChecking=no $user@$ipaddr 'bash -s' < $command
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
interact
# send blank line (\r) to make sure we get back to gui
#send -- "\r"

我从python文件调用这个期望脚本,如下面的

import subprocess
user = "abc"
operation = "l"
password = "xyz"
brokerip = "10.XX.XX.XXX"
command = ' topics.sh '+operation+' '+user
subprocess.call(['autossh.exp', user, password, brokerip, command])

我想将找到的topic.sh(在本地)传递给ssh。

当我运行python文件时,我得到以下错误。

spawn ssh -o StrictHostKeyChecking=no abc@10.xx.xx.xxx 'bash -s' < { topics.sh l abc}
tmhaskar@xx.xx.xx.xxx's password: 
bash: {: No such file or directory

有人可以告诉我,是否有任何工作可以避免花括号。

提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试使用lindex而不是lrange。 lrange尝试返回格式良好的列表,因此如果它在数据中找到某些字符,它将添加大括号或反斜杠以保证您获得有效列表,即使它是具有单个元素的列表。另一方面,lindex从列表中返回单个元素。

% set argv [list abc xyz 10.xx.xx.xxx "topics.sh 1 abc"]
abc xyz 10.xx.xx.xxx {topics.sh 1 abc}
% lrange $argv 3 3
{topics.sh 1 abc}
% lindex $argv 3
topics.sh 1 abc