Python 如何在 Gnome 中安全地清除两个剪贴板?

How to clear both clipboards securely in Gnome, from Python?

Gnome 桌面有 2 个剪贴板,X.org(保存每个选择)和旧版 (CTRL+C)。我正在编写一个简单的 python 脚本来清除两个剪贴板,最好是安全地清除,因为它可以在复制粘贴密码后完成。

我在这边看到的代码是这样的:

# empty X.org clipboard
os.system("xclip -i /dev/null")  

# empty GNOME clipboard
os.system("touch blank")  
os.system("xclip -selection clipboard blank")  

不幸的是,这段代码出于某种原因创建了一个名为 blank 的文件,因此我们必须将其删除:

os.remove("blank")

然而,主要问题是,通过调用这两个脚本,它使 xclip 进程保持打开状态,即使在我关闭终端后也是如此。

所以这个选项有两个问题:

1) 它创建了一个空白文件,这对我来说似乎是一个有缺陷的方法

2) 它使进程处于打开状态,这可能是一个安全漏洞。

我也知道这个方法:

 os.system("echo "" | xclip -selection clipboard")  # empty clipboard

但是这个在剪贴板中留下了一个\n换行符,所以我也不认为这个方法有效。

那么如何正确操作呢?

我知道从 Python 中清除剪贴板的三种方法。首先使用 tkinter:

try:
    from Tkinter import Tk
except ImportError:
    from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.destroy()

其次是xclip,但我是这样使用xclip的:

echo -n | xclip -selection clipboard

它会创建一个新行吗?

最后,可以使用 xsel:

xsel -bc

误解

  1. GNOME 没有 "have clipboards"; X11selections and cut buffers。其中有 2 个以上,但我们主要担心选择 PRIMARYCLIPBOARD。他们都不是 "legacy".
  2. 您不能 "securely" 清除它们(通过将其他内容写入它们占用的内存),因为它们不存储在您的进程中。剪切缓冲区( 已过时)存储在 X 服务器中,选择存储(如果有的话)在提供它们的进程中。 (如果有剪贴板管理器运行ning,它们可能会存储在几个地方,不可能完全杀死。)
  3. xclip 必须 离开后台进程 运行 将其设置的选择服务于任何请求它的进程。 It's mostly useless when the selection is empty, but it does go away as soon as anything else is selected/copied, and it is surely not a security risk.
  4. 切勿使用 os.system(或任何语言中的 system),除了 运行 用户指定的 shell 命令(如 ! less)。它使用shell(具体来说,), which (because it is meant for interactive use) requires various kinds of quoting to avoid misinterpretation of generated input, it ,它不能直接设置child的打开文件,并且很容易忽略[的退出状态=72=].

工具

  1. 当然存在 Python 个 Xlib 绑定​​,包括 manipulating selections。如果 selection-clearing 是您唯一的用例,则可能有点矫枉过正。
  2. 如前所述,Tkinter 可能支持这个 (Tk certainly does),但我还没有找到它的参考资料。
  3. 如前所述,
  4. xclipxsel 被广泛使用(例如,两者都在 Ubuntu 存储库中)。你run external programs in Python using subprocess;在 Python 3.5 或更高版本中,它看起来像

    subprocess.run("xclip",stdin=subprocess.DEVNULL)
    subprocess.run(["xclip","-selection","clipboard"],input="")
    subprocess.run(["xsel","-c"])
    

    (如果您不立即等待程序退出,stdininput 之间的选择更重要。)xsel 有一个明确的 --clear 选项, 这避免了输入和后台进程的需要。

对于其中任何一种,您都需要处理两种常见的选择类型。

我想通了:

#CLIPBOARD cleaner
subprocess.run(["xsel","-bc"])

#PRIMARY cleaner
subprocess.run(["xsel","-c"])

这个清理了两个缓冲区,并且根本没有留下任何僵尸进程。感谢所有提出建议的人。