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

需在同一台服务器同时部署两个不同的 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. [日常] Go语言圣经-字节切片与字符串

    1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...

  2. idea创建maven项目速度慢?别急,这有三种方案

    困扰 Intellij idea是一款非常强大的编辑器,可以很方便地帮我们创建maven项目,有用过的同学应该都深有体会,但我们经常会遇到一个困扰,那就是用idea创建maven项目时,速度很慢,往往 ...

  3. lucene 核心概念及入门

    lucene Lucene介绍及核心概念 什么是Lucene Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程序接口 ...

  4. 【读书笔记】iOS-属性中的内存管理参数

    一,assign 代表设置时候直接赋值,而不是复制或者保留它. 二,retain. 会在赋值的时候把新值保留.此属性只能用于Object-C对象类型. 三,copy 在赋值时,将新值复制一份,复制工作 ...

  5. Visual Flow 简介

    Visual Flow(流) Salesforce提供了几种自动化流程工具,其中的Visual Flow(流)可以用来实现用户界面和逻辑,并对数据进行CRUD(Create 创建,Read 读取,Up ...

  6. 在Apex中使用sObject

    sObject对象的定义 Salesforce中的标准对象或自定义对象在Apex中使用时被称作"sObject".sObject对象的一个实例相当于Salesforce中的一条记录 ...

  7. getWidth()和getMeasuredWidth()的区别

    结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个大小有可能 ...

  8. python中if else流程判断

    _username='Lily' _password=' username=input("username:") password=input("password:&qu ...

  9. UML类图关系图解

    一.类结构 在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称.属性和方法. 其中, 一般类的类名用正常字体粗体表示,如上图:抽象类名用斜体字粗体,如User:接 ...

  10. maven(四):一个基本maven项目的pom.xml配置

    继续之前创建的test项目,一个基本项目的pom.xml文件,通常至少有三个部分 第一部分,项目坐标,信息描述等 <modelVersion>4.0.0</modelVersion& ...