2012-04-12 16:40:03 wuhengwudi 阅读数 15441
  • 阿里云ECS Linux服务器项目部署实战视频课程

    本套课程建立在阿里云linux(centos6.5) 具体内容如下: 1,购买云主机&安装上传工具 2,安装nginx 3,绑定域名(域名备案,虚拟主机绑定等) 4,安装mysql(设定开机启动,环境变量,更改连接密码等) 5,安装php 6,配置nginx识别php 7,安装thinkcmf完成pathinfo模式&伪静态模式的nginx设置 8,安装phpmyadmin&ftp;服务

    7136 人正在学习 去看看 吴华

由于以前在虚拟机中每次都是以root用户身份登录和进行操作,所以基本都没有用到sudo,但是最近项目需要要进行这么个事:通过浏览器访问php网页,php网页里会调用执行linux下的一个脚本。本来这个事很简单的,但是我在实际操作的时候,发现每次通过浏览器访问时,脚本都没有被执行,而我在终端里面通过命令行执行php网页确又是没有任何问题的,当时就觉得很差异,后来仔细想了想,通过浏览器访问和直接在终端里执行其发起者不一样,想想应该是用户权限的问题,于是就上网查了查,结果就有了sudo这么回事。好了,说了一堆废话,下面来介绍下怎么用sudo解决上面的权限问题。

1.sudo介绍

sudo允许root分配给普通用户一些不具备的权利,让普通用户也可以具有root用户的相关权限(比如说sudo可以分配给某一用户某些特定的命令执行权限)。

其中sudo一个重要的文件就是/etc/sudoers,哪些用户具有什么样的命令可以执行都是靠这个文件的,主要只有里面分配了的用户才能使用sudo。

sudo -l 列出该用户能执行的命令
sudo -u user 以指定用户来执行命令
sudo -k 清楚入场券上的时间,下次使用sudo还要输入密码
sudo -b 在后台执行命令
在终端里面输入visudo即可打开/etc/sudoers文件。

找到如图所示的地方


图中红色方框的内容是我自己后来加的,其中daemon是php运行的用户,不同的环境下默认名字会不一样,我在fedora 9下的为daemon而在unbuntu中则不是这个名。

查看php运行的用户可以通过下面这个php网页获取。

<?php 
    echo shell_exec("id -a");
?>

看图中每行都有三个ALL,第一个ALL代表网络中的主机,第二个括号里面的ALL代表目标用户,表示以谁的身份去执行命令,最后一个ALL代表的是可执行的命令名(可以指定你想要该用户能够执行的命令)。

其中NOPASSWD表示不用输入密码。(为了方便嘛,不然我通过浏览器访问难道程序里面多了道填写密码,还要等反馈,真是麻烦,这样就省事多了)

若是Ubuntu则不用再修改了,若是fedora 等则还需要进行一些修改,

Defaults    env_reset打开就可以了(即前面的#号去掉)

2.检查php.ini配置文件中是否打开了安全模式

safe_mode =  off 这样就可以了


php执行linux脚本的函数有多个,shell_exec()、system()等,这里也不多做介绍了,用就行了,我采用system()函数。
route.php
<?php
$ip=(string)$_POST["ip"];
system("sudo ./route.sh $ip",$status);
if($status == 'true')
{
	echo "设置成功";
}
else
{
	echo "设置失败";
}
?>

前面设置妥当后,执行后,浏览器会显示设置成功,说明脚本成功执行。



2019-03-07 10:00:44 cc1969281777 阅读数 265
  • 阿里云ECS Linux服务器项目部署实战视频课程

    本套课程建立在阿里云linux(centos6.5) 具体内容如下: 1,购买云主机&安装上传工具 2,安装nginx 3,绑定域名(域名备案,虚拟主机绑定等) 4,安装mysql(设定开机启动,环境变量,更改连接密码等) 5,安装php 6,配置nginx识别php 7,安装thinkcmf完成pathinfo模式&伪静态模式的nginx设置 8,安装phpmyadmin&ftp;服务

    7136 人正在学习 去看看 吴华

访问 ip/phpMyAdmin 空白页面,打开浏览器控制台,发现有一个请求 返回 500。

于是Linux终端 cat /var/log/httpd/error_log 查看错误日志发现如下错误

[Thu Mar 07 09:07:15.820868 2019] [:error] [pid 3964] [client 127.0.0.1:50324] PHP Fatal error: 
 Call to undefined function mb_detect_encoding() in /var/www/html/phpMyAdmin/libraries/php-gettext/gettext.inc
on line 177

百度之后发现原因是 php-mbstring 扩展没有安装,于是使用yum 安装,却出现以下情况:

没有可用软件包 php-mbstring。

最后解决方法:

从网上下载了一个 php-mbstring-5.4.16-36.el7_1.x86_64.rpm

https://download.csdn.net/download/cc1969281777/11003834

安装:

rpm -ivh --nodeps php-mbstring-5.4.16-36.el7_1.x86_64.rpm

然后重启httpd:

service httpd restart

再访问主页就出来了:

 

2010-12-20 14:00:00 wdbfz 阅读数 565
  • 阿里云ECS Linux服务器项目部署实战视频课程

    本套课程建立在阿里云linux(centos6.5) 具体内容如下: 1,购买云主机&安装上传工具 2,安装nginx 3,绑定域名(域名备案,虚拟主机绑定等) 4,安装mysql(设定开机启动,环境变量,更改连接密码等) 5,安装php 6,配置nginx识别php 7,安装thinkcmf完成pathinfo模式&伪静态模式的nginx设置 8,安装phpmyadmin&ftp;服务

    7136 人正在学习 去看看 吴华

Distrowatch.com

http://distrowatch.com/

在这里能找到最收欢迎的linux新闻。


The Linux Documentation Project

http://tldp.org/

这个网站包含很多入门资料,同时推荐Linux Gzette在线杂志,信息量丰富。


The Ubuntuforums

http://ubuntuforums.org/index.php

ubuntu用户专属论坛,包含了操作系统的各个方面,设置包括很多非技术内容,即使你不是ubuntu用户,在这里也能找到乐子。


The Gentoo Wiki

http://gentoo-wiki.com/Main_Page

gentoo Wiki,不单纯面对gentoo 用户,拥有很多入门知识和教程。



Linux Manpages

http://www.linuxmanpages.com/

不喜欢在终端看man帮助文档,在这里可以方面的查找搜索帮助,并且添加注释。

 

 

 

sourceForge

 

http://sourceforge.net/

 

 

 

linuxToday


http://www.linuxtoday.com/

2017-07-07 13:28:03 cyerogy 阅读数 13840
  • 阿里云ECS Linux服务器项目部署实战视频课程

    本套课程建立在阿里云linux(centos6.5) 具体内容如下: 1,购买云主机&安装上传工具 2,安装nginx 3,绑定域名(域名备案,虚拟主机绑定等) 4,安装mysql(设定开机启动,环境变量,更改连接密码等) 5,安装php 6,配置nginx识别php 7,安装thinkcmf完成pathinfo模式&伪静态模式的nginx设置 8,安装phpmyadmin&ftp;服务

    7136 人正在学习 去看看 吴华

新建一个php文件(test.php)

将下面的代码进行粘贴到新建的PHP文件中

<?php

shell_exec("unoconv -f pdf test.odt");

?>

(1)在终端中执行php test.php,此时生成了test.pdf文件

(2)在web端输入链接访问test.php,发现此时test.pdf文件没有生成。这时可以有80%怀疑权限问题(且php并没有报错)

(3)进入test.php所在的目录,

将下面的代码进行粘贴到test.php文件中

<?php

print_r(shell_exec("ls"));

?>

在web端使用链接进行访问,发现可以运行的,这时有基本可以确定是权限的问题了

(4)那么错误在什么地方可以看到呢,在终端下运行下面的命令

find / -name auth.log

比如 /var/log/auth.log

(5)打开 auth.log找出问题所在可以发现报错为:www-data:user not in sudoers;............改怎么改呢

(6)本人是在虚拟机中进行测试的,现在讲讲这个解决方法

在终端下运行su root输入密码,这时你会发现不管你怎么输入密码均是错误的,那该怎么解决呢,不要急,听我慢慢讲来

在终端下输入su passwd 这时会提醒你输入密码,随便输入一个密码如:123456,回车再次确认下密码;此时的root密码为123456了

在终端下输入su root,输入刚刚设置的密码,你会发现你进入了root权限了,这时在终端下运行chmod u+w /etc/sudoers,

在终端下输入vim /etc/sudoers,修改文件,将下面的话添加到文件中

www-data ALL=(ALL) NOPASSWD: ALL;这边为啥是NOPASSWD:因为,你没有给www-data设置密码啊

在终端下分别运行chmod u-w /etc/sudoers,exit

(7)这时你再次在web使用链接运行test.php文件

<?php

shell_exec("unoconv -f pdf test.odt");

?>

哈哈:文件出来了







2017-02-06 19:37:17 woshihaiyong168 阅读数 2027
  • 阿里云ECS Linux服务器项目部署实战视频课程

    本套课程建立在阿里云linux(centos6.5) 具体内容如下: 1,购买云主机&安装上传工具 2,安装nginx 3,绑定域名(域名备案,虚拟主机绑定等) 4,安装mysql(设定开机启动,环境变量,更改连接密码等) 5,安装php 6,配置nginx识别php 7,安装thinkcmf完成pathinfo模式&伪静态模式的nginx设置 8,安装phpmyadmin&ftp;服务

    7136 人正在学习 去看看 吴华

通过 php 利用 ssh2扩展操作 linux、mysql 


  1、首先安装扩展

   这里是centos中的php安装ssh2扩展,记得关闭selinux和firewalld

    yum install libssh2 libssh2-devel php-devel gcc-c++(make 需要)

   下载ssh2扩展,从http://pecl.php.net/package/ssh2,有linux扩展包,也有windows的dll,如果是php5安装ssh2-0.13或0.12扩展,php7安装1.0

   笔者 的php版本是5.6 安装的扩展是ssh2-0.13

 wget  https://pecl.php.net//get/ssh2-0.13.tgz
 tar -zvxf ssh2-0.13.tgz
 cd ssh2-0.13

 
 /usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config LIBS=-ldl

make && make install

vi /etc/php.ini  或者  vi /usr/local/php/etc/php.ini

加入extension=ssh2.so

重新启动php-fpm 和 nginx

killall php-fpm

service php-fpm start 

service nginx restart

查看phpinfo


 2、利用php ssh2 代码执行程序

  代码示例:

<?php
$connection = ssh2_connect('192.168.0.145', 22);
ssh2_auth_password($connection, 'username', 'password');
//执行linux 命令
$stream = ssh2_exec($connection, '/usr/local/bin/php -i');
stream_set_blocking( $stream, true );
echo (stream_get_contents($stream));

$stream = ssh2_exec($connection, 'ls');
stream_set_blocking( $stream, true );
echo (stream_get_contents($stream));

?>

  实例:

 

$connection = ssh2_connect('192.168.1.176', 22);
ssh2_auth_password($connection, 'root', 'rootroot');
$stream = ssh2_exec($connection, 'service mysql status');
stream_set_blocking( $stream, true );
$res = stream_get_contents($stream);
$res = trim(substr($res,strpos($res,'L')+1,strpos($res,"g")-3));

$connection = ssh2_connect('192.168.1.176', 22);
ssh2_auth_password($connection, 'root', 'rootroot');

$status = $_GET['status'];
 if($status==1){
        $stream = ssh2_exec($connection, 'service mysql stop');
        stream_set_blocking( $stream, true );
       $res = stream_get_contents($stream);
        echo $res;
 }else{
        $stream = ssh2_exec($connection, 'service mysql start');
        stream_set_blocking( $stream, true );
        $res=stream_get_contents($stream);
         echo $res;
 }


这里是密码类型登录,下面是另一种 秘钥类型登录

附录:linux ssh-keygen命令生成密钥:

其实,linux下的ssh-keygen下也可以生成密钥,在linux下输入ssh-keygen -t rsa,在提示下,输入密钥的名称(这里为key)和私钥加密密码,既完成密钥生成。生成的两个文件中,“key”为私钥,“key.pub”为公钥。如下图所示:

linux_make_public-key

cd ~/.ssh/   

清空 authorized_keys 的内容

将私钥 内容放入 authorized_keys  中

cat /mm/key.pub >> authorized_keys  


<?php
$connection = ssh2_connect('192.168.1.176', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file($connection, 'root',
    '/mm/key.pub',
    '/mm/key')) {
    echo "Public Key Authentication Successful";
} else {
    die('Public Key Authentication Failed');
}
?>

原理上是成功的 ,但是笔者测试了很多次都失败了  后来笔者又转战方法 使用xshell 来生成秘钥

ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法。

使用密钥登录分为3步:
1、生成密钥(公钥与私钥);
2、放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中;
3、配置ssh客户端使用密钥登录。

一、生成密钥公钥(Public key)与私钥(Private Key)

打开Xshell,在菜单栏点击“tools”,在弹出的菜单中选择“User Key Generation Wizard...”(密钥生成向导),如下图:

xshell_make_public-key-01

弹出“User Key Generation Wizard”对话框,在“Key Type”项选择“RSA”公钥加密算法,“Key Length”选择为“2048”位密钥长度,如下图:

xshell_make_public-key-02

点击“Next”,等待密钥生成:
xshell_make_public-key-03

继续下一步,在“Key Name”中输入Key的文件名称,我这里为“key”;在“Passphrase”处输入一个密码用于加密私钥,并再次输入密码确认,如下图: 这里密码可以不输入
xshell_make_public-key-04


点击“Next”,密钥生成完毕(Public key Format选择SSH2-OpenSSH格式),这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,如下图。这里点击Save as a file 保存的就是公钥匙     
xshell_make_public-key-05

点击“Save as file...”按钮,将公钥(Public key)保存到磁盘,文件名为“key.pub”,备用。

保存私钥

这里保存的才是私钥  将公私钥匙上传到 /usr/local/nginx/html/sshtest/

二、上传公钥(Public Key)到服务器:

使用到Xshell登录到服务器,进入到“/root/.ssh/”目录,运行rz命令(如果没有rz命令,运行yum install lrzsz安装),将key.pub发送到服务器,然后运行如下命令,将公钥(Public Key)导入到“authorized_keys”文件:

  这里可以直接使用上面的方法 不使用 rz (简单粗暴)

  1. [root@localhost ~]# cd /root/.ssh/
  2. [root@localhost .ssh]# rz
  3. rz waiting to receive.
  4. [root@localhost .ssh]# cat me.pub >> authorized_keys
  5. [root@localhost .ssh]# chmod 600 authorized_keys
  6. [root@localhost .ssh]# ls
  7. authorized_keys known_hosts me.pub
  8. [root@localhost .ssh]# cat authorized_keys
  9. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4VCOWFrARc1m3MfEAL50v2Z2siavO3Ijpr/LZ00EZah8EjfZhqjAc/agkljyXmNGpVDpRdtlYco8h3P5vegXOEgKcX74fDYm0vNdVABVD1XSD8ElNyLTCCNk7rZJbi3htJox3Q1n0vnMmB5d20d9occkAx4Ac94RWNS33EC5CszNTMgAIn+uZl0FlQklS1oSyWFahSTWyA6b33qG7Y5E4b6J/caObnPx6EgtBrgi97gXJHZWyYlGrpWmUuhPqs5XToRB08CVxAyzewtq1MXv0p+Po4L1pbHLRf+TSoZ5RSBZZjY4/JMAzdXHNtnAyO0j0VNGbBXKUcNSAHZ

xshell_public-key_login_upload

这时

<?php
$connection = ssh2_connect('192.168.1.176', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file($connection, 'root',
    '/usr/local/nginx/html/sshtest/id_rsa_1024.pub',
    '/usr/local/nginx/html/sshtest/id_rsa_1024')) {    //这里没有使用密码 如果使用密码  '/usr/local/nginx/html/sshtest/id_rsa_1024','密码')) {
    echo "Public Key Authentication Successful";
} else {
    die('Public Key Authentication Failed');
}
?>



秘钥连接成功! 时间原因 上面那种方法 没有发现是什么原因造成失败0.0!

相关链接:相关链接


 php中的ssh2模块学习 中有更详细的介绍。


不同服务器之间的ssh2文件的上传和下载  

ssh2封装类

文件上传和下载

没有更多推荐了,返回首页