มีวิธีที่จะทำให้การวางใน Terminal ปลอดภัยหรือไม่?


16

ฉันวางชื่อไฟล์ / ฯลฯ ลงใน Terminal ตลอดเวลาและบางครั้งเนื้อหาของคลิปบอร์ดไม่ใช่สิ่งที่ฉันคาดหวัง

บ่อยครั้งที่ผลที่ได้คือข้อความหลายร้อยบรรทัด (เช่นซอร์สโค้ด) วางในพรอมต์คำสั่งเรียกพระเจ้าเท่านั้นที่รู้ว่าสิ่งที่น่ารังเกียจ

มีวิธีในการป้องกันการทุบตีจากการกระทำที่ผิดพลาดในสิ่งที่ฉันวางไว้หรือไม่? ฉันหวังว่ามันจะวางข้อความและให้ฉันตัดสินใจว่าถ้าฉันต้องการที่จะดำเนินการ


คำตอบ:


10

สมมติว่าคุณกำลังใช้ bash: หากคุณเปิดใช้งานทางลัด emacs ด้วยset -o emacsคุณสามารถใช้ Emacs เพื่อแก้ไขบรรทัดคำสั่ง:

  • พิมพ์Ctrl-XCtrl-Eที่พรอมต์เพื่อเริ่มต้น Emacs
  • วางและแก้ไขเนื้อหาคลิปบอร์ดของคุณลงในบัฟเฟอร์ Emacs
  • ใช้Ctrl-XCtrl-Cเพื่อออกจาก Emacs และเรียกใช้คำสั่งโดยอัตโนมัติ

ผมถือว่าคุณหมายถึงแทนCtrl Cmdนอกจากนี้ยังไม่ต้องทำก็น่าจะใช้set -o emacs $EDITORขอบคุณ! สมบูรณ์แบบ
Abhi Beckert

5

วิธีแก้ปัญหาที่ง่ายที่สุดคือใช้ตัวแก้ไขข้อความเป็นบัฟเฟอร์ที่คุณสามารถตรวจสอบเนื้อหาจากนั้นคัดลอกจากตัวแก้ไขข้อความไปยังเทอร์มินัล หากคุณใช้ TextEdit สำหรับสิ่งนี้คุณอาจต้องการตรวจสอบให้แน่ใจว่าอยู่ในโหมดข้อความล้วน ( เมนูรูปแบบสร้างข้อความธรรมดา ; ⇧⌘T) เพื่อหลีกเลี่ยงปัญหาเช่นการวางลิงก์เป็นลิงก์ไม่ใช่ URL

สิ่งอื่นที่ควรทราบคือ Bash จะพยายามดำเนินการทุกอย่างที่อยู่เหนืออักขระบรรทัดใหม่ดังนั้นหากคุณคัดลอกบล็อกข้อความคุณอาจต้องการให้แน่ใจว่าการเลือกของคุณหยุดหลังจากอักขระสุดท้ายแทนที่จะรวมถึงจุดสิ้นสุดของ ไลน์.

คุณต้องการสิ่งนี้: การเลือกโดยไม่ขึ้นบรรทัดใหม่

ไม่ใช่สิ่งนี้: การเลือกด้วย newline

แน่นอนถ้าคุณกำลังคัดลอกเนื้อหาด้วยบรรทัดใหม่ภายในข้อความ ( เช่นหลายย่อหน้า) คุณจะต้องแก้ไขสิ่งที่เลือกด้วยตนเอง


ปัญหาคือฉันวางสิ่งต่างๆลงในเทอร์มินัลหลายร้อยครั้งทุกวัน การใช้โปรแกรมแก้ไขข้อความตรงกลางจะเป็นความเจ็บปวดในตูด
Abhi Beckert

ผู้โจมตีสามารถฝังการขึ้นบรรทัดใหม่ในข้อความโดยไม่สามารถมองเห็นได้บนหน้าจอดังนั้นตัวอย่างของวิธีการเลือกข้อความไม่จำเป็นต้องมีการป้องกันใด ๆ
sh1

1

ฉันได้รับสิ่งนี้ด้วย!

วิธีการแก้ปัญหาของฉันคือการวางการใช้Launchbarผู้จัดการคลิปบอร์ด 's Cmd+\กับฮอต สิ่งนี้จะแสดงรายการคลิปหนีบล่าสุดทำให้ฉันสามารถดูตัวอย่างผลลัพธ์ก่อนที่จะวาง: หากฉันไม่เห็นเนื้อหาที่ฉันคาดไว้ฉันจะกดปุ่ม Escape ก่อนปล่อย Cmd ฉันยังสามารถใช้ปุ่มลูกศรเพื่อ 'ป้อน' การตัดข้อความทำให้ฉันเห็นบรรทัดเนื้อหาทีละบรรทัด

ฉันเชื่อว่าตัวเรียกใช้งานส่วนใหญ่ทำเช่นนี้ - Alfred (powerpack addon) & Quicksilver (ฟรี) ตัวอย่างเช่น


1

คุณอาจต้องการดูเป็นผู้จัดการคลิปบอร์ด ผมใช้ฟรีหนึ่งน้ำหนักเบาที่เรียกว่าJumpcut มันช่วยให้ฉันสามารถเก็บหลาย ๆ คลิปบอร์ดและดูสิ่งที่เก็บไว้ในพวกเขาก่อนที่จะวางเนื้อหาทั้งหมดจากแป้นพิมพ์

มีผู้จัดการคลิปบอร์ดมากมายอยู่ที่นั่นดังนั้นหาก Jumpcut ไม่ลอยเรือของคุณอาจจะมีคนอื่นที่เหมาะสมกับความต้องการของคุณมากกว่า


1

ใช้วงเล็บวาง

Pasteed paste เป็นคุณลักษณะที่เทอร์มินัลบอกเชลล์ว่าคุณวางอะไรไว้แทนที่จะพิมพ์มันดังนั้นเชลล์ไม่สามารถรันคำสั่งได้จนกว่าคุณจะกด Enter

Terminal.app รองรับสิ่งนี้ แต่เทอร์มินัลไม่ทั้งหมดทำ

ในทำนองเดียวกันเชลล์บางตัวก็สนับสนุนเช่นกัน เวอร์ชันของ bash ที่มาพร้อมกับ OS X ไม่รองรับการวางแบบวงเล็บ (ขณะที่เขียนเป็น v3.2.57)

อย่างไรก็ตามzshรองรับการวางแบบวงเล็บ:

zsh วงเล็บวาง

Zsh ส่วนใหญ่เข้ากันได้กับทุบตี (แม้สคริปต์อาจทำงานได้เว้นแต่ว่าคุณจะใช้คุณสมบัติที่คลุมเครือจริงๆ) และดีกว่าในหลาย ๆ วิธี - ตัวอย่างเช่นแม้จะมีการแก้ไขคำสั่งหลายบรรทัด!

zsh-หลายคำสั่ง


คุณจะเปิดใช้งานการวางวงเล็บได้อย่างไร
Abhi Beckert

1
เป็นค่าเริ่มต้นหากคุณใช้ zsh ลองวางในหนึ่งซับ! มันควรจะถูกไฮไลต์แบบย้อนกลับเช่นเดียวกับในสกรีนช็อตแรกของฉันและถ้าคุณกด Delete หนึ่งครั้งมันควรจะลบทิ้งทั้งหมด
SilverWolf - Reinstate Monica

ฉันพบมันโดยบังเอิญแล้วสงสัยว่าทำไมมันไม่ทุบตี ปรากฎว่า bash เริ่มต้นนั้นเก่ามาก (:
SilverWolf - Reinstate Monica

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 ถ้าฉันไม่หนี backticks ทุบตีจะดำเนินการในขณะที่แจ้ง
เจอร์รี่

ไม่ควรละเว้น backticks ทำเคล็ดลับเช่นกัน?
nohillside

@patrix โอ้ใช่แน่นอนว่าเป็นเรื่องของการตั้งค่าเกี่ยวกับวิธีที่คุณต้องการจัดรูปแบบพร้อมท์ ฉันเลือก backticks เพราะมันเป็นตัวดำเนินการทดแทนคำสั่งและมักใช้เพื่อทำเครื่องหมายคำสั่งด้วยภาพ (ดูการแก้ไข StackExchange)
เจอร์รี่

ฉันตกลงกับสิ่งนี้ :-) ดูเหมือนว่าจะซับซ้อน
nohillside

0

ภายใต้Preferences -> Profiles -> Basic -> Advancedตรวจสอบ "วางบรรทัดใหม่เป็นการส่งคืนรถ" (พื้นฐานคือชื่อของหนึ่งโปรไฟล์หากคุณใช้โปรไฟล์อื่นคุณควรเลือกโปรไฟล์นั้นแทน)

ในเชลล์บางตัว (zsh และ bash ใช้ได้กับฉัน tcsh ไม่ได้) สิ่งนี้จะช่วยให้คุณแก้ไขหรือยกเลิก (ผ่าน Ctrl-C) สิ่งที่ถูกวางก่อนส่วนใดส่วนหนึ่งของมันจะถูกส่งผ่านไปยังเชลล์

คุณอาจต้องสร้างหน้าต่าง Terminal ใหม่เพื่อให้การตั้งค่าเริ่มทำงาน

ฉันใช้คุณสมบัตินี้ตลอดเวลาไม่เพียง แต่สำหรับการวางและแก้ไขคำสั่งที่ซับซ้อน แต่ยังเพื่อดูข้อความในคอลัมน์และบางครั้งเพื่อเลือกและคัดลอกสี่เหลี่ยมผืนผ้าย่อยโดยการลากด้วยปุ่มตัวเลือก


ฉันเพิ่งเรียนรู้ว่า TextEdit ก็ทำสิ่งที่เลือกเป็นรูปสี่เหลี่ยมผืนผ้า
Joshua Goldberg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.