Czy istnieje sposób na bezpieczne wklejenie w terminalu?

17

Cały czas wklejam nazwy plików / etc do Terminala, a czasami zawartość schowka nie jest tym, czego oczekuję.

Często wynikiem jest kilkaset wierszy tekstu (np. Kodu źródłowego) wklejonych do wiersza poleceń, co powoduje, że bóg wie tylko, jaką paskudność.

Czy jest jakiś sposób, aby zapobiec ślepemu wykonywaniu przez bash wszystkiego, co wkleję? Chciałbym, żeby po prostu wkleił tekst i pozwolił mi później zdecydować, czy chcę go wykonać.

Abhi Beckert
źródło

Odpowiedzi:

10

Zakładając, że używasz bash: Jeśli aktywujesz za pomocą skrótów emacs set -o emacs, możesz także użyć Emacsa do edycji wiersza poleceń:

  • Wpisz Ctrl-XCtrl-Epolecenie, aby uruchomić Emacsa
  • Wklej i edytuj zawartość schowka w buforze Emacsa
  • Użyj, Ctrl-XCtrl-Caby wyjść z Emacsa i automatycznie uruchomić polecenia.
nohillside
źródło
Zakładam, że masz na myśli Ctrlzamiast Cmd. Poza set -o emacstym wydaje się , że nie działa $EDITOR. Dzięki! to jest doskonałe.
Abhi Beckert
5

Najprostszym rozwiązaniem jest prawdopodobnie użycie edytora tekstu jako bufora, w którym można dwukrotnie sprawdzić zawartość, a następnie skopiować z edytora tekstu do terminalu. Jeśli używasz do tego TextEdit, prawdopodobnie będziesz chciał upewnić się, że jest w trybie zwykłego tekstu ( menu FormatUtwórz zwykły tekst ; ⇧⌘T), aby uniknąć problemów takich jak wklejanie linków jako linki, a nie adresy URL.

Inną rzeczą do odnotowania jest to, że Bash spróbuje wykonać wszystko poprzedzające znak nowej linii, więc jeśli kopiujesz blok tekstu, możesz chcieć upewnić się, że zaznaczenie zatrzyma się po ostatnim znaku, zamiast zawierać koniec linia.

Chcesz to: wybór bez nowej linii

Nie to: wybór z nową linią

Oczywiście, jeśli kopiujesz rzeczy z nowymi liniami w tekście ( np. Wiele akapitów), musisz ręcznie edytować zaznaczenie.

robmathers
źródło
Problem polega na tym, że codziennie wklejam rzeczy do terminala kilkaset razy. użycie edytora tekstu w środku byłoby uciążliwe
Abhi Beckert
Atakujący może osadzić znaki powrotu karetki w tekście bez ich widoczności na ekranie, więc przykład wyboru tekstu niekoniecznie zapewnia ochronę.
sh1
2

Użyj wklejania w nawiasach .

Wklejanie w nawiasach to funkcja, w której terminal informuje powłokę, że coś wkleiłeś, zamiast po prostu pisać, więc powłoka nie może uruchomić polecenia, dopóki nie naciśniesz Enter.

Terminal.app obsługuje to, ale nie wszystkie terminale obsługują.

Podobnie, nie wszystkie powłoki też to obsługują. Wersja bash dostarczana z OS X nie obsługuje wklejania w nawiasach kwadratowych (w chwili pisania tego tekstu jest to wersja 3.2.57).

Jednak zsh obsługuje wklejanie w nawiasach:

zsh-bracketing-paste

Zsh jest w większości kompatybilny z bash (nawet skrypty prawdopodobnie będą działać, chyba że użyjesz jakiejś naprawdę niejasnej funkcji) i lepiej na wiele sposobów - na przykład, ma nawet edytowanie poleceń w wielu wierszach!

zsh-multiline-command

SilverWolf - Przywróć Monikę
źródło
Jak aktywować wklejanie w nawiasach?
Abhi Beckert
2
Jest domyślnie włączony, jeśli używasz zsh. Spróbuj wkleić w jednej linijce! Powinien być podświetlony odwrotnie, jak na moim pierwszym zrzucie ekranu, a jeśli raz naciśniesz Usuń, powinien usunąć całą rzecz.
SilverWolf - Przywróć Monikę
1
Właściwie to znalazłem to przez przypadek, a potem zastanawiałem się, dlaczego nie było to bash. Okazuje się, że domyślna bash jest naprawdę stara. (:
SilverWolf - Przywróć Monikę
1

Też to rozumiem!

Moim rozwiązaniem jest wklejenie przy użyciu paska uruchamiania menedżera schowka skrótu Cmd+\. Spowoduje to wyświetlenie listy ostatnich wycinków, dzięki czemu mogę wyświetlić podgląd wyniku przed wklejeniem: jeśli nie widzę oczekiwanej treści, uderzam w ucieczkę przed wydaniem Cmd. Mogę również użyć klawisza strzałki, aby „wprowadzić” wycinek tekstu, co pozwala mi widzieć zawartość linia po linii.

Wierzę, że większość programów uruchamiających to robi - na przykład Alfred (dodatek do powerpack) i Quicksilver (bezpłatny).

ptim
źródło
1

Możesz zajrzeć do menedżera schowka. Używam darmowego, lekkiego o nazwie Jumpcut . Pozwala mi to przechowywać wiele schowków i sprawdzać, co jest w nich zapisane, zanim wkleję zawartość, wszystko z klawiatury.

Istnieje wielu menedżerów schowka, więc jeśli Jumpcut nie unosi twojej łodzi, być może inny lepiej spełni twoje potrzeby

Sigsegv
źródło
0

Możesz umieścić ten mały skrypt Bash gdzieś w swoim PATH:

#!/bin/bash

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

Gdybym /usr/local/pbexecutena przykład umieścił te treści i uczynił je wykonywalnymi, mógłbym je bezpiecznie wykonaćpbexecute z wiersza poleceń, co poprosiłoby o moje potwierdzenie przed uruchomieniem zawartości schowka.

Alternatywnym podejściem jest uruchomienie edytora tekstu z zawartością schowka ze skorupy i automatyczne wykonanie edytowanej zawartości po wyjściu. Na przykład:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP
Gerry
źródło
Dlaczego ucieka tyknięcie? Używanie „” również powinno działać.
nohillside
@patrix Jeśli nie ucieknę od backticksa, bash już go wykona podczas pytania.
Gerry
Czy nie powinno być pominięcie lewostków?
nohillside
@patrix Och, tak, oczywiście, to tylko kwestia preferencji, jak chcesz sformatować monit. Wybrałem backticks, ponieważ są one operatorem zastępowania poleceń i są powszechnie używane do wizualnego oznaczania poleceń (patrz edycja StackExchange).
Gerry
Nie mam nic
przeciwko
0

Poniżej Preferences -> Profiles -> Basic -> Advancedzaznacz „Wklej nowe linie jako zwrot karetki”. (Podstawowa to nazwa jednego profilu. Jeśli używasz innego profilu, powinieneś go wybrać).

W niektórych powłokach (zsh i bash działają dla mnie, tcsh nie działa) pozwoli ci to edytować lub przerwać (za pomocą Ctrl-C) to, co jest wklejane, zanim jakakolwiek jego część zostanie przekazana do powłoki.

Może być konieczne utworzenie nowego okna terminala, aby preferencje zaczęły działać.

Korzystam z tej funkcji cały czas, nie tylko do wklejania i edytowania złożonych poleceń, ale także do przeglądania tekstu w kolumnach, a czasem do wybierania i kopiowania pod prostokątów poprzez przeciąganie za pomocą klawisza opcji.

Joshua Goldberg
źródło
Właśnie dowiedziałem się, że TextEdit dokonuje wyboru prostokątnego.
Joshua Goldberg