2011-09-29 147 views
0

首先我显示了PHP代码....浏览器无法打开php页面?

<?php 

echo ("hello"); 

echo exec("sendip -v -p ipv6 -6s 2001::100 -p tcp -ts 21 -td 21 2001::200 2> 
&1"); 

echo ("hi"); 

?> 

当我通过Linux命令行输入的命令,它正在罚款。命令是在2001年发送TCP IPv6报文:: 200机从2001 :: 100。

[[email protected]]# sendip -v -p ipv6 -6s 2001::100 -p tcp -ts 21 
-td 21 2001::200 > /dev/null & 

/* (-v for verbose) */  

输出上面的命令......

Added 34 options 
Initializing module ipv6 
Initializing module tcp 
Finalizing module tcp 
Finalizing module ipv6 
Final packet data: 
60 00 00 00 `... 
/* 

    here other packet 
    contents gets printed 

    */ 

7D 62 00 00 }b.. 
61 62 63 64 abcd 
Sent 64 bytes to 2001::200 
Freeing module ipv6 
Freeing module tcp 

当我通过命令行执行PHP脚本...

[[email protected]]# php test.php 
Freeing module tcp 

hellohi获取打印和数据包到达2001 :: 200。

但是当我尝试通过浏览器来运行PHP脚本出现问题...

http:://localhost/test.php 

hellohi被打印,但数据包没有在其他机器到达。

sh: sendip: command not found 

此外,在这两种情况下,数据包的内容不会在终端印刷使用虽然详细选项而是直接使用命令时详细选项工作正常。

我有很多事情尝试,虽然我不认为他们会帮助像......

  1. 我加在/ usr/local/lib目录和USR/local/bin目录到PATH变量,但没有效益。

  2. chmod + s/usr/local/bin/sendip.Sticky位已设置,但再次没有好处。

  3. 将/ usr/local/bin/sendip自身粘贴到/ var/www/html文件夹中虽然我改变了PATH变量,但是正如我所说的,我只是使用了命中n试验没有线索.....

有一些输出的快照可以进一步帮助....

[[email protected] html]# echo $PATH 
/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin: 
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: 
/usr/X11R6/bin:/root/bin:/usr/local/lib 

[[email protected] html]# locate sendip 
..... 
/usr/local/bin/sendip 
/usr/local/lib/sendip 
..... 

[[email protected] bin]# chmod +s sendip 
[[email protected] bin]# ls -l sendip 
-rwsrwsrwx 1 apache apache 41071 Sep 26 19:41 sendip 

[[email protected] bin]# cd /usr/local/lib/ 
[[email protected] lib]# ls -ld sendip 
drwxrwxrwx 2 root root 4096 Sep 28 22:48 sendip 
[[email protected] lib]# chmod +s sendip 
[[email protected] lib]# ls -ld sendip 
drwsrwsrwx 2 root root 4096 Sep 28 22:48 sendip 

当文件内容发生了变化.......

<?php 
echo exec("/usr/bin/sendip ........ 2 > &1"); 
?> 

然后oputput是:

[[email protected] html]# php test.php 
Freeing module tcp[[email protected] html]# 

在浏览器.... 没有错误被打印,但仍包没有到达。

我被困在between.Please建议我什么,否则我就应该努力??????/

+0

exec(...)返回什么?你可以尝试system()来获得更多的输出。 –

+0

正如您所怀疑的,最有可能是权限问题。 – Brad

+0

@Brad我也试过这个命令....'chown apache:apache test.php'但是没有好处again.If烫发问题,然后请建议我,我应该怎么做? –

回答

1

sendip()在被PHP调用的shell的路径中吗?你不检查错误条件,所以可能你实际上并没有执行sendip,只是得到一个“没有这样的程序或文件”类型的错误。

不是重定向的EXEC()'d命令的输出为空的,这一切都重定向到浏览器,所以你可以看看会发生什么:

echo exec("sendiip yada yada yada 2>&1"); 
+0

sendip的输出应该出现在其他机器上,而不是浏览器...如果我不会重定向命令输出,即使它会工作.'php test.php'能够在其他m/c上发送数据包,当我不使用任何重定向操作符 –

+0

是的,但是如果sendip永远不会被调用(例如:它不在PHP shell的路径中),那么exec命令将输出通常的“no such file”错误,该错误不会被捕获到PHP中。这仅用于调试目的。请记住,在命令行上直接运行命令与在Web服务器下运行时相同的脚本是完全不同的环境。 –

+0

设置PHP PATH与设置shell PATH不同。我使用了'PATH = $ PATH:/ usr/lib'。我是否需要为PHP PATH做其他事情? sendip位于'/ usr/lib/sendip'中。而你告诉我的这一个,我会尽力...建议。 –

0

尝试使用完整的路径:

exec("/usr/lib/sendip -v -p ipv6 -6s 2001::100 -p tcp -ts 21 -td 21 2001::200 > /dev/null &"); 
0

服务器是最有可能没有运行与用户具有相同的权限,您正在测试。

服务器很可能会丢弃任何PATH变量。确保您在exec调用中指定了sendip的完整路径。

0

虽然我不能说其完全解决了这个问题就解决了但根据我的需要它的工作。

我所做的是我重新安装了sendip,然后设置了它的粘性位,然后我设置Path变量为上面提到的问题。

实际上该工具默认安装在/usr/local/lib/sendip文件夹中的库和/usr/local/bin文件夹中的sendip。

虽然设置PATH变量后,我仍然需要使用完整路径在PHP脚本

/usr/local/bin/sendip -v .....

(我的一个朋友建议我这个..)

我觉得是PHP路径与Shell PATH不同,我需要将sendip粘贴到/usr/bin,然后在设置它的粘性位之前,我需要运行updatedb,如果我不想提及PHP脚本中的完整路径。现在这个命令在PHP脚本中可以正常工作。
sendip -v .........

虽然可能是我错了,但这一切都适合我。