我用无线电发送器控制家里的一些照明设备。我正在尝试实现一个时间控件,并在过去成功地使用了程序“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
我希望有人能解决这个问题,或者能帮我找出错误。 非常感谢
前言:共享代码
将以下上下文视为此答案的两个分支的一部分。在
解决方案A:Feed Stdin In Python
<<<
是shell语法。它对at
没有意义,而且如果作为文本参数给出,at
拒绝它是完全正常的。在您不需要调用shell,但可以直接从本机Python执行相同的操作:
^{pr2}$解决方案B:显式调用Shell
而且,
<<<
不是/bin/sh
语法,它是bash、ksh和其他一些语言中的扩展;因此,仅仅通过添加shell=True
标志(它使用/bin/sh
),因此只保证POSIX的基线特性)是不可靠的。如果需要,则需要显式地调用具有此功能的shell,如下所示:无论哪种情况,请注意,在从参数列表生成shell命令时,我们使用的是}(与Python版本相适应);这对于避免在我们的软件中创建shell注入漏洞至关重要。在
shlex.quote()
或{相关问题 更多 >
编程相关推荐