热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

给PHP进程用户noboby创建sshkey并建立信任

摘要:本文讲的是给PHP进程用户noboby创建ssh-key并建立信任,这个问题是要解决PHP以nobody作为进程用户时的ssh-key创建

摘要: 本文讲的是给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

如图所示:

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

切换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文件。

打开文件如图所示:

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

这里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命令,如图所示:

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

看到这里,就说明nobody的ssh-key建立好了。

使用cat ~/.ssh/id_rsa.pub命令查看公钥内容,复制到gitlab后台进行添加。

测试ssh信任是否建立

直接在noboby用户的某个目录下,使用git clone看是否可以拉取代码。

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

看到这一步就离松了一口气了。

这个时候,再去网站系统后台的方式拉取代码,发现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 ,以便于您获取更多的相关知识。


推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 在GitHub上克隆vue-element-admin项目时遇到依赖安装错误
    在 GitHub 上克隆 vue-element-admin 项目后,使用 `npm install` 安装依赖时遇到了未知的 Git 错误。具体错误信息为 `npm ERR! code 128`,提示命令执行失败。这可能是由于网络问题、Git 配置不正确或某些依赖包的仓库地址无效导致的。建议检查网络连接、更新 Git 版本并确保所有依赖项的 URL 正确无误。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 在开发过程中,为了确保代码的实时保存,我们常常会对某个功能进行多次提交。然而,当功能趋于稳定时,将这些分散的提交记录合并为一次提交,可以提高代码仓库的整洁度和可维护性。本文将详细介绍如何使用 Git 巧妙地合并多次提交记录,帮助开发者简化历史记录管理。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • ROS主机与从机之间的通信原理及机制分析
    本文深入探讨了ROS(Robot Operating System)主机与从机之间的通信原理及机制。通过分析ROS网络架构,详细阐述了节点间的通信方式、消息传递流程以及数据同步机制。此外,还介绍了ROS中常用的通信模式,如发布/订阅、服务调用和参数服务器,为开发者提供了全面的技术指导。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
author-avatar
yax何
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有