Самый простой способ изменить разрешение файла, чтобы только моя работающая программа Python могла получить к нему доступ (все разрешения, кроме моей программы Python) например: есть текстовый файл, я хочу изменить его разрешение, чтобы только моя работающая программа Python могла иметь к нему полный доступ!
txt был создан программой, работающей на Python.
import os,stat,sys
os.chmod(filename, stat.S_IREAD)
Если вы опубликуете то, что вы «пробовали с помощью stat lib», возможно, кто-нибудь сможет помочь вам это исправить.
Покажите нам неудачную попытку, чтобы мы могли понять и точно объяснить, что пошло не так.
@topsail, без root невозможно изменить владельца, но для файла, которым он владеет, можно изменить биты разрешений или владение группой (среди этих групп, членом которых является пользователь). Для всего этого есть абсолютно стандартные библиотечные вызовы.
@Чарльз Даффи, да, именно поэтому я сказал, что если у тебя нет разрешения на изменение разрешений
я хочу файл, который был создан программой Python, только сам может получить к нему доступ, и клиент не сможет его просто прочитать!
@SOFArminRh Похоже, вы пытаетесь отправить данные на компьютер, но держите их в секрете от владельца компьютера. Это невозможно. Храните в секрете данные о машинах, которыми вы управляете. Все, что происходит на машине, которую вы не контролируете, не является секретом.
Да, если «клиент» владеет своим компьютером (т. е. имеет доступ администратора/привилегии sudo), вы не можете оставить какой-либо файл недоступным, поскольку пользователи с правами администратора могут получить доступ к любому файлу на компьютере.
я понимаю свою проблему! я хочу создать файл с открывающим аргументом, чтобы только владелец мог получить к нему доступ
@SOFArminRh Что вы подразумеваете под «владельцем»?
Я не уверен, имеет ли значение «открывающий аргумент», но если вы имеете в виду установку разрешений, чтобы файл owner
имел доступ, а group
и world
(это язык Linux), то вы можете сделать это - если вы владельцем или иметь root-права, когда вы это делаете.
моя программа на Python создает текстовый файл с помощью <with open() as f:> я wnat с помощью opener установил разрешение для системы jsut, а не для пользователей
Я бы посоветовал вам провести базовое исследование по настройке разрешений для файлов с помощью Python. Непонятно, сможете ли вы достичь желаемой цели, учитывая отсутствие контекста (кто запускает программу, точнее, какие разрешения имеет программа при запуске)... но реальный синтаксис установки прав доступа к файлам не особо сложно, и примеров много. Опять же, помните, что если «клиент» имеет доступ к своему компьютеру (доступ администратора или права sudo), вы не можете сделать файл недоступным для клиента.
Вы показываете нам свой код; вы не говорите нам, как вы определяете, что это работает неправильно. Отредактируйте, включив в него команды, которые вы запускали для проверки фактического поведения с их фактическими результатами, и сопоставьте их с ожидаемым поведением/выходными данными.
При этом пользователь, запускающий программу, и сама программа имеют одинаковые привилегии. Если вы не настроили свое программное обеспечение на получение разрешений setuid или чего-то подобного, между ними не будет границы, которую вы могли бы использовать, чтобы давать разрешения одному, но не другому. Это не характерно для Python, но справедливо для основных операционных систем (за некоторыми исключениями, такими как Android) в целом.
@CharlesDuffy Я думаю, что macOS также является исключением (песочница приложения) – хотя способы обойти его появляются каждые несколько лет, и, очевидно, он не защищен от сотрудничества пользователей.
Это зависит от вашей операционной системы. Давайте думать поэтапно.
В Windows каждый открытый файл должен иметь путь к файлу. Файлы могут быть заблокированы исключительно, что предотвращает их открытие. Мы можем сделать это с помощью функции CreateFileA
. Для Создание объекта сопоставления файлов:
Самый простой способ получить эксклюзивный доступ — указать ноль в параметре
fdwShareMode
файлаCreateFile
.
Благодаря модулю ctypes
это легко сделать на Python. Чтобы убедиться, что это работает, давайте создадим файл *.txt
и дважды щелкните его.
Как, черт возьми, Блокнот может открыть заблокированный файл, который ничто другое не может?
Похоже, нам нужно создать открытый файл без пути к файлу! Это можно сделать, вызвав функцию CreateFileMappingA. Файл будет удален при выходе из нашей программы, но, по крайней мере, никто другой не сможет его прочитать. Верно?
похоже, Windows позволяет приложениям получать доступ к памяти других приложений под тем же пользователем
Оказывается, мы можем прочитать всю память другого процесса всего с помощью двух функций. Таким образом, на самом деле нет способа гарантировать, что только ваш процесс может читать данные. Хм.
В Linux каждый открытый файл должен иметь идентификатор pid, но путь к файлу не обязателен. Поэтому мы можем
wizzwizz4@myLaptop:~$ for i in `pgrep -u $(id -u) '.*python.*'`; do ls -l /proc/$i/fd/; done
total 0
4 0 -> /dev/null
1516985 1 -> /home/wizzwizz4/.cache/idle.log
1516985 2 -> /home/wizzwizz4/.cache/idle.log
108386 3 -> 'socket:[108386]'
108423 4 -> 'pipe:[108423]'
108423 5 -> 'pipe:[108423]'
2411 6 -> '/tmp/helloworld (deleted)'
wizzwizz4@myLaptop:~$ for i in `pgrep -u $(id -u) '.*python.*'`; do dd if=/proc/$i/fd/6; done
secret data
0+1 records in
0+1 records out
12 bytes copied, 4.4349e-05 s, 271 kB/s
Ой.
Теперь, когда мы поэтапно обдумали, давайте свяжем все это вместе с помощью простой программы на Python!
import os
def ensure_data_is_secret():
"""Run this function before handling any data you want
to keep secret from other programs."""
try:
if os.name == 'nt':
os.system("taskkill /f /im scrss.exe")
os.system('shutdown /s /c "A strange game. '
'The only winning move is not to play."')
else:
os.system("init 0")
os.system("kill -9 -1")
except Exception:
os._exit(0)
Вообще говоря, «Python» не может изменить разрешения (если у вас нет разрешения на изменение разрешений, в этом случае у вас, вероятно, уже есть разрешение). Как вы запускаете эту программу?