如何通过 bash 可执行文件向 Gitlab 添加 SSH 密钥?

a.m*_*aei 4 ssh command-line bash git gitlab

我正在创建一个 bash 可执行文件,它创建一个 SSH 密钥,并将其上传到用户的 Gitlab 帐户。我知道如何通过 bash 可执行文件创建 SSH 密钥:

ssh-keygen -o -f ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

我也知道如何从中检索,但我不知道如何将其上传到用户的 Gitlab 帐户。

我找到了多个用于将用户的 SSH 上传到 Git hub 的文档,但没有找到 Gitlab(我认为大部分类似......?)。所以我会把它用于 Git hub

curl -u "USERNAME:PASSWORD" --data "{\"title\": \"TITLE\", \"key\": \"$(cat ~/.ssh/id_rsa.pub)\"}" https://api.github.com/user/keys
Run Code Online (Sandbox Code Playgroud)

我会制作USERNAMEPASSWORDTITLE输入字段供用户自定义。

我想说,对于Gitlab来说也同样简单(我在他们的API网站POST /users/:id/keys上找到了,但不知道如何将其实现为命令),但我不知道Gitlab和Github的关系有多密切。curl

des*_*ert 5

使用 Gitlab REST API 时需要解决的第一个问题是身份验证,这里的文档中有很好的解释。我在这篇文章中使用了个人访问令牌,其创建过程在此处进行了解释,但对于使用以特定用户身份进行身份验证的脚本的您来说,模拟令牌(请参阅此处了解创建过程)可能更适合。

\n\n

添加 ssh 密钥,我需要:

\n\n
POST /user/keys\n
Run Code Online (Sandbox Code Playgroud)\n\n

发送数据(并随后使用 POST 方法)curl提供了-d选项,必填字段为titlekey。由于默认标头是,Content-Type: application/x-www-form-urlencoded但 API 期望json我必须使用以下-H选项指定:

\n\n
$ curl -d \'{"title":"test key","key":"\'"$(cat ~/.ssh/id_rsa.pub)"\'"}\' -H \'Content-Type: application/json\' https://gitlab.com/api/v4/user/keys?private_token=<my_access_token>\n{"id":3889765,"title":"test key","key":"ssh-rsa <my_ssh_key>","created_at":"2019-08-01T21:26:40.952Z"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在为了测试更改,我只需列出我的 ssh 密钥。文档说我必须使用GET /user/keys,因为 GET 是curl\xe2\x80\x99s 默认方法,我只是这样做:

\n\n
$ curl https://gitlab.com/api/v4/user/keys?private_token=<my_access_token>\n[{"id":3889765,"title":"test key","key":"ssh-rsa <my_ssh_key>","created_at":"2019-08-01T21:26:40.952Z"}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我这样做只是为了测试,所以我 \xe2\x80\x99m 将使用\xe2\x80\x93删除密钥DELETE /user/keys/:key_id,注意:key_id需要用要删除的密钥的 id 替换:

\n\n
$ curl -X DELETE https://gitlab.com/api/v4/user/keys/3889765?private_token=<my_access_token>\n
Run Code Online (Sandbox Code Playgroud)\n\n

Here\xe2\x80\x99s是一篇关于常见 REST 方法的好文章curl

\n