摘要: 本文讲的是给PHP进程用户noboby创建ssh-key并建立信任, 这个问题是要解决PHP以nobody作为进程用户时的ssh-key创建,以及将ssh-key添加到git的deploy-keys列表,也就是两台机器建立ssh信任,但是nobody用户比较特殊,遇到了一点问题。这里面涉及Linux用户的概
a b c d e f g h i j k l m n
这个问题是要解决PHP以nobody作为进程用户时的ssh-key创建,以及将ssh-key添加到git的deploy-keys列表,也就是两台机器建立ssh信任,但是nobody用户比较特殊,遇到了一点问题。这里面涉及Linux用户的概念,其实还是对Linux不够了解。
为什么会出现这个情况。
两台机器建立ssh-key信任很简单,比如要在一台机器上(机器A)用git以ssh方式拉取gitlab上的仓库,这个gitlab在另一台机器上(机器B),这两台机器都是内网,需要两步操作就可以了。
1.生成ssh-key
ssh-keygen -t rsa -C "$your_email"
查看ssh-key:
cat ~/.ssh/id_rsa.pub
将内容复制即可。
2.通过gitlab后台添加ssh-key
这个时候机器A上以root用户登录的。
但是问题是:
现在在机器A上搭建了一个PHP的WEB系统,也就是代码发布系统,简而言之,就是要通过系统去拉取代码,这个时候PHP是以nobody进程用户(当然也可以设置为其他用户)运行的,而之前是给root用户建立了信任,这个时候操作就会失败。
接下来,就是给nobody用户也创建ssh-key,问题就来了。
查看PHP进程用户
首先,如何查看PHP是以什么用户创建进程的。两种方式:
第一种方式:查看php-fpm.conf的配置
先使用find命令查找一下文件位置并查看:
[[email protected] home]# find / -namephp-fpm.conf/usr/local/php-5.6.23/etc/php-fpm.conf[[email protected] home]# vim /usr/local/php-5.6.23/etc/php-fpm.conf
内容如下:
[www]user = nobodygroup = nobodylisten = 9000
第二种方式:使用ps命令查看正在运行的php进程
使用命令:
[[email protected]]# ps aux | grep php
如图所示:
切换nobody用户的问题
要在nobody用户下创建ssh-key,先要切换到nobody用户。
使用命令:
ssh - nobody
但是提示:
[[email protected] ~]# su - nobodyThis accountis currentlynot available.
This account is currently not available.这是什么鬼。
引用网上的资料:
nologin命令可以实现礼貌地拒绝用户登录系统,同时给出信息。如果尝试以这类用户登录,就在log里添加记录,然后在终端输出This account is currently not available信息,就是这样。一般设置这样的帐号是给启动服务的账号所用的,这只是让服务启动起来,但是不能登录系统。
这里要修改Linux的/etc/passwd文件。
打开文件如图所示:
这里nobody的路径/home/nobody,原本的路径是/,也就是根目录,这里要创建home目录,所以路径改成这种。为了能够su – nobody切换用户,后面的shell环境路径/sbin/nologin要 临时 改成/bin/bash.
因为nobody的home目录:/home/nobody不存在,先应该给nobody用户建一个home目录,并把目录的所有者设为nobody,用root账户下操作:
mkdir /home/nobodychownnobody:nobody /home/nobody
这里设置所有者为nobody很重要。
然后执行前面说的建立ssh-key的步骤,如果提示.ssh目录不存在之类的,这个时候直接mkdir创建即可。
现在使用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去执行了这些操作,所以关键是把各种权限问题解决。
举个例子,如执行命令的方法:
final public function runLocalCommand($command) {$command = trim($command);$status = 1;$log = '';exec($command . ' 2>&1', $log, $status);// 执行过的命令$this->command = $command;// 执行的状态$this->status = !$status;// 操作日志$log = implode(PHP_EOL, $log);$this->log = trim($log);return $this->status;}
如Git的操作:
public function updateRepo($branch = 'master', $gitDir = null) {$gitDir = $gitDir ?: Project::getDeployFromDir();$dotGit = rtrim($gitDir, '/') . '/.git';// 存在git目录,直接pullif (file_exists($dotGit)) {$cmd[] = sprintf('cd %s ', $gitDir);$cmd[] = sprintf('/usr/bin/env git checkout -q %s', $branch);$cmd[] = sprintf('/usr/bin/env git fetch -q --all');$cmd[] = sprintf('/usr/bin/env git reset -q --hard origin/%s', $branch);$command = join(' && ', $cmd);return $this->runLocalCommand($command);}// 不存在,则先checkoutelse {$cmd[] = sprintf('mkdir -p %s ', $gitDir);$cmd[] = sprintf('cd %s ', $gitDir);$cmd[] = sprintf('/usr/bin/env git clone -q %s .', $this->getConfig()->repo_url);$cmd[] = sprintf('/usr/bin/env git checkout -q %s', $branch);$command = join(' && ', $cmd);return $this->runLocalCommand($command);}}
通过这个可以做很多事情。
看来还要多了解Linux系统用户的概念。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ssh , php , 进程 , key , 用户 , 创建 , , 并建 noboby ,以便于您获取更多的相关知识。