【发布时间】: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() 访问。
-
天啊!远程登录?撇开安全问题不谈,这很可能会失败。服务器的大多数实现在提示输入用户名和密码之前清除输入缓冲区。