5

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换行符,所以我也不会称这个方法有效。

那么如何正确地做到这一点呢?

4

3 回答 3

4

我知道三种从 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
于 2018-01-28T19:56:12.033 回答
4

误解

  1. GNOME 没有“剪贴板”;X11选择和剪切缓冲区。其中有 2 个以上,但大多数情况下我们担心选择PRIMARYCLIPBOARD. 它们都不是“遗产”。
  2. 您不能“安全地”清除这些(通过将其他内容写入它们占用的内存),因为它们没有存储在您的进程中。剪切缓冲区(过时)存储在 X 服务器中,选择存储(如果在任何地方)在提供它们的进程中。(如果有剪贴板管理器在运行,它们可能存储在多个地方,不可能完全杀死。)
  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 命令(如!in less)。它使用shell(特别是,/bin/sh),它(因为它是用于交互使用)需要各种引用以避免对生成的输入的误解,它影响信号处理,它不能直接设置孩子的打开文件,它很容易忽略孩子的退出状态。

工具

  1. Xlib 当然存在 Python 绑定,包括操作选择。如果选择清除是您唯一的用例,可能会矫枉过正。
  2. 如前所述,Tkinter 可能支持这一点(Tk当然支持),但我还没有找到它的参考。
  3. xclipxsel,如前所述,可以广泛使用(例如,两者都在 Ubuntu 存储库中)。在 Python中使用subprocess;运行外部程序 在 Python 3.5 或更高版本中,它看起来像

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

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

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

于 2018-01-29T06:39:11.517 回答
0

我想通了:

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

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

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

于 2018-01-29T19:59:37.820 回答