Ожидается, мешает с кодировкой символов во время SSH

В моей компании мы используем expect автоматизировать задачи, когда sshв других системах. Все наши устаревшие системы используют кодировку ISO-8859-1, в то время как наши настольные системы используют кодировку UTF-8. Что, конечно, создает определенные проблемы, когда sshпереходит с одного из наших настольных компьютеров на устаревшие системы.

Это легко решается удалением SendEnv линия в /etc/ssh/ssh_config и установка кодировки символов терминала Gnome на ISO-8859-1 непосредственно перед запуском ssh сессия. Это прекрасно работает, когда вы делаете это вручную из командной строки или из bash скрипт. Но когда делаю это изнутри expect Сценарий не удается. Кажется, что кодировка символов либо вообще не обрабатывается, либо неправильно обрабатывается изнутри expect, что приводит к искаженным символам, когда мы вводим специальные символы.

Голые кости bash скрипт который работает:

#!/bin/bash
ssh user@server

Голые кости expect скрипт, который выдает ошибку:

#!/usr/bin/expect --
spawn ssh user@server
interact

Кодировка символов терминала Gnome была правильно установлена ​​вручную перед выполнением двух сценариев. Эти два сценария должны работать одинаково, sshзаходя на сервер и позволяя пользователю ввести пароль. Но bash скрипт корректно обрабатывает кодировку, а expect Скрипт выдает искаженные специальные символы.

Я предполагаю, что упускаю что-то очевидное, но я не могу понять, что я пропускаю.

Изменить: мы уже попробовали luitчто не помогает Это приводит только к искаженным персонажам.

1 ответ

Решение

expect написано, как вы знаете, в tcl язык, и вы можете посмотреть здесь информацию о том, как он обрабатывает интернационализацию. Внутренне tcl преобразует символы в utf-8, но предполагает, что весь ввод и вывод использует кодировку системы, а именно локаль вашего терминала.

Чтобы переопределить это для определенного потока данных, вы можете использовать fconfigure на идентификатор канала, чтобы указать кодировку для использования. Команда spawn предоставляет созданный канал, устанавливая переменную spawn_id, (Осторожно, существует распространенная ошибка, когда вам иногда нужно объявить эту переменную как глобальную, например, в процедуре).

Для вашего простого примера вам нужно сообщить tcl кодировку потока ввода-вывода ssh, и он должен выполнить необходимые преобразования для вас, без необходимости каким-либо образом изменять локаль терминала gnome.

#!/usr/bin/expect --
spawn ssh user@server
fconfigure $spawn_id -encoding iso8859-1
interact
Другие вопросы по тегам