4

有一个漂亮的小工具叫做 zssh,它可以很容易地使用 实用程序 通过现有的 ssh 连接lszrz使用 zmodem传输文件。它非常方便......但似乎我应该能够使用expect. 我已经走到这一步了...

#!/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
}

rz这在看到一个框架后启动ZRQINIT,它显然连接 rz到 ssh 会话,但它不起作用。 rz说:

Retry 0: Bad CRCe.**B0100000023be50
Retry 0: Bad CRC**B0600000023d984
Retry 0: Bad CRC**B0600000023d984

……等等。

有没有办法使这项工作?谢谢!

4

2 回答 2

4

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

例如:

发送文件:

sz -e somefile.ext

接收文件:

rz -e

这对于通过 IPMI sol(serial-over-lan)链接传输文件非常方便。

OSX 上有iterm2-zmodem,Linux 上有带有 Zmodem 集成的 Konsole。

于 2014-03-10T12:15:58.040 回答
2
  1. 在调试时使用exp_internal 1非常有用。您可以查看 expect 是如何匹配传入文本的。

  2. 我想知道终端是否挡住了路。产卵前rz,试一试stty raw。然后send_user "Finished..."做之后stty -raw

  3. 您可以使用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 -i $rz_spawn_id $expect_out(buffer)
            exp_continue
        }
        eof
    }
    

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

于 2011-02-16T21:00:36.593 回答