如何在 Gnome 中安全地清除两个剪贴板,来自 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进程保持打开状态。

所以我们这个选项有 2 个问题:

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 没有"剪贴板";X11具有选择和剪切缓冲区。 其中有超过 2 个,但大多数情况下我们担心的选择PRIMARYCLIPBOARD. 它们都不是"遗产"。
  2. 您无法"安全地"清除这些内容(通过将其他内容写入它们占用的内存中),因为它们不会存储在您的进程中。 剪切缓冲区(过时)存储在 X 服务器中,选择存储在提供它们的过程中(如果有的话)。 (如果有剪贴板管理器正在运行,它们可能会存储在多个地方,并且不可能完全杀死。
  3. xclip必须让后台进程保持运行状态,以将其设置的选择提供给请求它的任何进程。 当选择为空时,它大多是无用的,但是一旦选择/复制了任何其他内容,它就会消失,而且肯定不是安全风险。
  4. 切勿使用os.system(或任何语言的system),除非运行用户指定的 shell 命令(如less中的!)。 它使用 shell(特别是/bin/sh),这(因为它是用于交互式使用的)需要各种引用以避免对生成的输入的误解,它会影响信号处理,它不能直接设置孩子的打开文件,并且很容易忽略孩子的退出状态。

工具

  1. 当然,Xlib存在Python绑定,包括操作选择。 如果选择清除是您唯一的用例,则可能矫枉过正。
  2. 如前所述,Tkinter 可能支持这一点(Tk 当然支持),但我还没有找到它的参考。
  3. 如前所述,xclipxsel是广泛可用的(例如,两者都在 Ubuntu 存储库中)。 您使用subprocess在 Python 中运行外部程序;在 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"])

这个清理了两个缓冲区,并且根本没有留下僵尸进程。感谢所有建议其中一些人的人。

最新更新