Posts tagged tip

在 Bluehost 主机上修改时区

0

Bluehost 主机上用 Serendipity 做 Blog,一切都很满意,就是时区的问题。虽然 configure 里面能够设置时区偏移量,但是 RSS 输出后都是 GMT 时间,但是大部分 RSS Reader 都没有做过设置,一个朋友就经常看见我写的 Blog 在未来发表的!

修改时区最好的方法就是修改 php.ini 里面的 date.timezone 属性就可以了,这样可以不修改任何程序。但是只支持 PHP5 或者更高版本,现在我的主机用的 PHP 版本是 4.4.4,不能用。当然也不能用 date_timezone_set() 这样的函数了。

不过发现一个也不算麻烦的方法。代码如下:putenv("TZ=PRC");

putenv() 函数用得不多,所以开始也没有考虑到。不过官方的手册里面居然没有找到都能设置什么环境变量,只有其他的相关函数里面零星的介绍。

该死的 Updater5 文件夹

1

最近新装了机器的操作系统,发现我的文档下面总有一个该死的 Updater5 文件夹,没有任何文件,也没有任何进程使用,删除了下次还出现,甚为烦恼。

今日 Google 之,发现是新安装的 Adobe Reader 8 用来存放升级文件的目录。

删除办法如下:

  1. 启动 Adobe Reader 8;
  2. 从 Help 菜单中选择 Check for Updates;
  3. 在 Adobe Updater 屏幕,选择 Preferences;
  4. 在 File Location 面板里面,把 download location 换个地方,我选择了 Windows 的临时文件夹。

NND, Adobe 这么大一个公司,居然能做出这么狗屎的功能。你给我升级,很好,但是别告诉我细节,我是用户,不是开发者。而且,人家 Windows 好好的临时文件夹不用,非要自作多情的在我的文档里面建一个文件夹。真把自己当棵葱了。

PS:好久没有关注 Reader 的动态,突然从 6 跳到 8,界面还不错,蛮好看的。启动速度也不错了,呵呵,赞一个。

PS2:现在居然对新软件都没有任何兴趣了,看来真的老了。

PS3:参考页面:http://lists.techwr-l.com/pipermail/techwr-l/2007-January/013203.html

[LAMP] 页面以及显示 traceroute 的结果

0

今天遇到的一个问题,要求在一个页面中实时的显示 traceroute 的结果,因为这个一般会比较长时间运行,所以要求立即显示,这样就需要对输出进行控制。

第一次想的是,用一个隐藏 iframe,然后 iframe 定时刷新,取出数据来。这样的问题是不知道什么时候结束,就会一直刷新下去,直到用户点击另一个页面。

然后改用输出控制,首先使用 flush(),但是没有任何效果。后改用 ob_ 这一些系列函数。达到了我要的效果。

程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
    <head>
        <title>Traceroute</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <td>Traceroute</td>
                <td><span id="result"></span></td>
            </tr>
        </table>
    </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    ob_implicit_flush ();
    $cmd = "traceroute www.google.com";
    $fd = popen($cmd, "r");
    $result = "";
    if ($fd) {
        while ($buffer = fgets($fd, 4)) {
            $result .= $buffer;
            ob_start("test");
            echo "<script> result.innerHTML = \"" . str_replace("\n", "", nl2br(htmlspecialchars($result))) . "\";</script>\n";
            ob_flush();
        }
    }
    pclose($fd);
?>

[LAMP] 让 PHP 执行 root 权限的指令

0

今天下午 Mito 在 QQ上问我如何用 PHP 执行系统指令,还要 root 权限,原来是他们老板要管理员通过 Web 修改系统时间日期……无语中,这个要求真 TMD 变态。

不过这个问题我也不会,测试一下重定向和管道技术把密码发给 su 指令,提示信息是:

1
su: must be run from a terminal

不过想想也是正常,安全问题嘛,小心为好。不过还是不死心,搜索了一下解决方法。

其中让 PHP 执行系统命令有以下几种方法:

  1. string system (string command [, int return_var]);
  2. string exec (string command [, string array [, int return_var]]);
    (以上两个傻子都知道)
  3. void passthru (string command [, int return_var]);

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

    实例:

    1
    2
    3
    4
    <?php
        header("Content-type: image/gif");
        passthru("./ppmtogif hunte.ppm");
    ?>
  4. 用“`”符号,这个……估计呆子也能知道,居然那个网站还觉得是秘籍……汗ing

最重要的,也是解决 root 权限的方法,就是使用 popen() 函数打开进程。

原网站上说明如下:上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加 Linux 的系统用户时,要调用 su 来把当前用户换到 root 才行,而 su 命令必须要在命令行上输入 root 的密码。这种情况下,用上面提到的方法显然是不行的。popen() 函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在 PHP3 中,对这种句柄只能做单一的操作模式,要么写,要么读;从 PHP4 开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用 pclose() 函数来关闭它。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    /* 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);
?>
Go to Top