【问题标题】:Running python script with a parameter using cronjob gives error: /bin/sh: password: command not found使用 cronjob 运行带有参数的 python 脚本会出现错误:/bin/sh: password: command not found
【发布时间】:2017-02-16 10:12:36
【问题描述】:

我将使用 cronjob 运行带有参数的 python 脚本。 参数为脚本中需要使用的数据库密码。

#!/usr/bin/python

import MySQLdb
import requests
import json
import os
import sys
param=sys.argv
password=param[1]

db = MySQLdb.connect(host="host.com",port=3306,user="user",passwd=password,db="db")

/etc/crontab:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# *  *  *  *  * user-name command to be executed

crontab -e

*/5 * * * *  /home/test/run.py "dbpass'"

哪个蟒蛇:

/usr/bin/python

/var/spool/mail 中的错误

/bin/sh: dbpass': command not found

如果我手动运行脚本,它可以正常工作:python run.py "dbpass'"

任何帮助将不胜感激。

【问题讨论】:

  • 该错误表明 cron 尝试使用“dbpass”作为命令。您确定这是在用户 crontab 中,而不是在系统范围 (/etc/crontab) 中,它需要用户名作为第 6 个字段?
  • @mata 嗨,感谢您的命令。是的,我把它放在没有用户名的 crontab -e 中。

标签: python linux cron


【解决方案1】:

您发布的字符串包含unicode字符,它的表示是

u'*/5 * * * *\u2002\u2002/home/test/run.py "dbpass\'"'
# or encoded to utf-8:
b'*/5 * * * *\xe2\x80\x82\xe2\x80\x82/home/test/run.py "dbpass\'"'

\u2002 是 EN 空间

所以第 5 个参数实际上是 *\u2002\u2002/home/test/run.py,似乎 cron 将其视为 *,将下一项作为命令。

所以只需用普通空格替换那些 EN SPACE 字符就可以了。

【讨论】:

  • 抱歉,# or in bytes 的评论不准确:它可能会说,# or in utf-8。前者是普通的 utf 表示(或非特殊字符 utf-16 的等价物)
【解决方案2】:

您的 crontab 条目应包含不带引号的密码:

*/5 * * * *  /home/test/run.py dbpass

【讨论】:

  • 您好,感谢您的回复。由于 MySQLdb.connect() 格式,我需要 dbpass 周围的“”。那我怎么解决呢?
  • MySQLdb.connect() 中不需要任何额外的引号 - 从 CLI 参数读取的密码已经是字符串。
  • crontab 中的引号不会作为参数传递,它们会被 shell 删除,所以将它们放在那里就很好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2015-09-29
  • 2017-01-29
相关资源
最近更新 更多