在Gitlab上的代码仓库,如果是通过ssh方式拉取代码,需要在两台机器之间建立ssh信任,而通过WEB系统(基于PHP)操作git,也要建立PHP进程用户和Gitlab机器的ssh信任。简而言之,就是两台机器用户之间建立信任很简单,但是PHP进程用户也要建立ssh信任,这里面遇到一些问题。这涉及到Linux用户的概念和权限问题,其实还是对Linux不够了解。 两台机器建立ssh-key信任很简单,需要两步操作就可以了。 1.生成ssh-key ssh-keygen -t rsa -C "$your_email" 查看ssh-key: PHP cat ~/.ssh/id_rsa.pub 将内容复制在Gitlab系统添加ssh-key即可。 2.通过gitlab后台添加ssh-key 但是问题是: 现在在机器A上搭建了一个PHP的WEB系统,也就是代码发布系统,简而言之,就是要通过系统去拉取代码,这个时候PHP是以nobody进程用户(当然也可以设置为其他用户)运行的,而之前是给root用户建立了信任,这个时候操作就会失败。 接下来,就是给nobody用户也创建ssh-key,问题就来了。 查看PHP进程用户 首先,查看PHP进程是以什么用户运行的,有两种方式: 第一种方式:查看php-fpm.conf的配置 先使用find命令查找一下文件位置并查看: [root@localhost home]# find / -name php-fpm.conf 内容如下: [www] 第二种方式:使用ps命令查看正在运行的php进程 使用命令: [root@localhost home]# ps aux | grep php 切换nobody用户的问题 要在nobody用户下创建ssh-key,先要切换到nobody用户。 使用命令: su - nobody 但是提示: [root@localhost ~]# su - nobody 打开Linux的/etc/passwd文件。 如图所示: 看到nobody一行,路径/home/nobody,原本的路径是/,因为要创建home目录。为了能够su – nobody切换用户,后面的shell环境路径/sbin/nologin要临时改成/bin/bash. 给nobody用户建一个home目录,并把目录的所有者设为nobody,用root账户下操作:
注意:要设置所有者为nobody。 引用网上的资料: nologin命令可以实现礼貌地拒绝用户登录系统,同时给出信息。如果尝试以这类用户登录,就在log里添加记录,然后在终端输出This account is currently not available信息,就是这样。一般设置这样的帐号是给启动服务的账号所用的,这只是让服务启动起来,但是不能登录系统。 现在使用su – nobody切换到nobody用户,执行创建ssh-key命令,如图所示: 如图所示就说明nobody的ssh-key建立好了。使用cat ~/.ssh/id_rsa.pub命令查看公钥内容,复制到gitlab后台进行添加即可。 测试ssh信任是否建立 直接在noboby用户的某个目录下,使用git clone看是否可以拉取代码。 看到这一步就离松了一口气了。 这个时候,再去网站后台操作拉取代码,发现OK了。 最后别忘了,把/etc/passwd的shell路径改回去,改成:/sbin/nologin. 另外介绍一下代码发布系统的原理,原理就是通过PHP的exec函数去执行Linux的命令,也可以执行git/svn等命令,在后台操作,实际上就是PHP去执行了这些操作,所以关键是把各种权限问题解决。 举个例子,如执行命令的方法: PHP final public function runLocalCommand($command) {
public function updateRepo($branch = 'master', $gitDir = null) { |