python - 如何允许脚本被执行但不被读取?

标签 python c linux file-permissions

这个问题是如何让其他(非 root)用户可以运行但不能检查的 python 脚本。

示例用例:

#!/usr/bin/env python
import requests
params = { 'user':'fred', 'password':'123' }
url = 'https://.......'
print(requests.get(url, params).content)

在这个例子中(但它只是一个例子),我想让用户运行脚本以获取已获取的 Web 内容,但看不到用于获取该内容的凭据。

设置执行权限而不是读取权限不会获得与已编译可执行文件相同的结果。这是一个“ Hello World ”的例子。

在 C 中:

$ cat test.c
#include <stdio.h>
int main() {
    puts("secret message");
    return 0;
}

$ gcc -o secret test.c

$ chmod 711 secret

$ sudo -u nobody ./secret
secret message

$ sudo -u nobody strings ./secret
strings: ./secret: Permission denied

在 Python 中:

$ cat test.py
#!/usr/bin/python
print("secret message")

$ chmod 711 test.py

$ sudo -u nobody ./test.py
/usr/bin/python: can't open file './test.py': [Errno 13] Permission denied

(当然,python 可执行文件本身可以设置为八进制模式 711,但这不是我要保护的东西。)

那么,我该怎么办呢?

我考虑过但我认为行不通的可能解决方案:

(1)将整个Python程序翻译成C语言。

原则上可行,但不是实际的解决方案。即使对于这个简单的例子,也意味着必须寻找与 requests 等价的东西。图书馆。

(2) 有一个由Python 调用的辅助C 程序。

辅助 C 程序实际上应该做什么?如果只是打印密码,那么用户可以直接运行获取密码。如果它也获取网页(在本例中),那么我们回到问题 1。

(3) 有一个启动python并将 secret 数据传递给python的C程序:

  • (a) 通过命令行

    • 通过 ps 开放检查或 /proc/<pid>/cmdline
  • (b) 通过环境

    • 通过 ps 开放检查或 /proc/<pid>/environ
  • (c) 通过标准输入

    • 防止在 python 脚本中将标准输入用于其他目的,例如用户输入
  • (d) 通过命名管道

    • 用户可以与 python 进程竞争以从命名管道读取(如果他们首先在紧密循环中执行 killall -STOP python,然后在 python 进程暂停的情况下赢得从命名管道读取的竞争是微不足道的)

实际上我确实想到了另一件事 - 3c 的改编 - 一个 C 程序 fork 并执行一个 python 进程并向它发送(通过标准输入)一个 secret ,然后是来自它自己的标准输入的数据。 python 进程从读取 secret 开始,然后可以自由地从标准输入读取其他用户输入。但是所有这一切开始显得笨拙(我们现在有这个额外的进程坐在那里,在 python 进程期间从 stdin 复制数据)而且无论如何我不知道如何编写这样的 C 程序。

请问我该怎么办?

最佳答案

您能否不将 Python 代码用作解释脚本,而是将其编译为命令行可执行文件?它类似于您提出的第一个解决方案,但在那种情况下,不需要将 .py 文件编译为 .c 文件,然后将 .c 文件编译为可执行文件。您将把 .py 文件直接编译成可执行文件。

关于python - 如何允许脚本被执行但不被读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63700433/

相关文章:

python - 如何计算具有非空值的列与行之间的交集

python - Django 搜索功能

c - 使用 fscanf 读取文件的每一行

c - Strtok 和 fgets Objective C 函数导致读取错误以及段错误

c - 如何以编程方式创建证书签名请求 (CSR)?

windows - 发现 Mac OS & Linux 上的动态库依赖

python - toolz.thread_first() 和 toolz.thread_last() 的目的是什么?

python - 更新列表的 iTH 元素 - 'Nonetype Object is not subscribable' 错误

cdev初始化为linux设备驱动: what is the difference between the two approaces?

linux - 如何将txt文件追加到之前创建的最后一行