如果粘贴包含一个或多个返回字符的文本,则防止在 Linux 中意外执行命令

如果粘贴包含一个或多个返回字符的文本,则防止在 Linux 中意外执行命令

有时,如果将剪贴板上的文本粘贴到 shell 中,并且其中包含回车符,则它会执行,尽管这并不是预期的。有时甚至可能会错误地粘贴多行,然后可能会运行非预期的命令。

我知道在完美的世界中,这些错误永远不会发生,但是有没有办法可以防止这种情况发生以避免人为错误的风险?

答案1

您需要的是“括号粘贴”,这是某些 shell 中提供的功能。

如果您的 bash 版本支持它,您可以像这样为当前会话打开它:

bind 'set enable-bracketed-paste on'

现在通过粘贴多行来尝试一下:

echo Hello world
echo Again, I say, hello!

shell 识别出文本是粘贴的(不是键入的),并等待您的确认。如果一切看起来安全,请按 Enter 键。如果不安全,请按 Control-C 取消。

如果您希望为每个新会话启用括号粘贴,请将命令添加到您的 .inputrc 文件中:

cd ~
echo "set enable-bracketed-paste" >> .inputrc

另一个选择是从狂欢,其中括号内的粘贴默认启用。要将当前 shell 替换为 zsh shell:

exec zsh

使用 zsh,粘贴的文本会突出显示,这很棒。再次按 Enter 执行命令或按 Control-C 取消。

如果你喜欢 zsh,并希望将其设为默认 shell:

chsh -s /bin/zsh

答案2

如果您在 Windows 上使用 PuTTY,这里有一个 AutoHotKey 脚本,它将检测您是否尝试将包含一个或多个换行符的内容粘贴到 PuTTY 中,如果是,它将确认您想要这样做。

提示:您可以按空格键或键盘上的回车键轻松按“是”。

注意:此脚本使用 ctrl+v 粘贴到 PuTTY,但如果您想将其挂接到 PuTTY 的右键单击粘贴默认功能,则可以替换^v为。RButton

#ifwinactive ahk_class PuTTY

    ^v::

        var := clipboard
        var := RegExReplace(var, "\r\n?|\n\r?", "`n", lineNum)

        If(lineNum>0)
        {
            MsgBox, 4, , There are one or more newlines in what you're pasting, are you sure you want to continue?
            IfMsgBox Yes
                SendInput {Shift down}{Insert}{Shift Up}
            else IfMsgBox No
                return
        }
        else
        {
            SendInput {Shift down}{Insert}{Shift Up}
        }

    return

#ifwinactive

答案3

粘贴前使用Ctrl++ (“编辑当前X CtrlE”)。这将启动您的默认编辑器;您必须保存并退出,然后粘贴的命令才会执行。

答案4

我也遇到过同样的问题,但后来我养成了粘贴完成后总是将一个单词复制到剪贴板的习惯。如果你强迫自己养成这个习惯 3-4 次,那么从那以后你的手就会自动这样做。自从我开始这个习惯以来,我从来没有粘贴错过。

相关内容