这是我的困境。 我正在开发一个perl telnet脚本,它使用Expect生成一个新的telnet进程并将数据(非交互式)提供给它。
一切正常,当我从terminal调用脚本 – 但是,如果我从cron启动脚本,我无法login到远程设备,因为窗口大小negociation失败 – 因为我的客户端发送窗口大小0x0(而不是80×24 )。
显然telnet从它的主PTY获取窗口大小 – 如果从cron调用它不是TTY。 最有可能的远程login是使用ioctl或类似的机制获取这些设置,因为尝试通过环境variables覆盖这些设置失败( ROWS = 200 COLUMNS = 80 telnettesting )。
我从cron运行stty并将输出redirect到一个文件。 从cron运行时,问题是stty抱怨: / bin / stty:标准input:无效的参数
你知道任何方式来:
1)覆盖telnet发送到远程设备的行数/列数
2)启动一个tty并在该tty内启动telnet(来自cron)
谢谢
更新 – 我设法解决我的问题,通过使用解决方法。 expect模块具有将TTY的大小复制到telnet运行的当前“TTY”的function。 问题是默认的TTY是STDIN – 从cron运行时没有尺寸。 我强迫它从/ dev / tty0中获取其维度:
#我们从cron或smth运行
$ logger-> debug(“设置/ dev / tty0窗口大小为80×24:”);
`/ bin / stty -F / dev / tty0列80行24`;
打开TTY0,“/ dev / tty0”或死“无法打开/ dev / tty0:$!”;
$会话级> slave-> clone_winsize_from(* TTY0);
我发现这篇文章是非常有用的,因为在将一些Perl代码从使用Net :: Telnet迁移到Expect(Expect具有非常有用的debugging输出)之后,遇到了同样的问题。
然而在我的情况下,我有一个/ dev / tty0被locking(只有root可以读取),我不想改变:
crw--w---- 1 root tty 4, 0 Aug 30 2002 /dev/tty0
我查看了Expect / IO :: Pty / IO :: Tty源代码,最后在下面进行了黑客攻击 – 基本上做了同样的事情(80 x 24),而不需要从/ dev / tty0读取。
use IO::Tty; use IO::Tty::Constant; my $winsize = pack('SSSS', 24, 80, 0, 0); ioctl($exp->slave(), &IO::Tty::Constant::TIOCSWINSZ, $winsize);
在脚本的开始:
set columns 80 set rows 24