Чи є спосіб зробити вклеювання в термінал безпечним?


17

Я постійно вставляю імена файлів / тощо в термінал, і час від часу вміст буфера обміну не є тим, що я очікую.

Часто результатом є кілька сотень рядків тексту (наприклад, вихідний код), вставлених у командний рядок, ініціюючи, бог знає лише, що таке гнучкість.

Чи є спосіб запобігти сліпому виконанню того, що я вставлю? Я б хотів, щоб він просто вставив текст, і я дозволю собі вирішити, чи хочу його виконати.


Відповіді:


10

Якщо припустимо, що ви використовуєте bash: Якщо ви активуєте ярлики emacs, set -o emacsви також можете використовувати Emacs для редагування командного рядка:

  • Введіть Ctrl-XCtrl-Eпідказку для запуску Emacs
  • Вставте та відредагуйте вміст буфера обміну в буфер Emacs
  • Використовуйте Ctrl-XCtrl-Cдля виходу з Emacs та автоматично запускайте команди (и).

Я припускаю, що ви маєте на увазі Ctrlзамість цього Cmd. Крім того, не роблячи set -o emacsце, здається, використовують $EDITOR. Спасибі! це прекрасно.
Абхі Беккерт

5

Найпростішим рішенням є, мабуть, використання текстового редактора як буфера, де ви можете двічі перевірити вміст, а потім скопіювати з текстового редактора в Terminal. Якщо ви використовуєте TextEdit для цього, ви, ймовірно, хочете переконатися, що він знаходиться в простому текстовому режимі ( меню ФорматЗробити звичайний текст ; ⇧⌘T), щоб уникнути таких питань, як вставки, що посилаються як посилання, а не URL.

Інша річ, що слід зазначити, що Bash намагатиметься виконати все, що передує новому символу рядка, тому, якщо ви копіюєте блок тексту, ви, можливо, захочете, щоб ваш вибір зупинився після останнього символу, а не включав кінець рядок.

Ти хочеш це: вибір без нового рядка

Не це: підбір з новим рядком

Звичайно, якщо ви копіюєте речі з новими рядками в тексті ( тобто декількома абзацами), вам потрібно буде вручну відредагувати виділення.


проблема в тому, що я вставляю речі в термінал кілька сотень разів щодня. використання текстового редактора посередині було б болем у попці
Абхі Беккерт

Зловмисник може вбудовувати повернення каретки в текст, не видно їх на екрані, тому ваш приклад того, як вибрати текст, не обов'язково забезпечує захист.
sh1

2

Використовуйте скориноване пасту .

Скріплене вставлення - це функція, де термінал повідомляє оболонці, що ви щось вставили замість того, щоб просто ввести її, тому оболонка не може запустити команду, поки не натиснете Enter.

Terminal.app підтримує це, але це не всі термінали.

Так само не всі оболонки підтримують це. Версія bash, що постачається з OS X, не підтримує скористовану пасту (станом на час написання, це v3.2.57).

Однак zsh підтримує вставну скобку:

zsh-bracketed-paste

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

zsh-multiline-command


Як активувати скориноване пасту?
Абхі Беккерт

2
Увімкнено за замовчуванням, якщо ви використовуєте zsh. Спробуйте вставити в якийсь один вкладиш! Це має бути виокремленим, як у моєму першому скріншоті, і якщо натиснути Видалити один раз, він повинен видалити всю справу.
SilverWolf - Відновіть Моніку

1
Я насправді знайшов це випадково, а потім задумався, чому це не в баш. Виявляється, баш за замовчуванням справді старий. (:
SilverWolf - Відновити Моніку

1

Я також це розумію!

Моє рішення - вставити за допомогою менеджера буфера обміну Launchbar за допомогою гарячої клавіші Cmd+\. Тут з'являється список останніх вирізань, що дозволяє мені переглянути результат перед вставкою: якщо я не бачу очікуваного вами вмісту, натискаю клавішу escape, перш ніж випустити Cmd. Я також можу використовувати клавішу зі стрілкою для 'введення' текстового відсікання, що дозволяє мені бачити вміст рядок.

Я вважаю, що це робить більшість пускових установок - наприклад, Альфред (powerpack addon) та Quicksilver (безкоштовно).


1

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

Там багато менеджерів буфера обміну, тому якщо Jumpcut не пливе на вашому човні, можливо, інший краще відповідатиме вашим потребам


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

Чому втекли кліщі назад? Використання '' також має працювати.
nohillside

@patrix Якщо я не уникну задників, bash вже виконає його під час запиту.
Джеррі

Чи не слід також пропускати задні підказки і трюк?
nohillside

@patrix Так, звичайно, це лише питання переваги того, як ви хочете відформатувати підказку. Я вибрав зворотні посилання, оскільки вони є оператором підстановки команд і зазвичай використовуються для візуального розмітки команд (див. Редагування StackExchange).
Геррі

З цим я все в порядку :-) Це просто здається складною
nohillside

0

Під Preferences -> Profiles -> Basic -> Advanced, поставте прапорець "Вставити нові рядки після повернення вагона". (Основне - це ім'я одного профілю. Якщо ви використовуєте інший профіль, виберіть його замість нього.)

У деяких оболонках (zsh і bash для мене працюють, tcsh не робить) це дозволить вам редагувати або скасовувати (через Ctrl-C) те, що вставлено перед тим, як будь-яка його частина передається оболонці.

Можливо, вам доведеться створити нове вікно терміналу, щоб налаштування почало працювати.

Я використовую цю функцію весь час не тільки для вставки та редагування складних команд, а й для перегляду колонного тексту, а іноді для вибору та копіювання суб прямокутників, перетягуючи клавішу опції.


Я тільки що дізнався, що TextEdit також робить прямокутний вибір.
Джошуа Голдберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.