Có cách nào để dán vào Terminal an toàn không?


15

Tôi dán tên tệp / etc vào Terminal mọi lúc, và đôi khi nội dung của bảng tạm không như tôi mong đợi.

Thông thường kết quả là hàng trăm dòng văn bản (ví dụ: mã nguồn) được dán vào dấu nhắc lệnh, kích hoạt thần chỉ biết những gì khó chịu.

Có cách nào để ngăn bash thực thi một cách mù quáng bất cứ thứ gì tôi dán vào không? Tôi ước nó sẽ chỉ dán văn bản, và để tôi quyết định sau nếu tôi muốn thực hiện nó.

Câu trả lời:


9

Giả sử bạn đang sử dụng bash: Nếu bạn kích hoạt các phím tắt emacs với set -o emacsbạn cũng có thể sử dụng Emacs để chỉnh sửa dòng lệnh:

  • Nhập Ctrl-XCtrl-Evào dấu nhắc để bắt đầu Emacs
  • Dán và chỉnh sửa nội dung clipboard của bạn vào bộ đệm Emacs
  • Sử dụng Ctrl-XCtrl-Cđể thoát Emacs và tự động chạy (các) lệnh.

Tôi giả sử bạn có nghĩa là Ctrlthay vì Cmd. Ngoài ra, mà không làm set -o emacsnó dường như sử dụng $EDITOR. Cảm ơn! đây là hoàn hảo.
Abhi Beckert

5

Giải pháp đơn giản nhất có lẽ là sử dụng trình soạn thảo văn bản làm bộ đệm trong đó bạn có thể kiểm tra kỹ nội dung, sau đó sao chép từ trình soạn thảo văn bản sang Terminal. Nếu bạn sử dụng TextEdit cho việc này, có lẽ bạn sẽ muốn đảm bảo rằng nó ở chế độ văn bản thuần túy ( Menu định dạngTạo văn bản thuần túy; T) để tránh các vấn đề như dán liên kết dưới dạng liên kết, không phải URL.

Một điều khác cần lưu ý là Bash sẽ cố gắng thực hiện mọi thứ trước một ký tự dòng mới, vì vậy nếu bạn đang sao chép một khối văn bản, bạn có thể muốn đảm bảo rằng lựa chọn của bạn dừng sau ký tự cuối cùng, thay vì bao gồm phần cuối của ký tự hàng.

Bạn muốn điều này: lựa chọn không có dòng mới

Không phải cái này: lựa chọn với dòng mới

Tất nhiên, nếu bạn đang sao chép nội dung có dòng mới trong văn bản ( nghĩa là nhiều đoạn), thì bạn sẽ cần chỉnh sửa thủ công lựa chọn.


Vấn đề là, tôi dán mọi thứ vào thiết bị đầu cuối vài trăm lần mỗi ngày. sử dụng một trình soạn thảo văn bản ở giữa sẽ là một nỗi đau ở mông
Abhi Beckert

Kẻ tấn công có thể nhúng trả lại vận chuyển trong văn bản mà không hiển thị chúng trên màn hình, vì vậy ví dụ về cách chọn văn bản của bạn không nhất thiết phải cung cấp bất kỳ sự bảo vệ nào.
sh1

1

Tôi cũng nhận được điều này!

Giải pháp của tôi là dán bằng trình quản lý clipboard của Launchbar , bằng phím nóng Cmd+\. Điều này đưa ra một danh sách các đoạn gần đây, cho phép tôi xem trước kết quả trước khi dán: nếu tôi không thấy nội dung tôi mong đợi, tôi đã thoát khỏi trước khi phát hành Cmd. Tôi cũng có thể sử dụng phím mũi tên để 'nhập' một đoạn văn bản, cho phép tôi xem từng dòng nội dung.

Tôi tin rằng hầu hết các launcher làm điều này - ví dụ Alfred (powerpack addon) & Quicksilver (miễn phí).


1

Bạn có thể muốn xem xét một trình quản lý clipboard. Tôi sử dụng một cái miễn phí, trọng lượng nhẹ gọi là Jumpcut . Nó cho phép tôi giữ nhiều clipboard và xem những gì được lưu trữ trong đó trước khi thực sự dán nội dung, tất cả từ bàn phím.

Có rất nhiều trình quản lý clipboard ngoài kia, vì vậy nếu Jumpcut không làm nổi thuyền của bạn, có thể một người khác sẽ phù hợp hơn với nhu cầu của bạn


1

Sử dụng dán khung .

Dán khung là một tính năng trong đó thiết bị đầu cuối báo cho trình bao rằng bạn đã dán một cái gì đó thay vì chỉ gõ nó, vì vậy trình bao không thể chạy lệnh cho đến khi bạn nhấn Enter.

Terminal.app hỗ trợ điều này, nhưng không phải tất cả các thiết bị đầu cuối đều làm được.

Tương tự như vậy, không phải tất cả các shell đều hỗ trợ nó. Phiên bản bash đi kèm với OS X không hỗ trợ dán ngoặc (tính đến thời điểm viết, đó là phiên bản 3.2.57).

Tuy nhiên, zsh không hỗ trợ dán ngoặc:

zsh-ngoặc-dán

Zsh hầu như tương thích với bash (thậm chí các tập lệnh có thể sẽ hoạt động, trừ khi bạn sử dụng một số tính năng thực sự tối nghĩa), và tốt hơn là theo nhiều cách, ví dụ, còn có tính năng chỉnh sửa lệnh nhiều dòng!

lệnh zsh-multiline


Làm thế nào để bạn kích hoạt dán ngoặc?
Abhi Beckert

1
Theo mặc định, nếu bạn sử dụng zsh. Hãy thử dán trong một số lót! Nó sẽ được tô sáng ngược như trong ảnh chụp màn hình đầu tiên của tôi và nếu bạn nhấn Xóa một lần thì nó sẽ xóa toàn bộ.
SilverWolf - Phục hồi Monica

Tôi thực sự tìm thấy nó một cách tình cờ, sau đó tự hỏi tại sao nó không bị bash. Hóa ra bash mặc định là thực sự cũ. (:
SilverWolf - Phục hồi Monica

0

Bạn có thể đặt tập lệnh Bash nhỏ này ở đâu đó trong PATH:

#!/bin/bash

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

Nếu tôi đặt các nội dung này /usr/local/pbexecutechẳng hạn và làm cho nó có thể thực thi được, tôi có thể thực thi một cách an toàn pbexecutetừ dòng lệnh, điều này sẽ nhắc xác nhận của tôi trước khi thực hiện nội dung của bảng tạm.

Một cách tiếp cận khác là khởi chạy trình soạn thảo văn bản với nội dung của bảng tạm từ trong trình bao và tự động thực hiện các nội dung đã chỉnh sửa khi thoát. Ví dụ:

#!/bin/bash

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

Tại sao thoát được ve lại? Sử dụng '' cũng nên hoạt động.
nohillside

@patrix Nếu tôi không thoát khỏi backticks, bash sẽ thực thi nó trong khi nhắc.
Gerry

Không nên bỏ qua các backticks cũng làm như vậy?
nohillside

@patrix Ồ, vâng, đó chỉ là vấn đề ưu tiên về cách bạn muốn định dạng lời nhắc. Tôi đã chọn backticks vì chúng là toán tử thay thế lệnh và thường được sử dụng để đánh dấu trực quan các lệnh (xem chỉnh sửa StackExchange).
Gerry

Tôi ổn với điều này :-) Có vẻ như nó khá phức tạp
nohillside
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.