让PHP以ROOT权限执行系统命令的方法

原文地址:http://www.jb51.net/article/26232.htm

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考。
其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑,
使得这个问题解决起来麻烦了好多。先来看一个网友使用popen()函数的例子。

复制代码代码如下:
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 louis。仅供参考
*/
$sucommand = “su root –command”;
$useradd = “/scripts/demo/runscripts.php”;
$rootpasswd = “louis”;
$user = “james”;
$user_add = sprintf(“%s %s”,$sucommand,$useradd);
$fp = @popen($user_add,”w”);
@fputs($fp,$rootpasswd);
@pclose($fp);

经过自己的测试,证实此段代码是不能实现(至少在我的系统里是这样的)作者想要获得的结果的。经过自己很长时间的google之后,
问题的关键是su root这个命令需要的密码必须以终端的方式输入,不能通过其它的方式(我也不知道还有没有其它的方式)获得。
又由于项目要求不能使用类似于sudo这种应用,无奈之下,我选择了网友提出的用编写C程序的方法来解决此问题。
首先写个C程序,命名为:run.c 放在目录/scripts/demo/下

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //变量暂时未使用
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/scripts/demo/runscripts.php”); //执行脚本
return 0;
}

编译该文件:
gcc -o run -Wall run.c
在该路径下生成run文件,这个可执行文件。如果现在用PHP脚本调用 该run的话,即使setreuid了 也是不行的。
接下来要做的是:给run赋予suid权限
# chmod u+s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好了,已经设置上了,再写一个php页面调用它。

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/scripts/demo/run’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0
该命令执行成功。
从显示结果可以看出: apache(daemon)的uid 为48(事实上很多linux系统下daemon的uid为2)。
调用setreuid后将有效用户id和实际用户id互换了。(必须在chmod u+s生效的情况下) 使apache当前的uid为0这样就能执行root命令了。
只需要更改 C文件中的system所要执行的命令就可以实现自己的PHP以root角色执行命令了。

在玩C 以前 玩过一段时间的PHP, 哪个时候需要用PHP 来运行root命令,一直未果,直到有一天搜索到了super这个插件.
随着玩C的日子多了.发现可以用C语言来包裹 要运行的外部命令. 实验了一下.成功了.
不需要任何外部工具就可以实现用PHP 执行root命令.
我下面就把方法发布给大家,有需求用php来运行root命令的朋友可以不用发愁了.
平台:Linux. 实验命令iptables 当前的目录是/var/www/html/http
写程序的时候 用root用户
大家都知道iptables 非root用户不能运行.
首先写个C程序
命名为:ipt.c

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/sbin/iptables -L”); //执行iptables -L命令
return 0;
}

编译该文件 gcc -o ipt -Wall ipt.c
在该路径下生成ipt 这个可执行文件.
如果现在用PHP网页调用 该ipt的话,即使setreuid了 也是不行的.
接下来要做的是chmod u+s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位已经设置上了.
再写一个php页面调用它.

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/var/www/html/http/ipt’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览.

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0

该命令执行成功..
众所周知: apache的uid 为48. 调用setreuid后 将有效用户id 和实际用户id互换了.(必须在chmod u+s生效的情况下) 使apache当前的 uid为0 这样就能执行root命令了。

大家只需要更改 C文件中的 system所要执行的命令就可以实现自己的PHP执行root命令了.

linux下使用crontab定时备份MYSQL数据库的方法

原文地址:http://my.oschina.net/u/919074/blog/223920

只需按照下面3步做,一切都在你的掌控之下:

第一步:在服务器上配置备份目录代码:

——————————————————————————–

mkdir /var/lib/mysqlbackup

cd /var/lib/mysqlbackup

——————————————————————————–

第二步:编写备份脚本代码:

——————————————————————————–

vi dbbackup.sh

——————————————————————————–

粘帖以下代码,务必更改其中的username,password和dbname。

代码:

——————————————————————————–

#!/bin/sh

mysqldump -uuser -ppassword dbname | gzip > /var/lib/mysqlbackup/dbname`date +%Y-%m-%d_%H%M%S`.sql.gz

cd  /var/lib/mysqlbackup

rm -rf `find . -name ‘*.sql.gz’ -mtime 10`  #删除10天前的备份文件

——————————————————————————–

第三步:更改备份脚本权限

代码:

——————————————————————————–

chmod +x dbbackup.sh

——————————————————————————–

第四步:用crontab定时执行备份脚本代码:

——————————————————————————–

crontab -e

——————————————————————————–

若每天晚上21点00备份,添加如下代码,

代码:

——————————————————————————–

00 21 * * * /var/lib/mysqlbackup/dbbackup.sh

注:

1、任务调度设置文件的写法
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件
具体格式如下:
Minute Hour Day Month Dayofweek   command
分钟     小时   天     月       天每星期       命令
每个字段代表的含义如下:
Minute             每个小时的第几分钟执行该任务
Hour               每天的第几个小时执行该任务
Day                 每月的第几天执行该任务
Month             每年的第几个月执行该任务
DayOfWeek     每周的第几天执行该任务
Command       指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选

字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
举例如下:
5       *       *           *     *     ls             指定每小时的第5分钟执行一次ls命令
30     5       *           *     *     ls             指定每天的 5:30 执行ls命令
30     7       8         *     *     ls             指定每月8号的7:30分执行ls命令
30     5       8         6     *     ls             指定每年的6月8日5:30执行ls命令
30     6       *           *     0     ls             指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,

以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30     3     10,20     *     *     ls     每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]

25     8-11 *           *     *     ls       每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]

*/15   *       *           *     *     ls         每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]

30   6     */10         *     *     ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件

50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]

2、新增调度任务可用两种方法:
1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。

CentOS中禁止用户ssh和sftp登陆

在linux中出于安全的需要,我们会禁止某些用户SSH登陆系统进行操作。我这里以centos操作系统为例记录下如何进行处理。

1、打开sshd的配置文件

  1. vi/etc/ssh/sshd_config

2、修改该配置文件,增加或修改如下行

  1. # 禁止用户user1登陆,多个空格分隔
  2. DenyUsers user1
  3. # 禁止用户组group1的所有用户登录,多个空格分隔
  4. DenyGroups group1

3、保存配置后,重启sshd

  1. /etc/rc.d/init.d/sshd restart

完成上面的配置后,就可以禁止用户或用户组的用户进行登录了,第2步中的两个是可以只填一个的,可以根据需要进行调整。配置完毕后,在其他linux机器上使用如下命令进行测试:

  1. # 使用ssh测试
  2. [root@ServerA ~]# ssh user1@192.168.1.168
  3. user1@192.168.1.168’s password:
  4. Permission denied, please try again.
  5. # 使用sftp测试
  6. [root@ServerA ~]# sftp user1@192.168.1.168
  7. user1@192.168.1.168’s password:
  8. Permission denied, please try again.

可以看到,确实被系统禁止了,从而也就完成了我们想要的控制了。但这个有一个缺陷是,无法禁止只允许sftp而不允许ssh,如果要这样做,估计只能够单独搭建ftp服务器,比如vsftp,后续再考虑这个。

给VSFTP增加用户,只能访问指定目录

1 增加组 groupadd ftpgroup
2 修改/etc/vsftpd/vsftpd.conf
将底下三行
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
改为
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
3 增加用户 useradd -g ftpgroup -d /var/ftp/pub/ftpuser_file  -M ftpuser
4 设置用户口令 passwd ftpuser
5 编辑文件: /etc/vsftpd/chroot_list
内容为ftp用户名,每个用户占一行,如:
peter
john
6 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart

无法查看目录,提示:vsftpd Transfer done (but failed to open directory)

系统是CentOS,是RH派系的。把vsftpd安装配置好了,以为大功告成,但客户端访问提示如下错误:
vsftpd Transfer done (but failed to open directory)
原因是CentOS系统安装了SELinux,因为默认下是没有开启FTP的支持,所以访问时都被阻止了。
//首先查看SELinux设置
# getsebool -a|grep ftp
发现ftpd_disable_trans –> off 或者 ftp_home_dir–>off

解决方法:
//使用setsebool命令开启
# setsebool ftpd_disable_trans 1
或者
# setsebool ftp_home_dir 1
再次查看当前状态是否是on的状态
# getsebool -a|grep ftp
ftpd_disable_trans –> on
或者
ftp_home_dir–>on

//setsebool使用-P参数,无需每次开机都输入这个命令
# setsebool -P ftpd_disable_trans 1
或者
# setsebool -P ftp_home_dir 1
# service vsftpd restart

CentOS/Linux安装配置ftp服务器

1.安装vsftp
# yum -y install vsftpd
2.启动vsftp
# service vsftpd start
3.安装ftp客户端
# yum install –y ftp
4.测试连接ftp
# ftp localhost
5.输入用户名密码

默认用户名、密码均为ftp

6. 添加ftp用户
# useradd -G ftp -d /目录名 -M 用户名
# passwd 用户名
# chown 用户名.ftp /目录名 -R
# chmod 750 /目录名 -R

7.测试用新添加的用户名连接ftp,至此成功。

若在此发生无法列出目录的错误,请参考本博客的另外一篇文章:http://renrenstudy.com/linux/centos-vsftpd-selinux/

笔者在测试上传功能时,老是报出错误:vsftpd 553 Could not create file。后来,发现是由于ftp下的命令与linux终端稍有不同。

put /root/Downloads/team.zip ./

上面这句代码在linux终端下表示将team.zip上传至当前目录,但在ftp命令行状态下是不行的。正确方法应如下:

put /root/Downloads/team.zip team.zip

也就是,必须指定目标文件名,而不是指定目标目录。

Linux服务器:将文件拷贝到网站目录下无权限访问的问题

网上下载了一张图片,将其放在网站图片目录下,通过浏览器访问,提示:

You don’t have permission to access /images/design.png on this server.

起初,以为是Apache的mime映射未配置,但修改后仍然没有权限访问。

后来,终于找到解决办法:找到该文件,然后:

Properties — Permissions — SELinux Context需要设置为Read from all httpd scripts and the daemon

 

CentOS 6.4安装chrome

原文地址:http://www.cnblogs.com/VincentHome/archive/2013/05/19/3086438.html

CentOS 6.4安装chrome浏览器
vim /etc/yum.repos.d/CentOS-Base.repo
根据你的系统增加一个节点
32-bit

[google]
name=Google - i386
baseurl=http://dl.google.com/linux/rpm/stable/i386
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

64-bit

[google64]
name=Google - x86_64
baseurl=http://dl.google.com/linux/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

安装稳定版本: yum install google-chrome-stable
安装测试版本:yum install google-chrome-beta
安装不稳定版本:yum install google-chrome-beta

经过实验,发现上述方法在CentOS最新版本下无法使用,原因是C++库的版本问题。

于是,参考以下文章,安装Chrome的开源版本Chromium:

http://linux.cn/thread/10943/1/1/

是的,之前Google就说了,由于CentOS/RHEL 6已经是过期的系统,所以不再会有Chrome了。虽然后来由于引起了社区的抗议,从而改口,不再提CentOS/RHEL 6是过期系统了;但是,目前在CentOS/RHEL 6上已经没有Chrome可以下载使用了。

其实,根本的原因不是CentOS/RHEL 6有多老,连Windows XP和停止更新的Ubuntu 10.04都能继续使用Chrome呢。实际的原因是,Chrome由于种种考虑,使用了CentOS/RHEL 6中所不支持的C++ 11,所以才不能继续更新CentOS/RHEL 6上的Chrome。

那么,如果希望在CentOS/RHEL 7出来之前继续使用Chrome怎么办?使用Chrome的开源版本:Chromium。

1、切换到root:

su – 或者 sudo -i

2、下载新的软件源定义:

cd /etc/yum.repos.d

wget http://people.centos.org/hughesjr/chromium/6/chromium-el6.repo

3、安装Chromium:

yum install chromium

这样就安装完成了。可以通过菜单来启动浏览器。

如果是以root用户身份打开,会报错,提示如下:

Please start Google Chrome as a normal user. To run as root, you must specify an alternateuser-data-dir for storage of profile information.

按以下步骤即可解决此问题。

# yum install hexedit

# cp /opt/chromium/chrome /root

# cd /root

# hexedit chrome

运行完上步后,会显示十六进文件,此时按Tab键,再按Ctrl+s搜索geteuid,找到后,直接输入getppid,将会覆盖掉geteuid,最后按Ctrl+x保存。

# mv /root/chrome /opt/chromium/

提示是否覆盖文件,覆盖即可。此时即可以root身份正常打开Chromium了。

如果需要查看Flash和PDF,可以继续下面两步来安装插件。

4、安装Pepper Flash插件:

4.1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_pepperflash_copy.sh

4.2、设置 chrome_pepperflash_copy.sh 为可执行:

chmod +x chrome_pepperflash_copy.sh

4.3、 执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_pepperflash_copy.sh

安装后,如果需要通过命令行方式启动(带有Flash支持),可以输入以下命令:

/opt/chromium/chrome-wrapper %U –ppapi-flash-path=/opt/chromium/PepperFlash/libpepflashplayer.so –ppapi-flash-version=$(grep ‘”version”:’ /opt/chromium/PepperFlash/manifest.json | grep -Po ‘(?<=version”: “)(?:\d|\.)*’)

也可以修改系统菜单中的对应命令。

5、安装Google Chrome PDF Viewer插件:

5.1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_libpdf_copy.sh

5.2、设置 chrome_libpdf_copy.sh 为可执行:

chmod +x chrome_libpdf_copy.sh

5.3、执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_libpdf_copy.sh

 

参考资料:http://www.if-not-true-then-false.com/2013/install-chromium-on-centos-red-hat-rhel/

本文地址:http://linux.cn/thread/10943/1/1/