Apakah ada cara untuk membuat pasta ke Terminal aman?

15

Saya menempelkan nama file / etc ke Terminal sepanjang waktu, dan kadang-kadang isi clipboard bukan yang saya harapkan.

Seringkali hasilnya adalah beberapa ratus baris teks (misalnya, kode sumber) disisipkan ke command prompt, memicu dewa hanya tahu apa kekotoran.

Apakah ada cara untuk mencegah bash mengeksekusi secara membuta apa pun yang saya tempelkan? Saya berharap itu hanya akan menempelkan teks, dan biarkan saya memutuskan setelah jika saya ingin menjalankannya.

Abhi Beckert
sumber

Jawaban:

9

Dengan asumsi Anda menggunakan bash: Jika Anda mengaktifkan pintasan emacs dengan set -o emacsAnda juga dapat menggunakan Emacs untuk mengedit baris perintah:

  • Ketik Ctrl-XCtrl-Epada prompt untuk memulai Emacs
  • Rekatkan dan edit konten clipboard Anda ke dalam buffer Emacs
  • Gunakan Ctrl-XCtrl-Cuntuk keluar dari Emacs dan secara otomatis menjalankan perintah.
nohillside
sumber
Saya menganggap maksud Anda Ctrlalih-alih Cmd. Juga, tanpa melakukan set -o emacsitu sepertinya digunakan $EDITOR. Terima kasih! ini sempurna.
Abhi Beckert
5

Solusi paling sederhana adalah dengan menggunakan editor teks sebagai penyangga di mana Anda dapat memeriksa ulang konten, kemudian menyalin dari editor teks ke Terminal. Jika Anda menggunakan TextEdit untuk ini, Anda mungkin ingin memastikan itu dalam mode teks biasa ( Format menu → Make Plain Text ; ⇧⌘T) untuk menghindari masalah seperti menempelkan tautan sebagai tautan, bukan URL.

Hal lain yang perlu diperhatikan adalah bahwa Bash akan mencoba untuk mengeksekusi semua yang mendahului karakter baris baru, jadi jika Anda menyalin blok teks, Anda mungkin ingin memastikan bahwa pilihan Anda berhenti setelah karakter terakhir, daripada memasukkan akhir dari baris.

Kamu mau ini: seleksi tanpa baris baru

Bukan ini: seleksi dengan baris baru

Tentu saja, jika Anda menyalin hal-hal dengan baris baru dalam teks ( yaitu beberapa paragraf), maka Anda harus mengedit pilihan secara manual.

perampok
sumber
masalahnya adalah, saya menempelkan semuanya ke terminal beberapa ratus kali setiap hari. menggunakan editor teks di tengah akan menyebalkan
Abhi Beckert
Penyerang dapat menanamkan carriage return dalam teks tanpa terlihat pada layar, jadi contoh Anda tentang cara memilih teks tidak selalu menawarkan perlindungan apa pun.
sh1
1

Saya mendapatkan ini juga!

Solusi saya adalah menempelkan menggunakan manajer clipboard Launchbar , dengan tombol pintas Cmd+\. Ini menampilkan daftar kliping baru-baru ini, memungkinkan saya untuk melihat pratinjau hasilnya sebelum menempel: jika saya tidak melihat konten yang saya harapkan, saya menekan escape sebelum melepaskan Cmd. Saya juga dapat menggunakan tombol panah untuk 'memasukkan' kliping teks, memungkinkan saya melihat konten baris demi baris.

Saya percaya sebagian besar peluncur melakukan ini - Alfred (addon powerpack) & Quicksilver (gratis), misalnya.

ptim
sumber
1

Anda mungkin ingin melihat ke manajer clipboard. Saya menggunakan yang gratis, ringan yang disebut Jumpcut . Ini memungkinkan saya untuk menyimpan beberapa clipboard dan melihat apa yang tersimpan di dalamnya sebelum benar-benar menempelkan konten, semuanya dari keyboard.

Ada banyak manajer clipboard di luar sana, jadi jika Jumpcut tidak mengapungkan perahu Anda, mungkin yang lain akan lebih sesuai dengan kebutuhan Anda

Sigsegv
sumber
1

Gunakan pasta yang dikurung .

Bracketed paste adalah fitur di mana terminal memberi tahu shell bahwa Anda menempelkan sesuatu alih-alih mengetiknya saja, sehingga shell tidak dapat menjalankan perintah sampai Anda menekan Enter.

Terminal.app mendukung ini, tetapi tidak semua terminal melakukannya.

Demikian juga, tidak semua cangkang mendukungnya. Versi bash yang datang dengan OS X tidak mendukung pasta braket (pada saat penulisan, ini v3.2.57).

Namun, zsh mendukung pasta yang dikurung:

zsh-bracketed-paste

Zsh sebagian besar kompatibel dengan bash (bahkan skrip mungkin akan berfungsi, kecuali jika Anda menggunakan semacam fitur yang tidak jelas), dan lebih baik dalam banyak hal — misalnya, ia bahkan memiliki pengeditan perintah multi-line!

zsh-multiline-command

SilverWolf - Pasang kembali Monica
sumber
Bagaimana Anda mengaktifkan pasta braket?
Abhi Beckert
1
Ini aktif secara default jika Anda menggunakan zsh. Cobalah menempelkannya dalam satu kalimat! Itu harus disorot terbalik seperti pada tangkapan layar pertama saya, dan jika Anda menekan Hapus setelah itu harus menghapus semuanya.
SilverWolf - Pasang kembali Monica
Saya benar-benar menemukannya secara tidak sengaja, lalu bertanya-tanya mengapa itu tidak di bash. Ternyata bash default sudah benar-benar tua. (:
SilverWolf - Reinstate Monica
0

Anda dapat menempatkan skrip Bash kecil ini di suatu tempat di PATH:

#!/bin/bash

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

Jika saya menaruh konten ini /usr/local/pbexecutesebagai contoh dan membuatnya dapat dieksekusi, saya dapat dengan aman mengeksekusipbexecute dari baris perintah, yang akan meminta konfirmasi saya sebelum mengeksekusi isi clipboard.

Pendekatan alternatif adalah meluncurkan editor teks dengan konten clipboard dari dalam shell dan secara otomatis menjalankan konten yang diedit saat keluar. Sebagai contoh:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP
Gerry
sumber
Mengapa kutu yang melarikan diri kembali? Menggunakan '' harus bekerja juga.
nohillside
@patrix Jika saya tidak melarikan diri dari backticks, bash sudah akan menjalankannya saat diminta.
Gerry
Bukankah seharusnya menghilangkan backtick melakukan trik juga?
nohillside
@patrix Oh, ya tentu saja, itu hanya masalah preferensi tentang bagaimana Anda ingin memformat prompt. Saya memilih backticks karena mereka adalah operator substitusi perintah dan biasanya digunakan untuk menandai perintah secara visual (lihat pengeditan StackExchange).
Gerry
Saya
setuju