Terminal'e yapıştırma işlemini güvenli hale getirmenin bir yolu var mı?


17

Dosya adlarını / etc'yi her zaman Terminal'e yapıştırıyorum ve bazen panonun içeriği beklediğim gibi değil.

Genellikle sonuç, komut istemine yapıştırılan birkaç yüz satırlık metin (örn. Kaynak kodu) olup, tanrıyı tetiklemek sadece neyin yanlış olduğunu bilir.

Yapıştırdığım her şeyi bash'ın körü körüne yürütmesini önlemenin bir yolu var mı? Keşke metni yapıştırır ve yürütmek isteyip istemediğime karar vereyim.


Yanıtlar:


10

Bash kullandığınızı varsayarsak: emacs kısayollarını etkinleştirirseniz set -o emacs, komut satırını düzenlemek için Emacs'ı da kullanabilirsiniz:

  • Tip Ctrl-XCtrl-EEmacs başlatmak için isteminde
  • Pano içeriğinizi Emacs arabelleğine yapıştırın ve düzenleyin
  • Kullanım Ctrl-XCtrl-CEmacs çıkıp otomatik komutu (ler) çalıştırmak için.

Bunun Ctrlyerine demek istediğini sanıyorum Cmd. Ayrıca, yapmadan set -o emacskullanmak gibi görünüyor $EDITOR. Teşekkürler! bu harika.
Abhi Beckert

5

En basit çözüm muhtemelen bir metin düzenleyicisini arabellek olarak kullanmaktır, burada içeriği iki kez kontrol edebilir, ardından metin düzenleyiciden Terminal'e kopyalayabilirsiniz. Bunun için TextEdit kullanıyorsanız , URL'leri değil, bağlantı olarak yapıştırma gibi sorunları önlemek için muhtemelen düz metin modunda ( Biçim menüsü → Düz Metin Yap ; ⇧⌘T) olduğundan emin olmak istersiniz.

Dikkat edilmesi gereken diğer bir şey, Bash'in yeni satır karakterinden önce her şeyi yürütmeye çalışacağıdır, bu nedenle bir metin bloğunu kopyalıyorsanız, seçiminizin karakterin sonunu eklemek yerine son karakterden sonra durmasını sağlamak isteyebilirsiniz. hat.

Bunu istiyorsun: satırsonu olmadan seçim

Bu değil: satırsonu ile seçim

Tabii ki, metnin içinde yeni satırlar ( yani birden çok paragraf) olan şeyleri kopyalıyorsanız , seçimi manuel olarak düzenlemeniz gerekir.


Sorun şu ki, her gün yüzlerce kez terminale bir şeyler yapıştırıyorum. ortada bir metin editörü kullanmak kıçında bir acı olurdu
Abhi Beckert

Bir saldırgan, ekranda görünmeden taşıyıcı dönüşlerini metne gömebilir, bu nedenle metni nasıl seçeceğinize dair bir örnek herhangi bir koruma sağlamaz.
sh1

2

Köşeli paçavra kullanın .

Köşeli ayraç yapıştır, terminalin kabuğa yalnızca yazmak yerine bir şey yapıştırdığınızı bildirdiği bir özelliktir, böylece Enter tuşuna basana kadar kabuk komutu çalıştıramaz.

Terminal.app bunu destekler, ancak tüm terminaller desteklemez.

Aynı şekilde, tüm mermiler de onu desteklemez. OS X ile gelen bash sürümü, parantez macunu desteklemez (yazma tarihi itibariyle v3.2.57).

Ancak, zsh köşeli macunu destekler:

zsh-parantez-yapıştır

Zsh çoğunlukla bash ile uyumludur (gerçekten belirsiz bir özellik kullanmadığınız sürece komut dosyaları bile muhtemelen çalışır) ve birçok yönden daha iyi - örneğin, çok satırlı komut düzenleme bile var!

zsh-satırlı-komuta


Basamaklı macunu nasıl etkinleştirirsiniz?
Abhi Beckert

2
Zsh kullanıyorsanız varsayılan olarak açıktır. Bir astar yapıştırmayı deneyin! İlk ekran görüntümdeki gibi ters vurgulanmalı ve bir kez Sil'e basarsanız her şeyi silmeli.
SilverWolf - Monica'yı

1
Aslında kazara buldum, sonra neden bash içinde olmadığını merak ettim. Varsayılan bash gerçekten eski. (:
SilverWolf - Monica'yı

1

Ben de anladım!

Benim çözümüm, Launchbar'ın pano yöneticisini kısayol tuşuyla yapıştırmak Cmd+\. Bu, son kırpılanların bir listesini getirir, yapıştırmadan önce sonucu önizlememe izin verir: beklediğim içeriği görmezsem, Cmd'yi bırakmadan önce kaçış yaptım. Ayrıca, metin kırpmasını 'girmek' için ok tuşunu kullanarak içeriği satır satır görmeme izin verebilirim.

Çoğu rampanın bunu yaptığına inanıyorum - örneğin Alfred (powerpack addon) ve Quicksilver (ücretsiz).


1

Bir pano yöneticisine bakmak isteyebilirsiniz. Jumpcut adında ücretsiz, hafif bir tane kullanıyorum . İçeriği yapıştırmadan önce birden fazla pano tutmamı ve içinde ne saklandığını görmemi sağlıyor, hepsi klavyeden.

Orada birçok pano yöneticisi var, bu yüzden Jumpcut teknenizi yüzdürmezse, belki başka biri ihtiyaçlarınıza daha iyi uyacaktır


0

Bu küçük Bash betiğini aşağıdaki yerlere koyabilirsiniz PATH:

#!/bin/bash

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

Bu içerikleri /usr/local/pbexecuteörneğin içine koyar ve çalıştırılabilir yaparsam pbexecute, pano içeriğini çalıştırmadan önce onayımı isteyecek komut satırından güvenle çalıştırabilirim .

Alternatif bir yaklaşım, panonun içeriğini kabuk içinden bir metin düzenleyici başlatmak ve çıktıktan sonra düzenlenen içeriği otomatik olarak yürütmektir. Örneğin:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP

Neden kaçan sırt keneler? '' Kullanmak da işe yarayacaktır.
nohillside

@patrix Eğer ters çivilerden kaçmazsam, bash istemde zaten yürütür.
Gerry

O zaman backtick atlamak hile yapmak değil mi?
nohillside

@patrix Oh, evet tabii ki, bu istemi nasıl biçimlendirmek istediğinize dair bir tercih meselesi. Çünkü onlar komut ikame operatörü ve komutları görsel olarak işaretlemek için kullanılan backticks seçtim (bkz. StackExchange düzenleme).
Gerry

Ben bununla iyiyim :-) Bu biraz karışık görünüyor
nohillside

0

Altında Preferences -> Profiles -> Basic -> Advanced, "Yeni satırları satır başı olarak yapıştır" ı işaretleyin. (Temel, bir profilin adıdır. Başka bir profil kullanıyorsanız, bunun yerine bu profili seçmelisiniz.)

Gelen bazı kabukları (zsh ve benim için bash çalışmaları, tcsh değil) bu da herhangi bir bölümünün kabuk geçirilir önce yapıştırılan ne size (Ctrl-C aracılığıyla) iptal düzenleme veya izin verir.

Tercihin çalışmaya başlaması için yeni bir Terminal penceresi açmanız gerekebilir.

Bu özelliği her zaman, yalnızca karmaşık komutları yapıştırmak ve düzenlemek için değil, aynı zamanda sütunlu metni görüntülemek ve bazen seçenek tuşunu sürükleyerek alt dikdörtgenleri seçmek ve kopyalamak için kullanıyorum.


TextEdit'in dikdörtgen seçimi de yaptığını öğrendim.
Joshua Goldberg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.