最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
linux中给PHP进程用户noboby创建ssh-key并建立信任
时间:2016-07-28 编辑:简简单单 来源:一聚教程网
在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
/usr/local/php-5.6.23/etc/php-fpm.conf
[root@localhost home]# vim /usr/local/php-5.6.23/etc/php-fpm.conf
内容如下:
[www]
user = nobody
group = nobody
listen = 9000
第二种方式:使用ps命令查看正在运行的php进程
使用命令:
[root@localhost home]# ps aux | grep php
如图所示:
切换nobody用户的问题
要在nobody用户下创建ssh-key,先要切换到nobody用户。
使用命令:
su - nobody
但是提示:
[root@localhost ~]# su - nobody
This account is currently not available.
This account is currently not available.这是什么鬼!
打开Linux的/etc/passwd文件。
如图所示:
看到nobody一行,路径/home/nobody,原本的路径是/,因为要创建home目录。为了能够su – nobody切换用户,后面的shell环境路径/sbin/nologin要临时改成/bin/bash.
给nobody用户建一个home目录,并把目录的所有者设为nobody,用root账户下操作:
mkdir /home/nobody
chown nobody:nobody /home/nobody
注意:要设置所有者为nobody。
引用网上的资料:
nologin命令可以实现礼貌地拒绝用户登录系统,同时给出信息。如果尝试以这类用户登录,就在log里添加记录,然后在终端输出This account is currently not available信息,就是这样。一般设置这样的帐号是给启动服务的账号所用的,这只是让服务启动起来,但是不能登录系统。
执行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去执行了这些操作,所以关键是把各种权限问题解决。
举个例子,如执行命令的方法:
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目录,直接pull
if (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);
}
// 不存在,则先checkout
else {
$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系统用户的概念。
相关文章
- win11内核隔离和内存完整性介绍 10-31
- win10全屏缩放设置教程 10-31
- win10系统备份出错解决教程 10-31
- win10打开软件每次都要询问解决教程 10-31
- win10更新驱动后设备出现异常解决教程 10-31
- win10一直提示找到可能不需要的应用解决教程 10-31