首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过python执行带有"at“(<<<)的bash-command :语法错误,最后看到的令牌

通过python执行带有"at“(<<<)的bash-command :语法错误,最后看到的令牌
EN

Stack Overflow用户
提问于 2018-07-09 02:33:44
回答 1查看 388关注 0票数 0

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

代码语言:javascript
复制
#!/usr/bin/python

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

当我执行程序时,我收到

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

乱码时间

这个截取的代码可以很好地处理每个命令本身(只要每个参数都是string类型的)。

有必要以这种方式调用"at“:邮件将命令保存在队列中(可在”atq“中查看),因为sudo ./codesend 111111 | at 18:25只是直接执行命令,并将执行记录在”/var/ at 18:25 <<< "sudo ./codesend 111111" /user“中。

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

我希望有人能为这个问题找到解决方案,或者能帮我找出错误。非常感谢你提前

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 02:37:27

前言:共享代码

考虑将以下上下文作为此答案的两个分支的一部分。

代码语言:javascript
复制
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: Python中的Feed Stdin

<<<是外壳语法。它对at没有任何意义,如果以文字参数的形式给出,at会拒绝它,这是完全正常的。

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

代码语言:javascript
复制
p = sp.Popen(['at', vartime], stdin=sp.PIPE)
p.communicate(cmd_str)

解决方案B:显式调用Shell

此外,<<<不是/bin/sh语法--它是bash、ksh和其他语言中支持的扩展;因此您不能仅仅通过添加shell=True标志(它使用/bin/sh,因此只保证POSIX特性)来可靠地获得它。如果你想要它,你需要显式地调用一个带有这个特性的shell,如下所示:

代码语言:javascript
复制
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
         ])

在这两种情况下,请注意,在从参数列表生成外壳命令时,我们使用的是shlex.quote()pipes.quote() (视我们的Python版本而定);这对于避免在我们的软件中创建外壳注入漏洞至关重要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51234956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档