Назад | Перейти на главную страницу

Изменить размер экрана в linux telnet

Вот и мое затруднительное положение. Я разрабатываю сценарий telnet на perl, который использует Expect для создания нового процесса telnet и передачи в него данных (неинтерактивно).

Все работает нормально, когда я вызываю скрипт из терминала, однако, если я запускаю скрипт из cron, я не могу войти в систему на удаленном устройстве, потому что согласование размера окна не удается - поскольку мой клиент отправляет размер окна 0x0 (вместо 80x24). ).

Очевидно, telnet получает этот размер окна от своего главного PTY, который не является TTY, если он вызывается из cron. Скорее всего, telnet получает эти настройки с помощью ioctl или другого подобного механизма, потому что попытка переопределить эти настройки с помощью переменных среды не удалась (ROWS = 200 COLUMNS = 80 telnet test).

Я запустил stty из cron и перенаправил вывод в файл. Проблема в том, что stty жалуется при запуске из cron: / bin / stty: стандартный ввод: недопустимый аргумент

Знаете ли вы способ:
1) переопределить количество строк / столбцов, которые telnet отправляет на удаленное устройство
2) запустите tty и запустите telnet внутри этого tty (из cron)

Спасибо

обновление - мне удалось решить мою проблему, используя обходной путь. В модуле expect есть функция, которая копирует размер TTY в текущий TTY, в котором работает telnet. Проблема заключалась в том, что TTY по умолчанию был STDIN, который не имеет размеров при запуске из cron. Вместо этого я заставил его получить свои размеры из / dev / tty0:

# мы запускаем cron или что-то
$ logger-> debug ("установка размера окна / dev / tty0 на 80x24:");
`/ bin / stty -F / dev / tty0 columns 80 rows 24`;
откройте TTY0, "/ dev / tty0" или die "Can't open / dev / tty0: $!";
$ session-> slave-> clone_winsize_from (* TTY0);

Я нашел этот пост очень полезным, так как столкнулся с той же проблемой после переноса некоторого кода 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);

В начале скрипта:

set columns 80
set rows 24