首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用expect帮助我在ssh上驱动Zmodem

使用expect帮助我在ssh上驱动Zmodem
EN

Stack Overflow用户
提问于 2011-02-16 23:41:04
回答 2查看 2.3K关注 0票数 4

有一个名为zssh的漂亮小工具,它可以方便地使用lszrz实用程序通过现有的ssh连接使用zmodem传输文件。这是令人惊讶的convenient...but,似乎我应该能够用expect来完成同样的事情。我已经走到这一步了。

代码语言:javascript
复制
#!/usr/bin/expect -f

spawn ssh $argv
set ssh_spawn_id $spawn_id
send_user "ssh is: $ssh_spawn_id\n"

interact -o "\030B0000" {
    send_user "\nStarting zmodem receive.\n"

    spawn rz -v
    set rz_spawn_id $spawn_id
    send_user "rz is: $rz_spawn_id\n"

    while {1} {
        expect {
            eof break

            -i $rz_spawn_id -re .+ {
                send -raw -i $ssh_spawn_id $expect_out(buffer)
            }
            -i $ssh_spawn_id -re .+ {
                send -raw -i $rz_spawn_id $expect_out(buffer)
            }
        }
    }

    send_user "\nFinished zmodem receive.\n"
    set spawn_id $ssh_spawn_id
}

这段代码在看到ZRQINIT帧后启动rz,它显然将rz连接到ssh会话,但它不工作。rz说:

代码语言:javascript
复制
Retry 0: Bad CRCe.**B0100000023be50
Retry 0: Bad CRC**B0600000023d984
Retry 0: Bad CRC**B0600000023d984

...and等等。

有没有办法做到这一点呢?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-17 05:00:37

在调试时使用exp_internal 1

  1. 非常有用。你可以看到expect是如何匹配传入的文本的。
  2. 我想知道终端是不是挡道了。在生成rz之前,请尝试stty raw。然后在send_user "Finished..." do之后,stty -raw.
  3. You可以使用exp_continue而不是while循环:

spawn rz -v set rz_spawn_id $spawn_id send_user "rz is:$rz_spawn_id\n“expect { -i $rz_spawn_id -re .+ { send -raw -i $ssh_spawn_id $expect_out(buffer) exp_continue } -i $ssh_spawn_id -re .+ { send -raw (Buffer)} eof }

这与问题无关,只是风格问题。

票数 2
EN

Stack Overflow用户

发布于 2014-03-10 20:15:58

我发现在发送端使用-e / --escape (转义所有控制字符)选项有助于解决启动zmodem连接时出现的一些问题。

例如:

发送文件:

代码语言:javascript
复制
sz -e somefile.ext

接收文件:

代码语言:javascript
复制
rz -e

这对于通过IPMI sol (局域网串口)链路传输文件非常方便。

在OSX上有iterm2-zmodem,在Linux上有Konsole,集成了Zmodem。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5018479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档