2016-03-23 40 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); 
    } 
}