有一个名为zssh的漂亮小工具,它可以方便地使用lszrz实用程序通过现有的ssh连接使用zmodem传输文件。这是令人惊讶的convenient...but,似乎我应该能够用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
}这段代码在看到ZRQINIT帧后启动rz,它显然将rz连接到ssh会话,但它不工作。rz说:
Retry 0: Bad CRCe.**B0100000023be50
Retry 0: Bad CRC**B0600000023d984
Retry 0: Bad CRC**B0600000023d984...and等等。
有没有办法做到这一点呢?谢谢!
发布于 2011-02-17 05:00:37
在调试时使用exp_internal 1的
rz之前,请尝试stty raw。然后在send_user "Finished..." do之后,stty -raw.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 }
这与问题无关,只是风格问题。
发布于 2014-03-10 20:15:58
我发现在发送端使用-e / --escape (转义所有控制字符)选项有助于解决启动zmodem连接时出现的一些问题。
例如:
发送文件:
sz -e somefile.ext接收文件:
rz -e这对于通过IPMI sol (局域网串口)链路传输文件非常方便。
在OSX上有iterm2-zmodem,在Linux上有Konsole,集成了Zmodem。
https://stackoverflow.com/questions/5018479
复制相似问题