2

Есть ли способ скрыть некоторую информацию в приглашении Bash ($PS1), например что-то вроде "невидимого цвета", используя escape-последовательности ANSI.

Метод должен быть универсальным. Он не должен использовать особую функцию невидимости некоторых редких типов терминалов. Скрытые данные должны оставаться скрытыми, например, в чистой консоли Linux ($TERM == linux).

1 ответ1

4

Установите цвета переднего плана и фона одинаково:

PS1='\[$(tput setab 0)$(tput setaf 0)\]hello\[$(tput sgr0)\]$ '

Если цвет фона вашего экрана другой, вы получите цветную полосу, которая будет отображаться, но текст все равно будет невидимым. Если вы используете мышь, вы сможете выбрать, скопировать и вставить ее, и вставленная копия будет видна.

Используя tput вместо жесткого кодирования escape-кодов, это будет переносимо на разные типы терминалов. Однако вы можете ускорить процесс, если вы одновременно определяете переменные, определяете PS1 и используете их в своем приглашении. Таким образом, tput не вызывается несколько раз каждый раз, когда выдается приглашение.

back=$(tput setab 0)
fore=$(tput setaf 0)
none=$(tput sgr0)
PS1='\[$back$fore\]hello\[$none\]$ '

Редактировать:

Чтобы сделать видимый текст нулевой ширины включенным в подсказку, просто нажмите на клавишу Backspace. Чтобы получить ^? просто нажмите Ctrl-V, затем нажмите клавишу Backspace.

PS1='\[hello ^?^?^?^?^?^?\]$ '

Для размещения текста различной ширины:

PS1='This shows\[$(word='This doesn't';bs=${word//?/^?};echo "$word$bs")\]$ '

Использование переменной, вероятно, лишит вас цели разбора метаданных, но я включу ее для полноты:

text='Something to hide'
PS1='This shows\[$(word=$text;bs=${word//?/^?};echo "$word$bs")\]$ '

или же

PS1='This shows\[$(bs=${text//?/^?};echo "$text$bs")\]$ '

Изменить 2:

В этом отношении вы могли бы сделать это:

PS1='This shows$(: This is hidden)$ '

Изменить 3:

Чтобы сделать его более динамичным, используйте PROMPT_COMMAND для установки PS1:

$ PROMPT_COMMAND="PS1='This shows\$(: '\$data')$ '"
This shows$ data="This is hidden"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: This is hidden)$ 
This shows$ data="Top Secret"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: Top Secret)$ 

Цитирование может быть проблемой. Если вы можете избежать использования одинарных или двойных кавычек в ваших данных, метод PROMPT_COMMAND будет работать нормально.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .