You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在Google Cloud Function中执行ssh-keygen命令?

解决Cloud Functions调用ssh-keygen报错的问题

问题根源

Cloud Functions的运行时是精简的容器镜像,没预装ssh-keygen这类OpenSSH工具,而Cloud Shell是完整的Linux环境,所以能直接跑命令,两者环境不一样。

可行解决办法

办法1:用Python原生库生成SSH密钥(推荐)

不用依赖系统工具,直接用cryptography库生成兼容OpenSSH的密钥对,示例代码:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

def generate_ssh_key():
    # 生成2048位私钥
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    # 转成OpenSSH格式的私钥字符串
    private_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.OpenSSH,
        encryption_algorithm=serialization.NoEncryption()
    ).decode('utf-8')
    # 生成对应公钥
    public_key = private_key.public_key()
    public_pem = public_key.public_bytes(
        encoding=serialization.Encoding.OpenSSH,
        format=serialization.PublicFormat.OpenSSH
    ).decode('utf-8')
    return private_pem, public_pem

生成密钥后,把公钥添加到GCE实例的metadata里,就能实现SSH连接。

办法2:自定义Cloud Functions运行镜像(适合必须用ssh-keygen的场景)

构建包含OpenSSH工具的自定义镜像,部署到Cloud Functions:

  • 写Dockerfile示例:
FROM gcr.io/google.com/cloudsdktool/cloud-sdk:latest
RUN apt-get update && apt-get install -y openssh-client python3-pip
# 复制你的函数代码和依赖文件
COPY . /workspace
WORKDIR /workspace
RUN pip install -r requirements.txt
CMD ["functions-framework", "--target", "你的函数名"]

把镜像推送到Artifact Registry,再部署Cloud Functions时指定用这个镜像。

办法3:用GCP官方工具简化连接

不用手动处理密钥,直接用gcloud compute ssh命令(需确保Cloud Functions的服务账号有GCE相关权限),但同样需要在自定义镜像里装gcloud和openssh-client。

重要提醒

  • Cloud Functions的服务账号得有compute.instances.setMetadata权限,才能往GCE实例里加公钥
  • 私钥要妥善存储,别泄露

内容的提问来源于stack exchange,提问作者Matthew Burkhardt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:42:08