Ожидается, мешает с кодировкой символов во время 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