UnicodeEncodeError:“utf-8”编解码器无法对位置 4-6 的字符进行编码:不允许代理

UnicodeEncodeError:“utf-8”编解码器无法对位置 4-6 的字符进行编码:不允许代理

我编写了一小段代码来检查 aws cli 版本

#!/bin/bash
if [ -e "/usr/local/bin/aws" ];
then
    myAWS="/usr/local/bin/aws"
else
    myAWS="/usr/bin/aws"
fi

myCmd=("${myAWS} --version")

echo "$myCmd"

message=$($myCmd)

echo "$message"

现在,当我以 root 用户身份手动运行此程序时,我可以运行,但在通过 crontab 运行此程序时,我们的 aws cli 升级之后

57 21 * * * /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1 

我遇到以下错误,您能建议一下吗,我已经重新安装了 aws cli,但没有效果。

/usr/local/bin/aws --version
Traceback (most recent call last):
  File "aws", line 19, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
  File "awscli/clidriver.py", line 43, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
  File "awscli/help.py", line 20, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
  File "docutils/core.py", line 23, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "PyInstaller/loader/pyimod02_importers.py", line 493, in exec_module
  File "docutils/io.py", line 43, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 4-6: surrogates not allowed
[24036] Failed to execute script 'aws' due to unhandled exception!

答案1

Cron 有自己的PATH这是源代码中的硬编码。这意味着 cron 命令将在不同的环境中运行。我猜你的用户(或 root)python在他们的 中配置了不同的环境PATH。或者你在登录时激活了 python 环境,或者安装了一些pip软件包。无论是哪种情况,你都需要在你的 中重现它cron

首先,echo "$PATH"以该命令适用的用户身份登录后运行。然后,获取PATH打印结果并将其添加到 crontab 的开头:

PATH="blah;blah;blah"
57 21 * * * /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1 

如果这不起作用,您可以尝试使用以下命令加载用户的 shell 配置文件bash -i

       -i        If the -i option is present, the shell is interactive.

这将强制bash以“交互”模式运行,这意味着它将读取调用用户的~/.bashrc文件(参见https://askubuntu.com/a/438170/85695):

57 21 * * * bash -i /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1 

如果这仍然不起作用,您需要确切地弄清楚您使用的 python 设置以及它的来源,然后尝试在 crontab 中重现它。如果您编辑问题并提供有关您的设置的更多详细信息,我们可能会提供帮助。


顺便提一下,您可以稍微简化一下脚本。首先,由于和都/usr/local/bin处于/usr/bin默认状态PATH,如果您的目标if是找出两者中哪一个包含aws可执行文件,那么您根本不需要if,只需运行即可aws

相反,如果您希望始终优先考虑 中的版本,/usr/local/bin即使 中有另一个版本/usr/bin,那么 就if很有意义。

message=$(command); echo $message接下来,运行: 如果command打印出您想要看到的内容,则直接运行它就没什么意义了。我会像这样编写您的脚本:

#!/bin/bash
myAws=/usr/bin/aws
[ -e /usr/local/bin/aws ] && myAws=/usr/local/bin/aws

myCmd=("$myAWS" "--version")
echo "${myCmd[@]}"
"${myCmd[@]}"

或者,如果你只是想跑步一个 aws并且if只是为了弄清楚它安装在哪里,并且您还想查看它的完整路径,只需:

#!/bin/bash
myAws=$(which aws)
myCmd=("$myAws" "--version")
echo "${myCmd[@]}"
"${myCmd[@]}"

相关内容