有没有办法使粘贴到终端安全?


16

我一直将文件名/ etc粘贴到终端中,有时剪贴板的内容不是我所期望的。

通常结果是将数百行文本(例如,源代码)粘贴到命令提示符中,触发上帝只知道什么东西令人讨厌。

有什么方法可以防止bash盲目执行我粘贴的内容吗?我希望它只是粘贴文本,然后让我决定是否要执行它。


Answers:


10

假设您正在使用bash:如果您激活emacs快捷方式,set -o emacs也可以使用Emacs来编辑命令行:

  • 键入Ctrl-XCtrl-E在提示符下启动Emacs
  • 将剪贴板内容粘贴并编辑到Emacs缓冲区中
  • 使用Ctrl-XCtrl-C退出Emacs和自动运行命令(或多个)。

我认为您的意思Ctrl不是Cmd。此外,set -o emacs似乎没有使用它$EDITOR。谢谢!太棒了。
阿比·贝克特

5

最简单的解决方案可能是使用文本编辑器作为缓冲区,您可以在其中仔细检查内容,然后从文本编辑器复制到终端。如果为此使用TextEdit,则可能需要确保它处于纯文本模式(“ 格式”菜单→“ 制作纯文本”;⇧⌘T),以避免诸如将链接粘贴为链接而不是URL之类的问题。

还要注意的另一件事是,Bash会尝试执行换行符之前的所有内容,因此,如果要复制文本块,则可能要确保选择停止在最后一个字符之后,而不是包括换行符的结尾。线。

你要这个: 没有换行的选择

不是这个: 用换行符选择

当然,如果您要在文本中复制带有换行符的内容(多个段落),则需要手动编辑选择内容。


问题是,我每天将东西粘贴到终端中数百次。在中间使用文本编辑器会很痛苦
Abhi Beckert 2012年

攻击者可以在文本中嵌入回车符而不会在屏幕上看到它们,因此,如何选择文本的示例不一定提供任何保护。
sh1

1

我也明白了!

我的解决方案是使用Launchbar的剪贴板管理器和热键进行粘贴Cmd+\。这将显示最近的剪报列表,使我可以在粘贴之前预览结果:如果看不到预期的内容,请在发布Cmd之前先进行转义。我还可以使用箭头键“输入”文本剪辑,以便逐行查看内容。

我相信大多数启动器都会这样做-例如,Alfred(powerpack插件)和Quicksilver(免费)。


1

您可能需要调查剪贴板管理器。我使用了一个名为Jumpcut的免费轻量级产品。它使我可以保留多个剪贴板,并在实际粘贴内容之前查看其中存储的内容,所有这些操作都可以通过键盘进行。

那里有很多剪贴板管理器,因此,如果Jumpcut不能使您的船浮起,也许另外一个更适合您的需求


1

使用带括号的粘贴

括号粘贴是一项功能,终端会告诉外壳程序您粘贴了某些内容,而不仅仅是键入内容,因此,只有按Enter键,外壳程序才能运行命令。

Terminal.app支持此功能,但并非所有终端都支持。

同样,并非所有的shell都支持它。OS X随附的bash版本不支持带括号的粘贴(在撰写本文时为v3.2.57)。

但是,zsh支持括号内的粘贴:

zsh包围式粘贴

Zsh与bash大部分兼容(除非您使用某种真正晦涩的功能,否则即使脚本也可能会起作用),并且在许多方面都更好-例如,它甚至具有多行命令编辑功能!

zsh-multiline-command


如何激活带括号的粘贴?
阿比·贝克特

1
如果使用zsh,则默认情况下处于启用状态。尝试粘贴一些单线!它应该像我的第一个屏幕截图中一样反白显示,如果您单击Delete(删除),则应删除整个内容。
SilverWolf-恢复莫妮卡

我实际上是偶然发现它的,然后想知道为什么它不是bash。原来默认的bash确实很旧。(:
SilverWolf-恢复莫妮卡

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

为什么逃脱了s虫?使用”应该也可以。
nohillside

@patrix如果我不逃避反引号,bash会在提示时执行它。
格里

那么,不应该省略引号吗?
nohillside

@patrix哦​​,是的,当然,这只是您希望格式化提示的方式的问题。我之所以选择反引号是因为它们是命令替换运算符,通常用于可视化标记命令(请参见StackExchange编辑)。
格里

我对此表示
同意

0

在下Preferences -> Profiles -> Basic -> Advanced,选中“将换行符粘贴为回车符”。(基本名称是一个配置文件的名称。如果使用另一个配置文件,则应选择该配置文件。)

某些 shell中(zsh和bash对我有用,tcsh无效),这将使您(通过Ctrl-C)编辑或中止粘贴的内容,然后再将其任何部分传递给shell。

您可能需要创建一个新的“终端”窗口以使首选项开始工作。

我一直使用此功能,不仅用于粘贴和编辑复杂的命令,而且还可以查看带栏的文本,有时还可以通过使用Option键拖动来选择和复制子矩形。


我刚刚了解到TextEdit也可以进行矩形选择。
Joshua Goldberg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.