【问题标题】:PHP Share fsockopen between functions on pagePHP 在页面上的函数之间共享 fsockopen
【发布时间】:2016-07-10 12:26:23
【问题描述】:

是否可以用一个函数打开一个套接字并用另一个函数向该套接字发送命令?

当我尝试这个时,我得到: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);
}

知道如何让它工作吗? 谢谢

【问题讨论】:

  • 这里的直接原因是在connect() 内部你确实$fp 声明为全局,因此当你离开函数时它被视为本地并丢失。
  • 但是无论如何使用global 语句确实是一种糟糕的风格,你应该重写你的代码以避免它。通常,实现一个将文件句柄作为属性保存的类。这样类的所有方法都可以访问它,尽管它不是全局的,只是因为所有方法都在从该类实例化的同一个对象上操作。
  • 根据您的代码,您应该在 connect() 方法的开头将 $fp 声明为全局,以便可以从 cmd() 访问。
  • 天啊!远程登录?撇开安全问题不谈,这很可能会失败。服务器的大多数实现在提示输入用户名和密码之前清除输入缓冲区。

标签: php function fsockopen


【解决方案1】:

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

这是一种方法

$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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多