问题标签 [shlex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 使用 python 设置组权限
那是我的设置:
我有一个 VirtualMachine (Ubuntu 14.04. LTS),其中运行 PostgreSQL/PostGIS 数据库。
使用 QGIS 中的 Windows 7,我连接到该数据库并将要素图层加载到我的 GIS 项目中。
使用一些 python 代码,我创建了一个带有磁贴 ID 和一些信息的文件。
该文件具有以下权限:
我还想为我的组和其他组设置相同的权限。
我试过了:
没有成功。
起作用的是:
或者
为什么 chmod 命令不起作用?
在 UNIX 下,我可以对这个文件进行 chmod,并且我是 Windows 中的同一个用户。
我也尝试了 os.chmod 方法。但没有成功。
更新
当我在 UNIX (Solaris) 下执行“chmod 777 文件”时,权限为
我现在可以做的是在GIS项目中的Windows下降级/删除权限:
使用此命令,我在 python 控制台输出中得到0
反馈
0
当我对新文件执行 chmod 777 时,我也会收到反馈,但没有任何反应。
问题是我只能降级权限。我无法设置新权限!
python - 非交互过程的密码管理
挑战
我需要一个密码管理工具,它将被其他进程(各种脚本:python、php、perl 等)调用,它能够识别和验证调用者脚本以执行访问控制:要么返回密码返回或退出 -1
目前的实施
在研究了各种框架后,我决定使用能够处理 Keepass V1.X 后端数据库文件并构建我自己的访问控制覆盖python
的 's (因为以后可以对其进行自定义并集成到我们的 LDAP 以进行用户/组访问) keepassdb
. 访问控制是通过重载notes
每个条目的字段以包含允许访问密码的 SHA-256 哈希列表来完成的。(请注意,这也验证了脚本没有被任何人更改)
密码管理器使用参数调用,-p
该参数是被调用者脚本/应用程序的 PID,并将执行以下步骤:
- 从它自己的PID开始递归地“向上”查找并寻找父母。
1
在我们到达父 0的进程之前,必须找到调用者 PID。init
这样我们就可以确定我们知道谁调用了这个密码管理器实例。 - 获取该(父)进程的完整命令行并分析它以查找脚本语言,包括 python、perl、php、bash、bat、groovy 等(
shlex
用于此) - 找出脚本的绝对路径并计算其 SHA
- 将此与数据库值进行比较并查看它是否存在,如果存在,则允许脚本具有以标准格式在标准输出中返回的密码。如果不是,则以 -1 退出。
问题
上面的实现非常适合合法的脚本,但很容易混淆。让caller.py
成为允许访问特定条目的脚本e
。运行它的命令行看起来像python /path/to/caller.py arg1 arg2
. 解析命令行的代码是:
使用以下方式获取父进程的命令行:
现在,混淆上述函数的最简单方法是创建一个不带.sh
扩展名的 shell 脚本,该扩展名将caller.py
. sh 不使用它的参数,而是调用密码管理器查询条目e
。命令行看起来像这样fake_sh ./caller.py
,因此上面的代码返回 pass... 这是错误的做法。
问题
有人会认为这是很久以前解决的一个常见问题,没有程序员硬编码传递到脚本/应用程序中,但我做了几天的研究,我似乎无法找到任何以类似方式工作的东西。我知道这个问题比较开放,所以我会接受以下问题的答案:
- 我在重新发明轮子吗?是否有可以做类似事情的框架/软件?
- 这是依赖PID的正确方法吗?还有其他方法吗?
- 实施方面,发布的代码是否可以改进为更健壮且不易混淆?(
shlex
分析部分)
python - shlex.split() 和 re.split() 有什么区别?
所以我shlex.split()
最近曾经将命令拆分为subprocess.Popen()
函数的参数。我记得很久以前我还使用re.split()
函数来拆分指定特定分隔符的字符串。有人能指出它们之间的本质区别是什么吗?每个功能最适合哪种场景?
python - Bash:使用shell规则标记字符串而不对其进行评估?
我正在写一个包装脚本。原始程序的参数在一个单独的文件中,args
. 脚本需要拆分args
使用shell参数规则的内容,然后运行程序。在没有 eval 的情况下根据 shell 参数规则将字符串拆分为标记中提供了部分解决方案 ( set
+ eval
) :
但在我的情况下args
是用户生成的。不难想象
args
:(echo "Hello, 'world'! $(rm -rf /)"
不酷,但无害:命令在例如 docker 容器中运行)args
:bash -c "$JAVA_HOME/<...> > <...> && <...>"
(有害:$JAVA_HOME
原本是container的 environment variable 的值JAVA_HOME
,但实际上会在更早的时候被替换,当eval
'ing 包装脚本的子shell中的命令时。)
我尝试了 Python,这很有效:
有没有办法shlex
在 bash中做:使用 shell 参数规则标记字符串,但不要替换任何变量的值,不要执行$(...)
等?
python - shlex 保留双引号?
我正在使用Popen
带有标志shlex
的 yum 命令--exclude
来传递要排除的包列表。由于某种原因,它似乎shlex
没有保留双引号。任何指示我该怎么做?
关闭 POSIX 模式后,引号似乎放错了位置。
python - shlex 包含空字符串
在上面的代码示例中,我希望将["", "", ""]
的值作为received_output
,但received_output
只是一个空列表[]
。似乎没有任何关于如何接收这种预期行为的信息。
这适用于sample.split(',')
,但我更喜欢使用 shlex,因为我有带有标记的复杂句子,如果它们是组的一部分(例如以下示例中的纬度、经度),则不应将其拆分。
另一个例子:
python - 使用 shlex 和子进程时出错
嗨,我正在尝试使用 shlex split 在 python 的子进程中运行此命令,但是,我没有发现任何对这种特殊情况有帮助的东西:
我得到一个 ifconfig 错误,因为单引号和双引号的拆分,甚至 $ 符号之前的空格都不正确。请帮忙。
python - 使用子进程调用和 shlex 在 bash 命令中转义引号
我正在使用 python 的 subprocess.call() 执行 bash 命令。我将用户输入作为我的命令的参数,如下所示。
这里 arg1 和 arg2 是用户输入,但问题是用户输入可以有引号和空格,所以我想用这样的双引号将参数括起来。
由于我无法控制用户输入,因此输入可以包含双引号或单引号。因此,我用以下转义序列替换输入。
对我来说一切都很好,但是当我执行命令时,我得到了以下错误。
拆分返回列表 (lex) 中的文件“/usr/lib/python2.6/shlex.py”,第 279 行
文件“/usr/lib/python2.6/shlex.py”,第 269 行,在下一个令牌 = self.get_token()
文件“/usr/lib/python2.6/shlex.py”,第 96 行,在 get_token raw = self.read_token() 文件“/usr/lib/python2.6/shlex.py”,第 172 行,在 read_token
raise ValueError, "没有收盘价"
ValueError:没有收盘价
我该如何处理?
编辑:我想在 bash 命令中保留这些引号和空格。
parsing - swift2 等效于 python 的 shlex.split 以保留带引号的字符串中的空格
我正在寻找一个现有的 swift2 函数来在空格上拆分字符串输入,同时在带引号的字符串中保留空格。
我已阅读堆栈溢出问题 25678373。我的问题似乎没有重复。
我在 cocoapods 中搜索了类似的功能。我没有找到它。
如果 swift2 中不存在这个 shlex.split 函数,那么完成类似事情的有效替代方法是什么?在保留内部引号字符串中的空格的同时拆分字符串的另一种方法是什么?
这是我在python中的意思的一个例子:
python - Python Shlex 用括号分割
我需要将一系列字符串拆分为由空格表示的 3 个组成部分。这些字符串有时包含子列表,但总是作为字符串的最后一个组成部分。
我以前使用 Shlex 来实现这一目标并取得了巨大的成功,但由于我最近的子列表包含自己的空格,这似乎让 Shlex 失望了,所以我不再得到想要的结果。
是否有替代 Shlex 的方法可以更好地执行任务?
一些例子是:
和
应该变成如下列表:
和