在 Linux telnet 中覆盖屏幕大小

在 Linux telnet 中覆盖屏幕大小

这是我的困境。我正在开发一个 perl telnet 脚本,该脚本使用 Expect 生成一个新的 telnet 进程并将数据(非交互地)输入其中。

当我从终端调用脚本时,一切都运行正常 - 但是,如果我从 cron 启动脚本,我将无法登录到远程设备,因为窗口大小协商失败 - 因为我的客户端发送的窗口大小为 0x0(而不是 80x24)。

显然,telnet 从其主 PTY 获取此窗口大小 - 如果从 cron 调用,则不是 TTY。最有可能的是,telnet 使用 ioctl 或某种类似机制获取这些设置,因为尝试通过环境变量覆盖这些设置失败了(ROWS=200 COLUMNS=80 远程登录测试)。

我从 cron 运行 stty 并将输出重定向到文件。问题是 stty 在从 cron 运行时会发出抱怨:/bin/stty:标准输入:无效参数

您知道有什么方法可以做到吗:
1)覆盖 telnet 发送到远程设备的行数/列数
2)启动 tty 并在该 tty 内启动 telnet(从 cron)

谢谢

答案1

更新 - 我设法通过使用一种变通方法解决了我的问题。expect 模块有一个函数,它将 TTY 的大小复制到 telnet 运行的当前“TTY”。问题是默认 TTY 是 STDIN - 从 cron 运行时没有尺寸。我强制它从 /dev/tty0 获取其尺寸:

#我们从 cron 或 smth 运行
$logger->debug("将 /dev/tty0 窗口大小设置为 80x24:");
`/bin/stty -F /dev/tty0 列 80 行 24`;
打开 TTY0,“/dev/tty0”或 die “无法打开 /dev/tty0:$!”;
$session->slave->clone_winsize_from(*TTY0);

答案2

我发现这篇文章非常有用,因为在将一些 Perl 代码从使用 Net::Telnet 迁移到 Expect 后,我​​遇到了同样的问题(相比之下,Expect 具有非常有用的调试输出)。

然而在我的环境中,/dev/tty0 被严格锁定了(只有 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);

答案3

在脚本的开始处:

set columns 80
set rows 24

相关内容