<?
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 verygood。仅供参考 
*/
$sucommand = "su --login root --command"; 
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s \"%s %s\"",$sucommand,$useradd,$user); 
$fp = @popen($user_add,"w"); 
@fputs($fp,$rootpasswd); 
@pclose($fp); 
?> 
请问:一通过上述程序可以简单实现PHP转换ROOT身份 从而执行ROOT命令我的上个系统可以实现 但是工作需要 现在换了RHEL5 就不行了提示错误为:standard in must be a tty是不是因为安装过程中缺少什么东西导致上述问题的出现?看见有人设置php.ini里 关于tty不需要密码 从而解决 但是 我需要和SHELL多次进行数据交互请问应该是哪里的问题呢?GOOGLE的要吐血了也没找到满意的答案 请达人指导请问:二如果实现了上述功能 即不再出现standard in must be a tty错误 可以正常输入passwd转换身份 那么能不能实现@fputs($fp,$rootpasswd); 的连续调用 以传递给shell连续的信息?如果不能 应该采用别的哪种方法 使PHP端可以和SHELL进行多次连续的数据交互?

解决方案 »

  1.   

    难道没人用PHP和shell交互过数据吗?
      

  2.   

    可以这么做1. 写一个C程序,通过命令行参数知道要执行的任务,然后执行。
    2. 把这个C程序设置成root用户,root组,并且setuid,并且设置所有人可执行。
    3. 把这个程序放入到执行php的uid可以访问但是其它uid用户无法访问的目录。当你执行这个C程序的时候,它是root权限的。
    用pipe的方式,不方便,发行版可能修改程序,禁止非终端用户使用这个命令。
    但是setuid方式,是不会被禁止的。此外,只有二进制程序可以setuid为root获得root权限,脚本不行
      

  3.   


    这样是可以 但是 可是管道麻烦 不如能解决standard in must be a tty 这个问题来的快谁知道怎么搞standard in must be a tty 这个问题呢?各种迷糊中~还是要感谢楼上热心 万不得已了 再写C的吧
      

  4.   


    这个得下载你那个linux版本相应的su的源码,一般在coreutils包中,
    看看源码是否调用的getpass获取的密码,getpass是可以从stdin读的,
    但是也有可能是修改过的su,禁止从tty以外的地方读取,为的是安全性我看了debian发行版的su源码,可以从管道读