>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
误解
- GNOME 没有"剪贴板";X11具有选择和剪切缓冲区。 其中有超过 2 个,但大多数情况下我们担心的选择
PRIMARY
和CLIPBOARD
. 它们都不是"遗产"。 - 您无法"安全地"清除这些内容(通过将其他内容写入它们占用的内存中),因为它们不会存储在您的进程中。 剪切缓冲区(已过时)存储在 X 服务器中,选择存储在提供它们的过程中(如果有的话)。 (如果有剪贴板管理器正在运行,它们可能会存储在多个地方,并且不可能完全杀死。
xclip
必须让后台进程保持运行状态,以将其设置的选择提供给请求它的任何进程。 当选择为空时,它大多是无用的,但是一旦选择/复制了任何其他内容,它就会消失,而且肯定不是安全风险。- 切勿使用
os.system
(或任何语言的system
),除非运行用户指定的 shell 命令(如less
中的!
)。 它使用 shell(特别是/bin/sh
),这(因为它是用于交互式使用的)需要各种引用以避免对生成的输入的误解,它会影响信号处理,它不能直接设置孩子的打开文件,并且很容易忽略孩子的退出状态。
工具
- 当然,Xlib存在Python绑定,包括操作选择。 如果选择清除是您唯一的用例,则可能矫枉过正。
- 如前所述,Tkinter 可能支持这一点(Tk 当然支持),但我还没有找到它的参考。
-
如前所述,
xclip
和xsel
是广泛可用的(例如,两者都在 Ubuntu 存储库中)。 您使用subprocess
在 Python 中运行外部程序;在 Python 3.5 或更高版本中,它看起来像subprocess.run("xclip",stdin=subprocess.DEVNULL) subprocess.run(["xclip","-selection","clipboard"],input="") subprocess.run(["xsel","-c"])
(如果您不立即等待程序退出,则在
stdin
和input
之间进行选择更为重要。xsel
有一个显式--clear
选项,无需输入和后台进程。
对于其中任何一种,您都需要处理两种常见的选择类型中的每一种。
我已经弄清楚了:
#CLIPBOARD cleaner
subprocess.run(["xsel","-bc"])
#PRIMARY cleaner
subprocess.run(["xsel","-c"])
这个清理了两个缓冲区,并且根本没有留下僵尸进程。感谢所有建议其中一些人的人。