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

如何从Python中安全地清除Gnome中的两个剪贴板?,python,python-3.x,gnome,gnome-terminal,xclip,Python,Python 3.x,Gnome,Gnome Terminal,Xclip,Gnome桌面有两个剪贴板,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 clipbo

Gnome桌面有两个剪贴板,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
误解
  • 侏儒没有“剪贴簿”;X11已经完成。其中有两个以上,但我们最担心的是选择
    PRIMARY
    CLIPBOARD
    。它们都不是“遗产”
  • 您无法“安全地”清除这些内容(通过将其他内容写入它们占用的内存),因为它们没有存储在您的进程中。剪切缓冲区(已过时)存储在X服务器中,选择存储在提供它们的过程中(如果有)。(如果剪贴板管理器正在运行,它们可能存储在多个位置,不可能完全销毁。)
  • xclip
    必须让后台进程保持运行,以便为任何请求它的进程提供它设置的选择。当选择内容为空时,它基本上是无用的,但一旦选择/复制了其他内容,它就会消失,这肯定不会带来安全风险
  • 切勿使用
    os.system
    (或任何语言的
    system
    ),除非运行用户指定的shell命令(如
    中的
    )。它使用shell(特别是),它(因为它是用于交互使用的)需要各种引用以避免对生成的输入的误解,它不能直接设置子对象的打开文件,并且它很容易忽略子对象的退出状态
  • 工具
  • 当然存在Xlib的Python绑定,包括。如果选择清除是您唯一的用例,那么可能是杀伤力过大
  • 正如前面提到的,Tkinter可能支持这个(Tk),但我还没有找到它的参考
  • 如前所述,
    xclip
    xsel
    广泛可用(例如,它们都在Ubuntu存储库中)。你使用;在Python3.5或更高版本中,它看起来像

    subprocess.run("xclip",stdin=subprocess.DEVNULL)
    subprocess.run(["xclip","-selection","clipboard"],input="")
    subprocess.run(["xsel","-c"])
    
    (如果不立即等待程序退出,
    stdin
    input
    之间的选择更为重要。)
    xsel
    有一个显式的
    --清除
    选项,它避免了输入和后台处理

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

    我已经计算出:

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

    这一个清除了两个缓冲区,并且没有留下任何僵尸进程。感谢大家提出其中一些建议。

    我建议大家看一看完全用python编写的X剪贴板管理器,它可以做你想做的事情,或者提供足够的代码来帮助你解决问题。尝试
    echo-n
    而不是
    echo”“
    @davishering请写下你的建议作为答案,我很好奇如何使用子流程来完成它。我只熟悉操作系统包,但我认为这不是最有效的方法。echo命令现在看起来不错,没有新行。这样做与通过xsel命令执行有什么区别?同样,tkinter解决方案需要安装该软件包,默认情况下没有安装,我可以安装,但我现在不想安装。此外,这些只清除遗留剪贴板,但保留X.org一个完整的。通过检查手册页,我看不到任何一个有比另一个明显的安全改进。xsel对tho的依赖性较少,而xclip似乎有更多的特性。对于“误解”部分,一个大喇叭+1。Unix剪贴板是一个巨大的烂摊子(而且是一个勉强工作的FWIW),但是没有“gnome遗留剪贴板”这样的东西。脚本可以工作,但进程仍然挂在那里:你甚至需要
    输入
    -c
    ?@DavisHerring你有何建议?如果找到更好的方法,请编辑答案。我的答案已经包含
    xsel-c
    ,没有
    input=“”
    。添加
    -b
    的目标是
    剪贴板,这是非常正确的;我认为这在手册页上是显而易见的。@DavisHerring是的,你是正确的,不需要输入,这样也很好。