ожидайте вмешивается в кодировку символов во время ssh

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

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

Скелет bash сценарий, который работает:

#!/bin/bash
ssh user@server

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

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

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

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

Править: Мы уже попробовали luit, который не помогает. Это только приводит к по-другому искаженным символам.

2
задан 10 July 2018 в 14:48

1 ответ

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

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

Для Вашего простого примера необходимо сказать tcl кодирование ssh i/o поток, и это должно сделать необходимые преобразования для Вас без Вас бывший должный изменить локаль терминала гнома всегда.

#!/usr/bin/expect --
spawn ssh user@server
fconfigure $spawn_id -encoding iso8859-1
interact
0
ответ дан 2 December 2019 в 07:20

Другие вопросы по тегам:

Похожие вопросы: