Самый простой способ изменить разрешение файла с помощью Python

Самый простой способ изменить разрешение файла, чтобы только моя работающая программа Python могла получить к нему доступ (все разрешения, кроме моей программы Python) например: есть текстовый файл, я хочу изменить его разрешение, чтобы только моя работающая программа Python могла иметь к нему полный доступ!

txt был создан программой, работающей на Python.

import os,stat,sys
os.chmod(filename, stat.S_IREAD)

Вообще говоря, «Python» не может изменить разрешения (если у вас нет разрешения на изменение разрешений, в этом случае у вас, вероятно, уже есть разрешение). Как вы запускаете эту программу?

topsail 05.07.2024 20:15

Если вы опубликуете то, что вы «пробовали с помощью stat lib», возможно, кто-нибудь сможет помочь вам это исправить.

Scott Hunter 05.07.2024 20:17

Покажите нам неудачную попытку, чтобы мы могли понять и точно объяснить, что пошло не так.

Charles Duffy 05.07.2024 20:18

@topsail, без root невозможно изменить владельца, но для файла, которым он владеет, можно изменить биты разрешений или владение группой (среди этих групп, членом которых является пользователь). Для всего этого есть абсолютно стандартные библиотечные вызовы.

Charles Duffy 05.07.2024 20:19

@Чарльз Даффи, да, именно поэтому я сказал, что если у тебя нет разрешения на изменение разрешений

topsail 05.07.2024 20:21

я хочу файл, который был создан программой Python, только сам может получить к нему доступ, и клиент не сможет его просто прочитать!

SOFArminRh 05.07.2024 20:26

@SOFArminRh Похоже, вы пытаетесь отправить данные на компьютер, но держите их в секрете от владельца компьютера. Это невозможно. Храните в секрете данные о машинах, которыми вы управляете. Все, что происходит на машине, которую вы не контролируете, не является секретом.

wizzwizz4 05.07.2024 20:29

Да, если «клиент» владеет своим компьютером (т. е. имеет доступ администратора/привилегии sudo), вы не можете оставить какой-либо файл недоступным, поскольку пользователи с правами администратора могут получить доступ к любому файлу на компьютере.

topsail 05.07.2024 20:32

я понимаю свою проблему! я хочу создать файл с открывающим аргументом, чтобы только владелец мог получить к нему доступ

SOFArminRh 05.07.2024 20:33

@SOFArminRh Что вы подразумеваете под «владельцем»?

wizzwizz4 05.07.2024 20:35

Я не уверен, имеет ли значение «открывающий аргумент», но если вы имеете в виду установку разрешений, чтобы файл owner имел доступ, а group и world (это язык Linux), то вы можете сделать это - если вы владельцем или иметь root-права, когда вы это делаете.

topsail 05.07.2024 20:35

моя программа на Python создает текстовый файл с помощью <with open() as f:> я wnat с помощью opener установил разрешение для системы jsut, а не для пользователей

SOFArminRh 05.07.2024 20:39

Я бы посоветовал вам провести базовое исследование по настройке разрешений для файлов с помощью Python. Непонятно, сможете ли вы достичь желаемой цели, учитывая отсутствие контекста (кто запускает программу, точнее, какие разрешения имеет программа при запуске)... но реальный синтаксис установки прав доступа к файлам не особо сложно, и примеров много. Опять же, помните, что если «клиент» имеет доступ к своему компьютеру (доступ администратора или права sudo), вы не можете сделать файл недоступным для клиента.

topsail 05.07.2024 20:44

Вы показываете нам свой код; вы не говорите нам, как вы определяете, что это работает неправильно. Отредактируйте, включив в него команды, которые вы запускали для проверки фактического поведения с их фактическими результатами, и сопоставьте их с ожидаемым поведением/выходными данными.

Charles Duffy 05.07.2024 21:09

При этом пользователь, запускающий программу, и сама программа имеют одинаковые привилегии. Если вы не настроили свое программное обеспечение на получение разрешений setuid или чего-то подобного, между ними не будет границы, которую вы могли бы использовать, чтобы давать разрешения одному, но не другому. Это не характерно для Python, но справедливо для основных операционных систем (за некоторыми исключениями, такими как Android) в целом.

Charles Duffy 05.07.2024 21:11

@CharlesDuffy Я думаю, что macOS также является исключением (песочница приложения) – хотя способы обойти его появляются каждые несколько лет, и, очевидно, он не защищен от сотрудничества пользователей.

wizzwizz4 07.07.2024 13:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
16
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от вашей операционной системы. Давайте думать поэтапно.

В 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)

Другие вопросы по теме