В моей компании мы используем 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
, который не помогает. Это только приводит к по-другому искаженным символам.
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