1

我目前正在关注https://cloud.google.com/cloud-build/docs/access-private-github-repos但我被卡住了,我不确定是否理解。

事实上,我做了以下事情:

MBP-de-Emixam23:security-service emixam23$ gcloud kms keyrings create id_rsa --location=global
MBP-de-Emixam23:security-service emixam23$ gcloud kms keys create gitlab-key --location=global --keyring=id_rsa --purpose=encryption
MBP-de-Emixam23:security-service emixam23$ gcloud kms encrypt --plaintext-file=~/.ssh/id_rsa --ciphertext-file=~/.ssh/id_rsa.enc --location=global --keyring=id_rsa --key=gitlab-key
ERROR: (gcloud.kms.encrypt) Failed to read plaintext file [~/.ssh/id_rsa]: Unable to read file [~/.ssh/id_rsa]: [Errno 2] No such file or directory: '~/.ssh/id_rsa'
MBP-de-Emixam23:security-service emixam23$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
.....
-----END RSA PRIVATE KEY-------

有人可以告诉我在哪里gcloud kms寻找吗?我实际上需要它用于谷歌云构建触发目的

谢谢 !

编辑 1 - 为约翰的评论添加了详细信息

DEBUG: Running [gcloud.kms.encrypt] with arguments: [--ciphertext-file: "~/.ssh/id_rsa.enc", --key: "gitlab-key", --keyring: "id_rsa", --location: "global", --plaintext-file: "~/.ssh/id_rsa", --verbosity: "debug"]
DEBUG: (gcloud.kms.encrypt) Failed to read plaintext file [~/.ssh/id_rsa]: Unable to read file [~/.ssh/id_rsa]: [Errno 2] No such file or directory: '~/.ssh/id_rsa'
Traceback (most recent call last):
  File "/Users/emixam23/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 984, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/Users/emixam23/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 798, in Run
    resources = command_instance.Run(args)
  File "/Users/emixam23/google-cloud-sdk/lib/surface/kms/encrypt.py", line 90, in Run
    args.plaintext_file, e))
BadFileException: Failed to read plaintext file [~/.ssh/id_rsa]: Unable to read file [~/.ssh/id_rsa]: [Errno 2] No such file or directory: '~/.ssh/id_rsa'
ERROR: (gcloud.kms.encrypt) Failed to read plaintext file [~/.ssh/id_rsa]: Unable to read file [~/.ssh/id_rsa]: [Errno 2] No such file or directory: '~/.ssh/id_rsa'
4

2 回答 2

2

正如评论中所讨论的,这里的反派是波浪号扩展。这通常由 shell 完成,但是(像其他所有事情一样)存在复杂性。

波浪号扩展仅在 sh 和 bash 中的单词开头进行。因此,如果您通过--plaintext-file ~/.ssh/id_rsa,它会起作用,因为 shell 将第二个参数解析为它自己的单词并扩展前导~. 如果您通过--plaintext-file=~/.ssh/id_rsa,则缺少空格意味着 shell 将所有内容视为单个标记,并且不会扩展~. 如果 gcloud~在解析参数后扩展了前导本身,你会没事的(但显然不是)。

任何时候你看到文件名中印有错误消息时~,都要怀疑:如果 shell 扩展了 ~,你会看到 shell 传递给二进制文件的完整路径,而不是 raw ~

=一些 shell 支持在;之后的参数内扩展。例如,zsh有一个 config 参数,MAGIC_EQUAL_SUBST可以打开此行为。bash如果参数看起来像变量赋值,则在不在 POSIX 模式下也会执行此操作,但前导--意味着这看起来不像对 bash 的变量赋值。

虽然 gcloud 支持--flag valueor--flag=value语法,但如果您需要该--flag=value结构,您可以使用${HOME}而不是~获得类似的扩展。(我不会详细说明这些可能如何变化,是的边缘情况。)

感谢您使用 Cloud KMS!

于 2019-11-23T17:45:21.167 回答
2

如错误输出所示,该文件~/.ssh/id_rsa不存在。这可能有几个原因。

在大多数 shell(sh、bash、zsh)中,~扩展为当前用户的主目录。shell执行此扩展,通常基于$HOME您运行命令的用户。sudo例如,如果您使用 调用命令,~将解析为 root 的家,而不是您的家。从命令输出来看,它似乎~是按字面意思发送到 gcloud,但 gcloud 期望 shell 先解决它。

如果您使用的是不同的外壳,则可能~不受支持。cat鉴于您的命令有效,这似乎很可能。

另一种可能性是=导致您的 shell 不解析~. 我试图重现您的问题,但我不能。尽管如此,尝试以下命令会有所帮助(我已经删除了=参数的可选):

gcloud kms encrypt \
  --plaintext-file ~/.ssh/id_rsa \
  --ciphertext-file ~/.ssh/id_rsa.enc \
  --location global \
  --keyring id_rsa \
  --key gitlab-key

不要用引号括住文件路径,这一点非常重要,因为那样它们将被逐字解释,而不是由 shell 解析。

作为最后的手段,您可以强制 shell 像这样展开目录:

gcloud kms encrypt \
  --plaintext-file "$(cd ~/.ssh && pwd)/id_rsa" \
  --ciphertext-file "$(cd ~/.ssh && pwd)/id_rsa.enc" \
  --location global \
  --keyring id_rsa \
  --key gitlab-key
于 2019-11-23T06:21:25.443 回答