[О блоге] [наверх] [пред] [2020-10-07 13:22:57+03:00] [cae7931cc800c658d90a15b8cdca5356b0c9e179]
Темы: [tip][tmux]

Bracketed paste в tmux

Ещё со времён XTerm-а терминалы могут отправлять особую escape
последовательность чтобы показать программе что идёт вставка из буфера
обмена, а не что-то набирается руками пользователя. Тогда в Vim не нужно
заниматься ручным pastetoggle-ом. Давно удивляюсь как люди продолжают
эту ручную работу.

Но это не поможет с tmux-ом, который является терминальным приложением.
С ним проблем у меня не было, потому что использую плагин Tbone,
интегрирующий tmux и Vim. А сегодня решил почитать man tmux и увидел что
в нём давно уже есть возможность делать bracketed paste. И default
клавишу можно просто перебить на bracketed paste enabled режим:
    bind ] paste-buffer -p

Я сейчас использую 3.2rc2 версию tmux, в которой оно, похоже, само
автоматом включено и bracketed paste автоматом включён.

    [оставить комментарий]
    комментарий 0:
    From: kmeaw
    Date: 2020-10-08 07:58:00Z
    
    Я был удивлён, когда обнаружил, что Zsh знает про это.
    То есть если вставить в интерактивный шелл пачку команд, то он не начнёт
    их немедленно выполнять, как только дочитает первую строку, а будет
    считать всё встравленное одним большим блоком, ожидая, когда я
    по-настоящему нажму Enter, чтобы дать мне шанс отредактировать
    вставленное.
    
    И, одновременно, есть сценарий, который у меня ломается от такого
    поведения. Когда я по ssh подключаюсь к удалённой машине с Zsh, и хочу
    допробросить какой-нибудь порт, то делаю это через command line,
    встроенный в ssh ("ssh> "). В ней я печатаю "-L1234:", например, а
    потом, если хочу вставить из X11 selection назначение, то получается не
    то, чего я хочу на самом деле, так как помимо "host:port" вокруг
    вставляемой строки добавляются те самые brackets.
    
    Видимо, придётся патчить ssh, чтобы просить его временно отключать этот
    режим работы терминала, когда я открываю command line, и возвращать
    состояние обратно, когда возвращаюсь к pty.
    
    комментарий 1:
    From: Sergey Matveev
    Date: 2020-10-08 08:23:34Z
    
    *** kmeaw [2020-10-08 10:38]:
    >То есть если вставить в интерактивный шелл пачку команд, то он не начнёт
    >их немедленно выполнять, как только дочитает первую строку, а будет
    >считать всё встравленное одним большим блоком
    
    Пока вы это не написали, то я даже не обращал на это внимание. А ведь
    действительно: он даже отдельно у меня (курсивом) подсвечивает этот
    вставленный блок, показывая что его ещё можно отредактировать. Но это у
    меня, получается, с самого начала так было и поэтому просто принимал как
    есть, как данность.
    
    >допробросить какой-нибудь порт, то делаю это через command line,
    >встроенный в ssh ("ssh> ")
    
    Даже не замечал его command line :-) и никогда не пользовался. Но да,
    бывают что какие-то программы не понимают этот bracketed paste, хотя я с
    ходу и не вспомню где на своей практике встречался с непонимающими его.
    
    комментарий 2:
    From: kmeaw
    Date: 2021-05-14 09:35:55Z
    
    Сегодня показывал коллегам, как копировать имя ветки в pull-request из
    браузера и вставить его в command-line git'а, чтобы не получалось
    такого:
    
      % git checkout foo-bar
      Branch 'foo-bar' set up to track remote branch 'foo-bar' from 'origin'.
      Switched to a new branch 'foo-bar'.
      % to master
      to: command not found
      %
    
    И обнаружил проблему (уязвимость?) - копируемый в буфер фрагмент может
    содержать строку "\033[201~", из-за чего шелл не может определить
    границу встравляемого фрагмента, что может вызвать выполнение кода.
    Средства CSS достаточно богаты, чтобы визуально скрыть наличие этих
    спецсимволов.
    
    Воспроизводится в zsh 5.8 и GNU bash, version 4.4.23(1)-release с
    GNU Readline 7.0p5 в urxvt v9.22. В xterm и vte не воспроизводится,
    потому что там нельзя вставить ^[.
    
    Так что не стоит воспринимать эту фичу, как security measure, а лишь как
    удобный способ вставлять данные из доверенных источников.
    
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=787628
    
    комментарий 3:
    From: Sergey Matveev
    Date: 2021-05-14 09:44:07Z
    
    *** kmeaw [2021-05-14 12:34]:
    >Так что не стоит воспринимать эту фичу, как security measure, а лишь как
    >удобный способ вставлять данные из доверенных источников.
    
    Безусловно к security тут отношения никакого. Согласен с комментариями в
    bugtracker-е поясняюшими что это не задача терминала и в целом не
    выполнима, ибо он не знает про приложение ничего в нём запущенное.
    
    Когда-то ещё видел примеры атак когда CSS-ом, если не ошибаюсь, скрывают
    текст, который при бездумной вставке через буфер обмена может содержать
    всякую зловредную бяку. Так что да -- уже не в первый раз показывают что
    нельзя просто так брать и копировать текст для выполнения в shell-е.