2016-03-23 104 views
2

是否有可能打开一个功能的套接字并使用另一个功能发送命令到该套接字都来自同一页?PHP分享功能之间的fsockopen页

当我尝试这样我得到:Warning: fputs(): supplied argument is not a valid stream resource

这是我使用

connect(); 
cmd("cd /home/tom\n ls\n"); 
close(); 

function connect() { 
    global $passwd; 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function cmd ($cmd) { 
    global $fp; 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close() { 
    global $fp; 
    fclose($fp); 
} 

任何想法如何得到这个工作的代码? 谢谢

+0

这里的直接原因是内部连接'()'你_not_声明'$ fp'全球,因此它被视为本地和丢失你放弃了这个功能。 – arkascha

+1

无论如何,使用'global'语句是非常糟糕的风格,你应该重写你的代码以避免它。通常一个实现了一个将文件句柄作为属性的类。这样,类的所有方法都可以访问它,尽管它不是全局的,因为所有的方法都是在从类中实例化的同一个对象上操作的。 – arkascha

+0

根据你的代码,你应该在connect()方法开始时声明$ fp为global,以便从cmd()访问。 OMG! –

回答

0

您需要全局存储指针或通过引用传递它。

这里是一个办法做到这一点

$fp = connect($passwd); 
cmd($fp, "cd /home/tom\n ls\n"); 
close($fp); 

function connect ($passwd) { 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 

    return $fp; 
} 

function cmd ($fp, $cmd) { 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close ($fp) { 
    fclose($fp); 
} 

我不知道在这段代码的生活环境,所以很难暗示不同的或更好的战术。我可能会做它是面向对象的我自己,像这样:

$command = new Command($passwd); 
if($command->connect()){ 
    $res = $command->cmd("cd /home/tom\n ls\n"); 
    // Use $result of cmd() here 

    $command->close(); // close when done 
} 

class Command { 

    private $fp; 
    private $passwd; 

    public function __construct($passwd) { 
     $this->passwd = $passwd; 
    } 

    public function connect() { 
     if (!$p = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
      return false; // Or throw an exception 
     } 
     stream_set_timeout($fp, 1); 

     fputs($fp, "tom\n"); sleep(1); 
     fputs($fp, "$passwd\n"); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     $this->fp = $fp; 
     return true; // Or $res if you want to use it somewhere else 
    } 

    function cmd ($cmd) { 
     $fp = $this->fp; 

     fputs($fp, $cmd); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     return $res; // if you want to use it else where 
    } 

    function close() { 
     fclose($this->fp); 
    } 
}