(<bashtoken,最后通过“<python”命令执行

2024-06-16 14:53:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用无线电发送器控制家里的一些照明设备。我正在尝试实现一个时间控件,并在过去成功地使用了程序“at”。在

#!/usr/bin/python

import subprocess as sp
##### some code #####
sp.call(['at', varTime, '<<<', '\"sudo', './codesend', '111111\"'])

当我执行程序时,我收到

错误消息语法错误。最后看到的令牌:<;

乱码时间

这个codesnipped可以很好地处理每个命令本身(只要每个参数都来自string类型)。在

必须以这种方式调用“at”:at 18:25 <<< "sudo ./codesend 111111"以在队列中保存命令(在“atq”中可见), 因为sudo ./codesend 111111 | at 18:25只是直接执行命令,并将执行情况写在“/var/mail/user”中。在

我的问题是,如何避免语法错误。 我在这个程序中使用了很多其他的包,所以我不得不继续使用Python

我希望有人能解决这个问题,或者能帮我找出错误。 非常感谢


Tags: import命令程序binusr错误时间sudo
1条回答
网友
1楼 · 发布于 2024-06-16 14:53:41

前言:共享代码

将以下上下文视为此答案的两个分支的一部分。在

import subprocess as sp
try:
    from shlex import quote # Python 3
except ImportError:
    from pipes import quote # Python 2

# given the command you want to schedule, as an array...
cmd = ['sudo', './codesend', '111111']

# ...generate a safely shell-escaped string.
cmd_str = ' '.join(quote(x) for x in cmd))

解决方案A:Feed Stdin In Python

<<<是shell语法。它对at没有意义,而且如果作为文本参数给出,at拒绝它是完全正常的。在

您不需要调用shell,但可以直接从本机Python执行相同的操作:

^{pr2}$

解决方案B:显式调用Shell

而且,<<<不是/bin/sh语法,它是bash、ksh和其他一些语言中的扩展;因此,仅仅通过添加shell=True标志(它使用/bin/sh),因此只保证POSIX的基线特性)是不可靠的。如果需要,则需要显式地调用具有此功能的shell,如下所示:

bash_script = '''
at "$1" <<<"$2"
'''
sp.call(['bash', '-c', bash_script,
         '_',                      # this is $0 for that script
         vartime,                  # this is its $1
         cmd_str,                  # this is its $2
         ])

无论哪种情况,请注意,在从参数列表生成shell命令时,我们使用的是shlex.quote()或{}(与Python版本相适应);这对于避免在我们的软件中创建shell注入漏洞至关重要。在

相关问题 更多 >