linux系统。
关键在于怎么解决权限问题。请各位大侠帮忙。以下是我写的一个程序。该程序在root命令行里通过:php ip.php 可以成功修改IP。但是在web界面上无法修改。因为这个没有解决权限问题。求更好的方法。
IP.php
<?php
//$rsl = shell_exec("ifconfig eth0 192.168.1.2 netmask 255.255.255.0"); //改ip和子网掩码的.
$file="/etc/sysconfig/network-scripts/ifcfg-eth0";
$tstr=file_get_contents($file);
//$content=str_replace("dhcp","static",$tstr);//fwrite($fp,$content);
//fclose($fp);$IP="192.168.1.192";//用户输入
if(!preg_match_all('/IPADDR=(\d{1,3}\.){3}(\d){1,3}/',$tstr,$match)){
//$fp=fopen($file,'w');
$fp=fopen($file,"r+");
fseek($fp,0,2);
$content1="IPADDR=".$IP;
fwrite($fp,$content1);
fclose($fp);
}else{
$fp=fopen($file,"r");
$content1=fread($fp,filesize($file)-strlen($match[0][0])-1);
fclose($fp);
$fp=fopen($file,"w");
fseek($fp,-sizeof($match[0][0]),2);
$content2=$content1."\n".preg_replace('/(\d{1,3}\.){3}(\d){1,3}/',$IP,$match[0][0]);
//$fp=fopen($file,'w');
fwrite($fp,$content2);
fclose($fp);
};[code=PHP]
echo "ok";//fopen(" /etc/sysconfig/network-scripts/ifcfg-eth0","r+");
//echo $rsl."\n";//看看返回的结果.
?>[/code]
关键在于怎么解决权限问题。请各位大侠帮忙。以下是我写的一个程序。该程序在root命令行里通过:php ip.php 可以成功修改IP。但是在web界面上无法修改。因为这个没有解决权限问题。求更好的方法。
IP.php
<?php
//$rsl = shell_exec("ifconfig eth0 192.168.1.2 netmask 255.255.255.0"); //改ip和子网掩码的.
$file="/etc/sysconfig/network-scripts/ifcfg-eth0";
$tstr=file_get_contents($file);
//$content=str_replace("dhcp","static",$tstr);//fwrite($fp,$content);
//fclose($fp);$IP="192.168.1.192";//用户输入
if(!preg_match_all('/IPADDR=(\d{1,3}\.){3}(\d){1,3}/',$tstr,$match)){
//$fp=fopen($file,'w');
$fp=fopen($file,"r+");
fseek($fp,0,2);
$content1="IPADDR=".$IP;
fwrite($fp,$content1);
fclose($fp);
}else{
$fp=fopen($file,"r");
$content1=fread($fp,filesize($file)-strlen($match[0][0])-1);
fclose($fp);
$fp=fopen($file,"w");
fseek($fp,-sizeof($match[0][0]),2);
$content2=$content1."\n".preg_replace('/(\d{1,3}\.){3}(\d){1,3}/',$IP,$match[0][0]);
//$fp=fopen($file,'w');
fwrite($fp,$content2);
fclose($fp);
};[code=PHP]
echo "ok";//fopen(" /etc/sysconfig/network-scripts/ifcfg-eth0","r+");
//echo $rsl."\n";//看看返回的结果.
?>[/code]
像newnew说的
写成shell 然后php再调用这个shell.
这个文件的权限不能提高一下吗?
这个我在手册里看过,PHP好像只能调用SHELL
chmod ug+s filename
要修改的文件ifcfg-eth0的权限是rw-------,即便是跟脚本加了s权限,还是不能修改ifcfg-eth0。
我的系统是虚拟机实现的,而运行PHP的是外部浏览器。。是不是因为这个原因如果说连接到主机的每个用户都可以通过这种方式改IP,岂不是很危险。。
我的系统是虚拟机实现的,而运行PHP的是外部浏览器
。。估计你还是没有理解权限系统权限 :--- --- ---
第一段三个位是设置文档所有者的权限第二个三位是设置同组用户的权限第三个三位是设置其他用户的权限。你只给了用户所有者权限,浏览器(other用户)怎么能执行你的文件呢?
ls -l 你的脚本看一下运行php的不是浏览器,是服务器你收到浏览器的请求当然要判断,怎么可能让谁都可以改
说白了,我就是想给web用户提权。这点shell脚本做不到,而C语言可以做到,参见:
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2010/1222/7104.html
为什么shell脚本做不到,参见:
http://blog.sina.com.cn/s/blog_6987df7e0100u05j.html
既然是要修改的文件,那怎么没给写权限?
服务器应该是属于其他用户列的
你起码要给rw_r_ _ r_x
嘿嘿,姐姐,我传下解决办法,你看哈
写一c文件,命名为IPT.cint 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("php IP.php"); //IP.php代码见原帖
return 0;
} 编译该文件 gcc -o ipt -Wall IPT.c
接下来要做的是加s权限:chmod u+s ./ipt 写PHP调用ipt<?php
system('/var/www/html/ipt', $retval);
echo $retval;
?>
运行。
vi /etc/sysconfig/network-scripts/ifcfg-eth0
可看到IP修改成功