本文以以下需求为背景,介绍详细的做法:

需在同一台服务器同时部署两个不同的 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

ssh test的更多相关文章

  1. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  2. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  3. 记录一则Linux SSH的互信配置过程

    需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...

  4. SSH免手动输入密码和设置代理

    通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...

  5. github免输用户名/密码SSH登录的配置

    从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...

  6. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  7. mac下生成ssh keys 并上传github仓储

    使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中   mac 生成方法:   1. 打开终端 输入   ssh-keygen 然后系统提示输入文件保存位置等信息 ...

  8. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...

  9. 树莓派3B的食用方法-1(装系统 网线ssh连接)

    首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...

  10. linux启动SSH及开机自动启动

    本文地址 分享提纲: 1.查看是否启动 2. 设置自动启动 1.[查看是否启动] 启动SSH服务 “/etc/init.d/sshd start”.然后用netstat -antulp | grep ...

随机推荐

  1. Java并发编程:synchronized、Lock、ReentrantLock以及ReadWriteLock的那些事儿

    目录 前言 synchronized用法 修饰方法 修饰实例方法 修饰静态方法 同步代码块 引出Lock Lock用法 子类:ReentrantLock 读写分离锁:ReadWriteLock Loc ...

  2. PPT文件流转为图片,并压缩成ZIP文件输出到指定目录

    实现流程: 接收InputStream流->复制流->InputStream流转为PPT->PPT转为图片->所有图片压缩到一个压缩文件下 注意: 1.PPT文件分为2003和 ...

  3. Navicat安装及简单使用

    一.安装 下载完之后,直接解压出来就能用,看一下解压之后的目录: 双击打开下面这个文件(可以把它添加一个桌面快捷方式,或者添加到任务栏): 然后会提示你输入注册码: 回到navicat的解压出来的文件 ...

  4. 实践:配置keepalived实现主备热备份功能

    图: 配置文件: 主服务器的配置如下: global_defs { router_id NodeA}vrrp_instance VI_1 { state MASTER #设置为主服务器 interfa ...

  5. loadrunner 运行脚本-Run-time Settings之Preferences设置

    运行脚本-Run-time Settings之Preferences设置 by:授客 QQ:1033553122 打开Preferences设置对话框,这里提供了对运行时的参数选择设置 Enable ...

  6. vue路由的配置

    一.准备工作 1安装vue-cli  npm install vue-cli -g 2检查是否安装成功 vue -V(大写V) 3初始化一个新的项目 vue init  webpack vue-dem ...

  7. 11.1、socket连接中的粘包、精确传输问题

    粘包: 发生原因: 当调用send的时候,数据并不是即时发给客户端的.而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会发送,所以有时候发送太快的话,前一份数据还没有 ...

  8. [20170904]11Gr2 查询光标为什么不共享脚本.txt

    [20170904]11Gr2 查询光标为什么不共享脚本.txt --//参考链接下面的注解脚本:https://carlos-sierra.net/2017/09/01/poors-man-scri ...

  9. Xamarin入门,开发一个简单的练手APP

    之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...

  10. WFE和WFI的区别

    1. 概念: WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture ...