Python Azure Function运行时执行ssh-keygen报FileNotFoundError问题咨询
错误原因
你遇到的报错不是/usr/bin/ssh-keygen文件不存在,而是subprocess.run默认会将传入的字符串整体作为可执行文件的路径查找,系统实际是在找名为/usr/bin/ssh-keygen -V的文件,自然会触发找不到文件的报错。
修复方案
推荐使用参数列表形式调用subprocess.run,无需开启shell,无命令注入风险,修改代码如下:
# 原错误写法 # result = subprocess.run("/usr/bin/ssh-keygen -V", stdout=subprocess.PIPE) # 修复后写法 result = subprocess.run(["/usr/bin/ssh-keygen", "-V"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
如果要继续使用字符串形式传命令,可以添加shell=True参数,但该方式存在命令注入风险,不推荐生产环境使用:
result = subprocess.run("/usr/bin/ssh-keygen -V", stdout=subprocess.PIPE, shell=True)
如果你后续需要生成SSH密钥,调用命令示例如下,注意指定空密码避免交互卡住:
# 生成4096位RSA密钥,无密码,输出到你生成的临时文件路径 subprocess.run( ["/usr/bin/ssh-keygen", "-t", "rsa", "-b", "4096", "-f", idFile, "-N", ""], check=True, capture_output=True, text=True ) # 生成后读取idFile和idFile.pub的内容即可获取私钥和公钥
本地运行正常的原因
本地开发环境的运行逻辑可能默认开启了shell参数,会自动拆分命令和参数,所以没有触发报错,云端运行环境的默认配置更严格,因此暴露了代码问题。
内容的提问来源于stack exchange,提问作者Christian Pedersen
相关产品推荐
相关产品推荐

