Терминалы VT100 (который все современные эмуляторы терминала эмулируют в некоторой степени) поддерживали много проблематичных команд, но современные эмуляторы или дистрибутивы отключают более проблематичные и менее полезные. Вот неисчерпывающий список потенциально опасных escape-последовательностей (не включая тех, которые просто делают дисплей нечитабельным в некотором роде):
ENQ
(Ctrl+E
). Это вставляет текст в терминал, как будто пользователь ввел его. Однако этот текст не находится под контролем взломщика: это - собственное имя терминала, обычно что-то как xterm
или screen
. В моей системе (Debian сжимают), xterm возвращает пустую строку по умолчанию (этим управляют answerbackString
ресурс).ESC [ c
и друзья. Терминал отвечает ESC [ … c
(где …
может содержать только цифры и знаки пунктуации ASCII). Это - способ запросить некоторые терминальные возможности, главным образом устаревшие, но возможно используемые старыми приложениями. Снова, ответ терминала неотличим от ввода данных пользователем, но он не находится под контролем взломщика. Управляющая последовательность могла бы быть похожей на функциональную клавишу, но только если у пользователя есть необычная конфигурация (ни одна из обычных настроек, с которыми я встретился, имеет допустимую escape-последовательность функциональной клавиши, это - префикс терминального ответа).ESC P
). DECUDK
(установите пользовательские ключи) на типичном эмуляторе терминала.DECRQSS
(Запросите Строку состояния), еще одна команда, к которой терминал отвечает escape-последовательностью, на этот раз начинаясь \eP
; это может быть проблематично с тех пор \eP
допустимый ключ (Alt+Shift+P).ESC P + p …
и ESC P + q …
, получить и установить строки termcap. Из описания это могло бы использоваться, по крайней мере, для изменения эффекта функциональных клавиш.ESC [ … n
(Отчет о состоянии устройства). Терминал отвечает escape-последовательностью. Большинство этих escape-последовательностей не соответствует escape-последовательностям функциональной клавиши. Каждый выглядит проблематичным: отчет ESC [ 6 n
имеет форму ESC [ x ; y R
где x
и y
последовательности цифры, и это могло быть похожим на F3 с некоторыми модификаторами.ESC [ … t
. ESC [ 2 0 t
и ESC [ 2 1 t
включайте маркировку и заголовок значка окна терминала соответственно, и взломщик может выбрать их.allowWindowOps
ресурс, или выборочно через disallowedWindowOps
ресурс. Терминал Gnome в соответствии с Ubuntu 10.04 реализует даже ответы заголовка по умолчанию. Я не проверил другие терминалы или версии.ESC ] digit ; title ESC \
. Под Экраном escape-последовательность ESC k title ESC \
. Я нахожу, что озабоченность по поводу этих команд переоценила. В то время как они действительно позволяют некоторую сумму вреда, любая веб-страница имеет ту же проблему. Действие на оконное только на его заголовке а не на его классе сродни открытию файла, имя которого было дано Вам недоверяемой стороной или не заключением в кавычки переменного расширения в сценарии оболочки, или ласка бешеной собаки на носу — не жалуется, укушены ли Вы.Я нахожу ответ Лака лицемерным. Это, чувствует, что это или пытается свалить вину, или в режиме нациста безопасности (любая проблема безопасности, подлинная или нет, выравнивает по ширине баллотирование функции).
Мудрость терминальных Escape ответа в целом была подвергнута сомнению равномерно, но тем не менее ни одна из главных программ эмуляции терминала не сочла целесообразным отбрасывать эти последовательности, вероятно, в дезинформированной попытке совместимости без дольше используемого 1970'es технология. (…)
Вместо того, чтобы обвинить любого и все программы, который пишет файлы журнала, было бы намного более продуктивно, с точки зрения безопасности, заставить программы эмуляции терминала прекращать делать глупые вещи и таким образом фиксировать это и другие проблемы безопасности раз и навсегда.
Многие ответы являются полезными функциями: приложение действительно должно знать вещи как позиция курсора и размер окна. Установка заголовка окна также очень полезна. Было бы возможно положиться полностью на ioctl
призывы к ним, однако это потребовало бы, чтобы дополнительный код и утилиты сделали их ioctl
вызовы и транссъели их в текст стиля Unix, передающий дескрипторы файлов. Изменение этих интерфейсов теперь было бы большой работой для небольшого преимущества.
Текстовые файлы, как предполагается, не содержат непечатаемые символы, такие как управляющие символы. Файлы журнала, как обычно ожидают, будут текстовыми файлами. Файлы журнала не должны содержать управляющие символы.
Если Вы волнуетесь, что файл мог бы содержать escape-последовательности, открыть его в редакторе или просмотреть его с less
без -r
или -R
опция или представление это через cat -v
.
Попробуйте установку RPROMPT к пробелам. Количество пробелов должно быть терминальной шириной (минус #
и другие символы.)
Можно сделать что-либо, что Вы хотите с быстрой строкой* - проблематичный аспект заставляет ее отменять ее позже. Я предполагаю, что Вы не хотите каждую строку, которая когда-либо имела подсказку на отображенном в Ваших цветах hilight.
Почти было бы легче удалить строку позже, но затем у Вас нет своей команды. Возможно, удалите подсказку, затем повторяют команду (с псевдоподсказкой как $
). У Вас могла быть подсказка, начинаются с курсора ANSI, сохраняют последовательность ESC [s
, затем в a precmd
восстановите его ESC [u
и очистите все после курсора ESC [0J
, затем повторите команду (я не вспоминаю, как получить команду изнутри precmd
).
*Это - неполный ответ, я не знаю, как сделать его hilight команда в другом цвете фона.
Если я изменяюсь grey
кому: white
, Ваш пример на самом деле работает на меня.
Какой терминал Вы используете? Возможно, это обрабатывает стирание цвета фона по-другому?
Вот некоторые альтернативы попытке:
Дайте всей быстрой строке серый фон:
setopt promptsubst
preexec() {
tput sgr0
}
PS1="$(tput setab 7)# "
(должен совпасть с Вашим примером, но другим способом записать это.)
Распечатайте строку перед подсказкой:
precmd() {
tput smul
for ((n=0; n<COLUMNS; n++)) { printf " "; }
printf "\n"
}
preexec() {
tput sgr0
}
(Если Вы изменяетесь "\n"
кому: "\r"
, это должно подчеркнуть текущую строку, но это, кажется, не работает. Я предполагаю, что zsh стирает текущую строку при печати подсказки, которая является тем, что приводит меня к первому решению.)
Сделайте команды (т.е. все, что Вы вводите), полужирный:
setopt promptsubst
preexec() {
tput sgr0
}
PS1="# $(tput bold)"