Буфер обмена в Linux живёт и вне мыши: его можно читать и писать из командной строки, и это открывает целый пласт автоматизации. Результат команды сразу в буфере для вставки в отчёт, пароль из менеджера прямо в диалог ввода без экранирования в логе, хеш свежесгенерированного ключа вставлен в чат коллеге за одну секунду - всё это делается xclip или его собратом xsel. В статье разбираем реальное применение: оба инструмента, три вида буферов в X11, скрипты-приёмы, работа в Wayland через wl-clipboard и типичные ловушки, о которых узнают только на практике.

Три буфера X11 и почему о них надо помнить

X11 хранит не один буфер обмена, а три: PRIMARY (выделенный текст мышью, вставляется средней кнопкой), SECONDARY (историческая редкость) и CLIPBOARD (привычный Ctrl+C / Ctrl+V). И xclip, и xsel по умолчанию работают с PRIMARY, а это источник вечной путаницы: команда echo hello | xclip вроде бы сработала, а Ctrl+V в браузере ничего не вставил - потому что надо было echo hello | xclip -selection clipboard. В большинстве сценариев вы будете указывать именно -selection clipboard.

Та же история с xsel: по умолчанию тоже PRIMARY, флаги -b или --clipboard переключают на системный буфер. Цепочка получения текста выглядит симметрично: xclip -selection clipboard -o читает буфер, xsel -b то же самое в варианте конкурента. Совместимость делает их взаимозаменяемыми, и выбор обычно вопрос привычки: у xsel чуть лаконичнее короткие формы, у xclip более обширная история применения в скриптах.

Сама установка тривиальна: apt install xclip xsel, и через минуту вы готовы. На Wayland стоит wl-clipboard с командами wl-copy и wl-paste, которые работают так же прозрачно: echo data | wl-copy копирует, wl-paste вставляет. Скрипты, рассчитанные на обе среды, выбирают инструмент по наличию переменной WAYLAND_DISPLAY, и это единственный аспект, о котором надо позаботиться при переносе полезных скриптов между машинами.

Повседневные сценарии, которые окупают освоение за вечер

Первая категория - безопасность. Пароли из менеджера pass ходят в буфер и обратно без экрана: pass show email/main | xclip -selection clipboard оставляет пароль в буфере секунды на вставку, и многие обвязки добавляют автоочистку через 45 секунд. Ключи SSH: xclip -selection clipboard < ~/.ssh/id_ed25519.pub пересылает публичный ключ в чат или веб-форму без открытия файла в редакторе. Мелочь, а экономит секунды сорок раз на дню.

Вторая категория - данные для отчётов и тикетов: git rev-parse HEAD | xclip -selection clipboard кладёт точный коммит в буфер, hurl -I site | head -3 | xclip -selection clipboard забирает шапку ответа для баг-репорта. Результат конвейера уезжает прямо к коллегам, и история команд остаётся чистой, без лишних промежуточных файлов.

Третья категория - обработка текста из буфера: xclip -selection clipboard -o | wc -w считает слова в выделенном фрагменте, xclip -o | jq . форматирует JSON из веб-консоли прямо оттуда, xclip -o | grep -oE "([0-9]{1,3}\\.){3}[0-9]{1,3}" выдёргивает адреса из скачанного разом лога. Такой пайп из буфера и обратно заменяет полноценный редактор для моментальных задач, и руки привыкают мгновенно.

Приёмы из скриптов, диалоги, очистка, повторное использование

Первый приём - автовставка в графическое приложение через xdotool: скрипт копирует текст в буфер и затем имитирует нажатие ctrl+v в активном окне. Это заводит пароли в поля, которые не имеют автодополнения, а данные - в таблицы. Вторая техника - очистка буфера задержкой: echo -n secret | xclip -selection clipboard; sleep 45; echo -n "" | xclip -selection clipboard стирает пароль из памяти по таймеру, даже если вы отвлеклись.

Третий приём - проверка содержимого перед использованием: буфер может содержать килобайты бинарных данных, и xclip -selection clipboard -o | head -c 200 позволяет бегло убедиться, что влезло то, что нужно. Четвёртый - целевые MIME-типы: при копировании файла или картинки буфер несёт не текст, и флаг -t image/png позволяет указать тип целевым образом, что полезно при сборке вставки изображений из скриптов.

Wayland и SSH, буфер за пределами локального X-сервера

В мире Wayland xclip по-прежнему работает через XWayland, но родным решением считается wl-clipboard: wl-copy и wl-paste делают то же самое без прослойки. Для скриптов-которые-живут-долго полезен автодетект: if [ -n "$WAYLAND_DISPLAY" ]; then cb_copy() { wl-copy; }; else cb_copy() { xclip -selection clipboard; }; fi, и дальше весь скрипт пользуется функцией-обёрткой. Когда-нибудь эта вилка исчезнет, но пока она избавляет от сюрпризов на свежих десктопах.

SSH добавляет отдельную изюминку: буфер живёт на стороне клиента, а команды выполняются на сервере, и echo text | xclip на удалённой машине без X-forwarding просто не найдёт дисплея. Решение встроено в сам SSH: ssh -X host включит перенос X11, и xclip на удалённой стороне окажется привязан к вашему локальному буферу. Стоит оно включённого X11Forwarding на сервере и небольшой порции доверия к хосту: форвардинг при режущем глаз конфиге лучше включать только при необходимости.

Другой способ для удалённого копирования - osc52 escape-последовательности, которые терминал перехватывает и кладёт содержимое в локальный буфер: утилита xsel такой режим знает как --logfile-экзотику, но есть и на удивление простые реализации вида printf "\e]52;c;$(echo -n text | base64)\a" по SSH. Терминалы с поддержкой osc52 забирают текст мгновенно, и файлам больше не нужен форвардинг X11 для коротких вставок.

Обработка буфера как конвейер, шаблоны на каждый день

Паттерн буфер-фильтр-буфер это классика микро-преобразований. Выделил лог в браузере, запустил xclip -o | grep ERROR | xclip -selection clipboard, вставил коллеге уже только строки с ошибками. Разобрали JSON: xclip -o | jq .items[0] | xclip -selection clipboard. Генерация сильного пароля: openssl rand -base64 18 | tr -d \n | xclip -selection clipboard - и дальше пароль живёт исключительно в буфере и в менеджере паролей, не засвечиваясь в истории командных строк дальше первого вызова.

Робастность скрипта проверяется двумя вещами: наличием утилиты через command -v xclip до попыток её вызвать, и таймаутом чтения - xclip -o может ждать выбора, если запрошенный тип сейчас невозможен. Практика проста: перед чтением буфера сверьте xclip -selection clipboard -o -t TARGETS, посмотрите, какие типы доступны, и уже потом забирайте нужный. На неожиданных форматах это спасает от зависших труб.

Гигиена, буфер обмена как поверхность атаки

Содержимое буфера видит любая программа в графической сессии, и скопированный пароль лежит там дольше, чем следовало бы. Поэтому три правила. Первое: очищайте буфер после вставки, особенно на общих машинах. Второе: не храните там долго конфиги с ключами; результат xclip -o можно бездумно отдать в плеер, который логирует историю, и тайная строка окажется в логе. Третье: осознайте, что менеджеры буфера (copyq, parcellite) ведут историю; на машинах с чувствительными данными её стоит отключить или очищать по расписанию.

Аналоги и расширения, copyq, roficlip и именные буферы

Когда сценариев становится много, xclip перестаёт закрывать потребность в истории и коллекциях вставок. Тогда смотрят на менеджеры буфера: copyq хранит историю, скриптуется из командной строки и умеет вызов своих пунктов по хоткею; parcellite минималистичен; в мире dmenu/rofi есть плагины, которые выбирают старый клип по fuzzy-поиску. Для большинства читателей достаточно xclip в связке с маленькими alias, но знать, что дверь в системные менеджеры существует, полезно - они экономят время там, где вставки повторяются десятки раз на дню.

Выбор же между xclip и xsel дело вкуса: xsel чуть короче на простых вызовах, xclip чуть явнее с типами и файлами изображений; обе живут в одном пакетном хозяйстве, и можно держать обе, чтобы чужие готовые однострочники работали без правок под конкретную утилиту.

Итог, терминал и графика наконец-то договорились

Освоив xclip и xsel, вы больше не делите мир на терминал и мышь: данные текут туда-обратно одной командой, и автоматизация добирается до таких мест, где она раньше спотыкалась о межпроцессную границу оконной системы. Начните с двух алиасов - взять-в-буфер и отдать-из-буфера - и через неделю обнаружите, что строки вроде openssl rand | xclip стали постоянными жителями вашей шпаргалки, а промежуточные файлы на рабочем столе куда-то исчезли.

Отладка типичных проблем с буфером

Если вставка не срабатывает, проверяется шпаргалка из трёх строк. Первое: какой буфер использовался - повторите с -selection clipboard. Второе: существует ли в буфере нужный MIME - xclip -selection clipboard -o -t TARGETS расскажет, что доступно. Третье: не съехал ли DISPLAY - echo $DISPLAY должен показать :0 или :1 в графической сессии; пустая переменная объясняет любые странности на SSH без форвардинга.

Четвёртая проверка - не пуст ли буфер: данные могли быть перезаписаны системным меняеджером клипборда или просто не доехали. Пятая - mime text с окончаниями строк CRLF, которые xclip бережно пронесёт сквозь буфер, и целевая программа может отреагировать не так, как вы ожидали; tr -d \\r чистит такое перед вставкой. Освоив эту мини-диагностику, вы обнаружите, что буфер обмена перестал быть коробкой с секретом и стал хорошо читаемым каналом данных, который слушается ровно с обозначенных флагами командой.

Практические заготовки для ежедневника администратора

Завершим материал парой заготовок, которые живут в алиасах годами без правок. Скопировать публичный ключ в буфер: alias pubkey='cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard && echo скопировано'. Показать текущий буфер в терминале: alias cbshow='xclip -selection clipboard -o'. Быстрый пароль в буфер: alias genpass='openssl rand -base64 15 | tr -d \\n | xclip -selection clipboard'. Подсчёт строк из буфера: alias cbwc='xclip -o | wc -l'. Эти четыре строки экономят сотни движений мышью в неделю и стоят в rc-файле рядом с alias для ls, как и любые настоящие рабочие инструменты.

Скриптовый пример, массовая обработка ссылок из буфера

Для полноты картины приведём сквозной мини-сценарий, который каждый может взять как шаблон. Задача: взять из буфера список URL, скачать каждый файл и собрать отчёт. Реализация: xclip -selection clipboard -o | grep -Eo 'https?://[^ ]+' | while read -r url; do fname=$(basename "$url"); curl -sSL -o "$fname" "$url" && echo "$url -> $fname"; done. Пайп с буфером здесь делает всю транспортную работу: человек выделил список на странице, запустил скрипт - результат готов. Никаких промежуточных файлов и копипасты по одному адресу.

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

И последнее перед тем, как вы закроете эту вкладку: проверьте один раз, что выбранный инструмент живёт в репозиториях вашей системы - apt install xclip или dnf install xsel решают вопрос на годы. А ещё через неделю ценность этих необычных привычек оценят уже коллеги, когда вы вставите точный traceback в чат быстрее, чем они успеют сфотографировать экран телефоном.

И маленькое заключительное напоминание: скрипты с буфером - это не тайна с интерфейсами, а обычный текст между процессами, и относиться к ним полезно с той же аккуратностью, что и к любой автоматизации, влияющей на то, что уйдёт в чат или попадёт в командную строку.

Тем самым замыкается круг: терминал перестаёт быть изолированным островом, а буфер обмена - короткой чёрной дырой между экраном и командной строкой, в которую легко заглянуть командой.
Пользуйтесь с удовольствием.