Python Ubuntu 上的 SSLError,但仅当来自 CRON 的 运行 时

Python SSLError on Ubuntu, but only when run from a CRON

我有一个使用请求模块的 Python 脚本。它在我的桌面上工作 (Windows),当我在我的 VM 上手动 运行 它时工作 (Ubuntu 14.04 / python 2.7.14)。 但是,当将完全相同的命令安排为同一 VM 上的 CRON 作业时,它会失败。

违规行似乎是:

index_response = requests.get(my_https_URL, verify=False)

(略有编辑的)回复是:

(<class 'requests.exceptions.SSLError'>, SSLError(MaxRetryError("HTTPSConnectionPool(host=my_https_URL, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '_ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure'),))",),), <traceback object at 0x7f3d877ce5f0>)

HTTP URL 似乎没有受到影响,实际上一些 HTTPS URL 正在 工作...(我认为是需要 SNI 的域不工作)。

我尝试添加 verify=False,甚至 运行将 CRON 脚本作为 sudo,但没有更新。 当我手动 运行 时它最初失败了,但我随后安装了 python2.7.14(除了 python 2.7.6),这解决了手动问题。为了进一步增加复杂性,该脚本由另一个使用 exec 的脚本触发(测试 运行ner 运行 各种测试脚本,包括这个脚本) - 这可能相关吗?

我在 urllib2 中没有遇到这个问题,但如果可以的话,我宁愿不要从请求返回到 urllib2...

因为我现在可以更好地格式化这里作为答案:

如果 cron 可能只是在您的情况下选择了错误的解释器。一个简单的解决方案是提供它的完整路径,您可以通过以下方式找到它:

md@gw1:~$ type python2.7
python2.7 is /usr/bin/python2.7
md@gw1:~$

现在在你的 crontab 中使用:

0 12 * * * /usr/bin/python2.7 your_script.py

或者使用所谓的 shebang:

md@gw1:~$ cat your_script.py
#!/usr/bin/python2.7

print "hello"

md@gw1:~$ chmod +x your_script.py
md@gw1:~$ ./your_script.py
hello
md@gw1:~$

your_script.py 中的第一行和 chmod 使其可执行并将使用正确的解释器。

在我的案例中,服务试图获取大 json 并将其保存到数据库。 我尝试重写代码,从使用节点的 https 模块到请求等。

但真正的原因正如上面@Mandraenke 所描述的那样。 因为我已经安装了 nvm - cron 作业可能使用了不正确的节点版本.

所以,我用 type node 显示了当前版本,并在作业中替换了

0 4 * * * node my-script.js

0 4 * * * /home/my-user/.nvm/versions/node/v12.14.1/bin/node my-script.js