多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 git 命令操作 nginx 用户进程(如 php-fpm)可在进程内附上预期的 SSH Key 进行 git 命令操作

1. 生成多个 SSH Key

以 root 身份登录服务器,为 root 用户和 nginx 用户分别生成 SSH Key。

仓库 1:

$ ssh-keygen -b 2048 -t rsa -f "~/.ssh/id_rsa_github_myrepo1"
$ sudo -u nginx ssh-keygen -b 2048 -t rsa -C "nginx@localhost" -f "/var/lib/nginx/.ssh/id_rsa_github_myrepo1"

仓库 2:

$ ssh-keygen -b 2048 -t rsa -f "~/.ssh/id_rsa_github_myrepo2"
$ sudo -u nginx ssh-keygen -b 2048 -t rsa -C "nginx@localhost" -f "/var/lib/nginx/.ssh/id_rsa_github_myrepo2"

此处的 nginx 用户的主目录因操作系统不同而拥有不同的路径,经测试 CentOS 系的操作系统可能值为:

"/var/lib/nginx"
"/var/cache/nginx"
"/usr/share/nginx"

之其一,请读者执行

sudo -u nginx ssh-keygen

查看并以实际路径为准,替换本文中的对应命令的路径。如:

[root@localhost]# sudo -u nginx ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/cache/nginx/.ssh/id_rsa):
此处的 nginx 用户的主目录为 "/var/cache/nginx"。

2. 获取 SSH Key 公钥

将生成好的 SSH Key 的公钥部分添加到两个 Github 仓库设置的 Deploy Keys(部署密钥)中。

仓库 1:

$ cat "~/.ssh/id_rsa_github_myrepo1.pub"
$ cat "/var/lib/nginx/.ssh/id_rsa_github_myrepo1.pub"

仓库 2:

$ cat "~/.ssh/id_rsa_github_myrepo2.pub"
$ cat "/var/lib/nginx/.ssh/id_rsa_github_myrepo2.pub"

3. 将不同的 SSH Key 与「主机名」对应起来

编辑用户的 SSH 配置文件,并指定主机的详细自定义配置。

root 用户:

$ nano "~/.ssh/config"
Host github.com-myrepo1
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github_myrepo1

Host github.com-myrepo2
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github_myrepo2

nginx 用户:

$ nano "/var/lib/nginx/.ssh/config"
Host github.com-myrepo1
    HostName github.com
    User git
    IdentityFile /var/lib/nginx/.ssh/id_rsa_github_myrepo1

Host github.com-myrepo2
    HostName github.com
    User git
    IdentityFile /var/lib/nginx/.ssh/id_rsa_github_myrepo2

4. 进行 git 命令操作

完成了上述步骤,读者现在可以在 root 或 nginx 用户登录或以其运行的进程中执行 git 命令,并且会自动附上指定的 SSH Key。例如:

$ git clone git@github.com-myrepo1:tommy/myrepo1.git "/var/www/myrepo1"
$ git clone git@github.com-myrepo2:tommy/myrepo2.git "/var/www/myrepo2"

PHP 运行于 nginx 用户的 php-fpm 进程时:

<?
header( 'Content-type: text/text' );
exit( shell_exec( 'cd /var/www/myrepo1; git pull origin master 2>&1' ) );
exit( shell_exec( 'cd /var/www/myrepo2; git pull origin master 2>&1' ) );

额外补充

修改 git 仓库地址

git remote set-url <name> <newurl>
git remote set-url origin git@github.com-myrepo1:tommy/myrepo1.git
git remote set-url origin git@github.com-myrepo2:tommy/myrepo2.git

修改know_hosts

删掉,重新生成即可。

rm -f ~/.ssh/know_hosts
ssh -T git@github.com
Hi Anonymous! You've successfully authenticated, but Github.com does not provide shell access.

修改config权限

Bad owner or permissions
sudo chmod 600 ~/.ssh/config
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值