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

sa2*_*289 5 shell terminal clipboard

有时,如果剪贴板上的文本被粘贴到 shell 中并且它包含一个返回字符,即使这不是意图,它也会执行。有时甚至可能会错误地粘贴多行,然后可能会运行意外的命令。

我明白在一个完美的世界里,这些错误永远不会发生,但有没有办法防止这种情况发生,以避免人为错误的风险?

Kal*_*Kal 6

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

如果您的 bash 版本支持它,您可以在当前会话中打开它,如下所示:

bind 'set enable-bracketed-paste on'
Run Code Online (Sandbox Code Playgroud)

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

echo Hello world
echo Again, I say, hello!
Run Code Online (Sandbox Code Playgroud)

shell 识别出文本已粘贴(而非键入),并等待提示您进行确认。如果一切看起来可以安全继续,请按 Enter 键。如果没有,请按 Control-C 取消。

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

cd ~
echo "set enable-bracketed-paste" >> .inputrc
Run Code Online (Sandbox Code Playgroud)

另一种选择是从bash切换到zsh,其中默认启用括号粘贴。要将当前 shell 替换为 zsh shell:

exec zsh
Run Code Online (Sandbox Code Playgroud)

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

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

chsh -s /bin/zsh
Run Code Online (Sandbox Code Playgroud)


sa2*_*289 3

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

提示:您可以按空格键或键盘 Enter 键作为按“是”的简单方法。

注意:此脚本使用 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
Run Code Online (Sandbox Code Playgroud)