Как безопасно очистить оба буфера обмена в 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, поэтому я бы не назвал этот метод эффективным.

Так как же тогда это сделать правильно?


person Markus84612    schedule 28.01.2018    source источник
comment
Я бы порекомендовал взглянуть на clipster, который представляет собой менеджер буфера обмена X, полностью написанный на python, который либо делайте то, что хотите, либо предоставьте достаточно кода, чтобы помочь вам решить проблему.   -  person match    schedule 28.01.2018
comment
Попробуйте echo -n вместо echo ""   -  person Andrea Corbellini    schedule 28.01.2018
comment
@DavisHerring, пожалуйста, напишите свое предложение в качестве ответа, мне интересно, как это сделать с помощью подпроцесса. Я был знаком только с пакетом os, но я предполагаю, что это был не самый эффективный способ сделать это.   -  person Markus84612    schedule 29.01.2018


Ответы (3)


Заблуждения

  1. GNOME не имеет «буфер обмена»; X11 имеет выборки и буферы обрезки. Их больше 2, но в основном нас волнуют выборки PRIMARY и CLIPBOARD. Ни один из них не является «устаревшим».
  2. Вы не можете «надежно» очистить их (записав что-то еще в память, которую они занимают), поскольку они не хранятся в вашем процессе. Буферы вырезания (которые устарели) хранятся на X-сервере, а выборки сохраняются (если где-либо) в процессе их предоставления. (Если запущен менеджер буфера обмена, они могут храниться в нескольких местах и ​​их невозможно полностью удалить.)
  3. xclip должен оставить фоновый процесс работающим, чтобы предоставить выбор, который он устанавливает, для любых запрашивающих его процессов. Это в основном бесполезно, когда выбор пуст, но он исчезает, как только что-то еще выбрано/скопировано, и это, безусловно, не представляет угрозы безопасности.
  4. Никогда не используйте os.system (или system на любом языке), кроме как для запуска команды оболочки, указанной пользователем (например, ! в less). Он использует оболочку (в частности, /bin/sh ), который (поскольку он предназначен для интерактивного использования) требует различных видов цитирования, чтобы избежать неправильной интерпретации сгенерированного ввода, это влияет на обработку сигналов, он не может напрямую настроить открытые файлы дочерних процессов и позволяет слишком легко игнорировать статус завершения дочернего процесса.

Инструменты

  1. Конечно, существуют привязки Python для Xlib, в том числе манипулирование выборками. . Вероятно, это излишне, если очистка выбора - ваш единственный вариант использования.
  2. Tkinter, как уже упоминалось, вероятно, поддерживает это (Tk определенно поддерживает), но я не нашел ссылку на него.
  3. xclip и xsel, как уже упоминалось, широко доступны (например, оба находятся в репозиториях Ubuntu). Вы запускаете внешние программы на Python, используя subprocess; в Python 3.5 или выше это выглядит как один из

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

    (Выбор между stdin и input имеет большее значение, если вы не ждете выхода программы немедленно.) xsel имеет явную опцию --clear, что позволяет избежать необходимости ввода и фонового процесса.

С любым из них вам нужно будет обработать каждый из двух распространенных типов выбора.

person Davis Herring    schedule 29.01.2018
comment
Большой гудок +1 за раздел неправильных представлений. Буфер обмена Unix представляет собой огромный беспорядок (и едва работающий FWIW), но не существует такой вещи, как устаревший буфер обмена gnome. - person Matteo Italia; 29.01.2018
comment
Скрипт работает, но процессы остаются там: stackoverflow.com/q/48499398/9213435 - person Markus84612; 29.01.2018

Я знаю три способа очистить буфер обмена от 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
person scripter    schedule 28.01.2018
comment
Команда echo теперь кажется хорошей, новых строк нет. В чем разница между этим или с помощью команды xsel? - person Markus84612; 29.01.2018
comment
Также решение tkinter требует, чтобы этот пакет был установлен, он не установлен по умолчанию, я мог бы установить его, но я бы предпочел не делать этого в данный момент. Кроме того, они очищают только устаревший буфер обмена, но оставляют X.org нетронутым. - person Markus84612; 29.01.2018
comment
Изучив справочные страницы, я не увидел значительного улучшения безопасности ни у одного из них по сравнению с другим. У xsel меньше зависимостей, а у xclip больше возможностей. - person scripter; 29.01.2018

Я понял:

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

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

Этот очищает оба буфера и вообще не оставляет процессов-зомби. Спасибо всем, кто предложил некоторые из них.

person Markus84612    schedule 29.01.2018
comment
Вам вообще нужен input с -c? - person Davis Herring; 30.01.2018
comment
@DavisHerring Как ты это предлагаешь? Пожалуйста, отредактируйте ответ, если вы нашли лучший способ. - person Markus84612; 31.01.2018
comment
Мой ответ уже содержит xsel -c без input="". Вы совершенно правы в том, что добавление -b нацелено на CLIPBOARD; Я понял, что это очевидно из справочной страницы. - person Davis Herring; 31.01.2018
comment
@DavisHerring да, вы правы, ввод не нужен, так тоже работает. - person Markus84612; 31.01.2018