Expect Tcl script-使用spawn传递带引号的参数时出错

Expect Tcl script-使用spawn传递带引号的参数时出错,tcl,rsync,expect,Tcl,Rsync,Expect,我刚刚编写了一个非常简单的Expect脚本来包装rsync,但它似乎给我带来了麻烦。基本上,我正在自动执行从rsync调用的SSH登录提示。我还必须通过rsync将参数传递给SSH,这样它就不会进行主机密钥检查。我非常了解SSH身份验证密钥和SSH-keygen,但我有充分的理由这样做,因此没有关于在命令行上传递密码的讲座 剧本 以下是脚本的完整输出: 输出 在我看来,rsync正在尝试执行“ssh,而不仅仅是ssh,但是,复制并粘贴Expect的stdout(rsync-e“ssh-q-o

我刚刚编写了一个非常简单的Expect脚本来包装rsync,但它似乎给我带来了麻烦。基本上,我正在自动执行从rsync调用的SSH登录提示。我还必须通过rsync将参数传递给SSH,这样它就不会进行主机密钥检查。我非常了解SSH身份验证密钥和SSH-keygen,但我有充分的理由这样做,因此没有关于在命令行上传递密码的讲座

剧本
以下是脚本的完整输出:

输出
在我看来,rsync正在尝试执行
“ssh
,而不仅仅是
ssh
,但是,复制并粘贴Expect的stdout(
rsync-e“ssh-q-o strichostkeychecking=no”/localhost/home/avoleker/localfile)的第一行输出remoteuser@remotehost:/tmp/
)直接插入shell可以很好地工作,所以我知道rsync没有问题

当我完全从
spawn rsync
行中删除-e参数时,Expect脚本会执行,不会出现错误,但我必须在脚本中添加主机密钥检查,这是我不想做的


对Expect/Tcl更有经验的人知道我做错了什么吗?

放下你的反斜杠。
spawn
行应该只说:

spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" $localfile $username@$remotehost:$remoteloc

毕竟,你不想看到带有引号的命令,是吗?

哇,我可以发誓这是我第一次尝试的。无论如何,它现在可以工作了!谢谢AbevoElker,我建议你也检查一下拼写。根据主机的配置,例如,“expect Password”(预期密码)“expect Password:”可能在大多数情况下都有效,而“expect Password:”提供了更确定的正确行为。更糟糕的是,该提示可能需要在不同的目标机器之间更改。
avoelker@localhost  $ ./remoteFileCopy.tcl remotehost remoteuser remotepass ~/localfile /tmp/
spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" /localhost/home/avoelker/localfile remoteuser@remotehost:/tmp/
rsync: Failed to exec "ssh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(83)
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(434)
send: spawn id exp6 not open
    while executing
"send "$password\r""
    (file "./remoteFileCopy.tcl" line 17)
avoelker@localhost  $
spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" $localfile $username@$remotehost:$remoteloc