Есть ли способ сделать вставку в терминал безопасной?

16

Я вставляю имена файлов / etc в Terminal все время, и иногда содержимое буфера обмена не соответствует ожиданиям.

Часто в результате получается несколько сотен строк текста (например, исходного кода), вставленных в командную строку, при этом бог знает только, что за злоба.

Есть ли способ предотвратить слепое выполнение bash того, что я вставил? Я хотел бы, чтобы он просто вставил текст, и позвольте мне после этого решить, хочу ли я выполнить его.

Абхи Беккерт
источник

Ответы:

10

Предполагая, что вы используете bash: Если вы активируете сочетания клавиш emacs, set -o emacsвы также можете использовать Emacs для редактирования командной строки:

  • Введите Ctrl-XCtrl-Eв командной строке, чтобы запустить Emacs
  • Вставьте и отредактируйте содержимое буфера обмена в буфер Emacs
  • Используйте Ctrl-XCtrl-Cдля выхода из Emacs и автоматического запуска команды.
Nohillside
источник
Я полагаю, вы имеете в виду Ctrlвместо Cmd. Кроме того, без этого, set -o emacsкажется, использовать $EDITOR. Благодарность! это потрясающе.
Абхи Бекерт
5

Возможно, самое простое решение - использовать текстовый редактор в качестве буфера, где вы можете дважды проверить содержимое, а затем скопировать из текстового редактора в терминал. Если вы используете TextEdit для этого, вы, вероятно, захотите убедиться, что он находится в режиме обычного текста ( меню « Формат» → « Создать обычный текст» ; ⇧⌘T), чтобы избежать проблем, таких как вставка ссылок в виде ссылок, а не URL-адресов.

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

Вы хотите это: выбор без перевода строки

Не это: выбор с новой строки

Конечно, если вы копируете материал с новыми строками в тексте ( то есть с несколькими параграфами), вам придется вручную редактировать выделение.

robmathers
источник
проблема в том, что я вставляю вещи в терминал несколько сотен раз каждый день. с помощью текстового редактора посередине было бы больно в задницу
Abhi Beckert
Злоумышленник может встроить возврат каретки в текст, чтобы их не было видно на экране, поэтому ваш пример выбора текста не обязательно обеспечивает какую-либо защиту.
sh1
1

Я тоже это понимаю!

Мое решение - вставить, используя менеджер буфера обмена Launchbar , с помощью горячей клавиши Cmd+\. Это вызывает список недавних вырезок, что позволяет мне предварительно просмотреть результат перед вставкой: если я не вижу ожидаемый контент, я нажимаю escape перед выпуском Cmd. Я также могу использовать клавишу со стрелкой, чтобы «ввести» обрезку текста, что позволяет мне просматривать содержимое построчно.

Я полагаю, что большинство пусковых установок делают это - Альфред (дополнение аддона) и Ртуть (бесплатно), например.

ptim
источник
1

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

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

SIGSEGV
источник
1

Используйте пасту в скобках .

Вставка в скобках - это функция, при которой терминал сообщает оболочке, что вы вставили что-то, а не просто печатаете ее, поэтому оболочка не может выполнить команду, пока вы не нажмете Enter.

Terminal.app поддерживает это, но не все терминалы поддерживают.

Точно так же не все оболочки поддерживают это. Версия bash, которая поставляется с OS X, не поддерживает вставку в скобках (на момент написания статьи это v3.2.57).

Однако zsh поддерживает вставку в скобках:

ЗШ-квадратные скобки вставить

Zsh в основном совместим с bash (даже сценарии, вероятно, будут работать, если вы не используете какую-то неясную функцию), и лучше во многих отношениях - например, он даже имеет многострочное редактирование команд!

ЗШ-многострочный-команда

Серебряный Волк - Восстановить Монику
источник
Как вы активируете пасту в скобках?
Абхи Беккерт
1
Он включен по умолчанию, если вы используете zsh. Попробуйте вставить в одну строку! Он должен быть подсвечен, как на моем первом скриншоте, и если вы нажмете «Удалить» один раз, он должен удалить все это.
Серебряный Волк - Восстановить Монику
Я на самом деле нашел его случайно, потом удивился, почему его не было в bash. Оказывается, по умолчанию bash действительно старый. (:
Серебряный Волк - Восстановить Монику
0

Вы можете поместить этот маленький скрипт Bash где-нибудь в вашем PATH:

#!/bin/bash

read -p "Are you sure you wish to execute \`$(pbpaste)\`? (Y/n) "    
[[ $REPLY =~ ^[Yy]?$  ]] && pbpaste | bash

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

Альтернативный подход состоит в том, чтобы запустить текстовый редактор с содержимым буфера обмена изнутри оболочки и автоматически выполнить отредактированное содержимое при выходе. Например:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP
Gerry
источник
Почему уцелевшие назад клещи? Использование '' также должно работать.
холме
@patrix Если я не уйду от обратных галочек, bash уже выполнит его во время запроса.
Джерри
Разве опускание кавычек тоже не поможет?
холме
@patrix О, да, конечно, это просто вопрос того, как вы хотите отформатировать приглашение. Я выбрал обратные пометки, потому что они являются оператором подстановки команд и обычно используются для визуальной разметки команд (см. Редактирование StackExchange).
Джерри
Я в порядке с этим :-) Это только кажется немного сложным
nohillside
0

В разделе Preferences -> Profiles -> Basic -> Advanced«Вставить переводы строк при возврате каретки». (Basic - это имя одного профиля. Если вы используете другой профиль, вы должны выбрать этот.)

В некоторых оболочках (zsh и bash у меня работают, tcsh нет) это позволит вам редактировать или прерывать (через Ctrl-C) то, что вставляется, прежде чем какая-либо его часть будет передана в оболочку.

Возможно, вам придется создать новое окно терминала, чтобы настройки начали работать.

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

Джошуа Голдберг
источник
Я только что узнал, что TextEdit также делает прямоугольное выделение.
Джошуа Голдберг