指引网

当前位置: 主页 > 操作系统 > Linux >

linux中给PHP进程用户noboby创建ssh-key并建立信任

来源:网络 作者:佚名 点击: 时间:2017-05-13 00:34
[摘要]  下面我们来看一篇关于linux中给PHP进程用户noboby创建ssh-key并建立信任的教程,希望这篇文章能够帮助到各位朋友哦。

在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系统用户的概念。

------分隔线----------------------------
栏目列表
推荐内容