注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 《掌控Windows SErver 2..
 帮助
2009-05-03 10:46:41
【小蜗牛嗷嗷之作
 
    需要事先在MySQL建立好数据库,存储有相关的用户信息,这个工作很简单,所以我的代码也没必要面面具到,只是大概说一下自己的登陆方法就可以。如果觉得我PHP菜鸟,请不要笑,我至今都还没有看过一点关于PHP的书籍呢!用都是最简单的语法,跟C一样,如果哪方面不懂就baidu一下就OK了。login.php里有完整的html代码,我当时设置了两种颜色的登陆界面,通过点击页面的某个地方就提交切换颜色,我这里的颜色切换还是用到php来判断输出颜色的(当然也可以用javascript来实现)。
 
////////////// login.php
 
<?
include("./config.php");
if ($_POST['login']) {
    /* 默认登陆失败 */
    $login_status = "Failure";
    $login_name = $_POST['login_name'];
    $login_pass = $_POST['login_pass'];
    $md5_pass = md5($login_pass);
    /* 从数据库中获取用户信息做对比 */
    $query = "select utype, realname from users where username='$login_name' and password='$md5_pass'";
    if ($result = mysqli_query($link, $query)) {
        if ($row = mysqli_fetch_row($result)) {
            $login_status = "Success";
            $utype = $row[0];
            $realname = $row[1];
            if ($realname == "") {
                $realname = $login_name;
            }
        } else {
            if ($thisStyle) {
                $error_message = "密码错误,请重新输入!";
            } else {
                $error_message = "用户名或密码错误,请重新输入!";
            }
        }
        mysqli_free_result($result);
    } else {
        $error_message = "未知错误!请通知系统管理员!";
    }
    /* 记录登陆日志 */
    $client_ip = get_client_ip();
    $query="insert into login_logs (login_name, login_time, login_status, client_ip) values('$login_name', now(), '$login_status', '$client_ip')";
    $result = mysqli_query($link, $query);
    if (!$result) {
        printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
        exit();
    }
    mysqli_close($link);
    /* Let me go or not? */
    if ($login_status == "Success") {
        /* 验证成功,开启Session */
        session_start();
        $_SESSION['utype']    = $utype;
        $_SESSION['username'] = $login_name;
        $_SESSION['realname'] = $realname;
        /* 跳转到 main.php */
        echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=main.php\">";
        exit();
    }
}
?>
<html>
<head>
<title>登陆首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/common.css" rel="stylesheet" type="text/css" />
</head>
<?php
if ($_POST['adminLogin'] || ($_POST['login'] && $_POST['loginType'] == "admin")) {
    $thisStyle = 1;
} else {
    $thisStyle = 0;
}
if ($thisStyle) {
    $color       = "#cc0000";
    $font_color  = "white";
 $loginType   = "admin";
    $chgLogin    = "userLogin";
    $chgLoginVal = "用户登陆";
} else {
    $color       = "#ffcc33";
    $font_color  = "red";
 $loginType   = "user";
    $chgLogin    = "adminLogin";
    $chgLoginVal = "管理员登陆";
}
?>
<body>
<form name="loginForm" method="post" action="<?php echo $PHP_SELF; ?>" >
  <table width="100%"  border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td bgcolor="#5b33d7">&nbsp;</td>
      <td height="160" bgcolor="#4f33d7">&nbsp;</td>
      <td bgcolor="#5b33d7">&nbsp;</td>
    </tr>
    <tr>
      <td width="40%" bgcolor="#4f33d7">&nbsp;</td>
      <td bgcolor="<?php echo $color ?>" height="210"><table bgcolor="#0000cc" align="center" width="280" cellspacing="0" style="table-layout:fixed">
          <tr bgcolor="<?php echo $color ?>">
            <td width="65" height="20">&nbsp;</td>
            <td width="215">&nbsp;</td>
          </tr>
          <tr>
            <td colspan="2" height="10">&nbsp;</td>
          </tr>
          <tr>
            <td colspan="2" align="center" valign="middle" height="30" class="wbText18">SnailWarrior信息管理系统</td>
          </tr>
          <tr>
            <td colspan="2" align="center" valign="bottom" height="20" style="color:#FFFF00;font:14px;font-weight:bold;"><?php if ($thisStyle) echo "管理员登陆"; else echo "用户登陆"; ?></td>
          </tr>
          <tr>
            <td align="right" class="wbText12">用户名:</td>
   <td><input name="login_name" maxlength="16" <?php if ($thisStyle) echo "value=\"admin\""; else echo "value=\"hoho\""; ?> class="loginInput"></td>
          </tr>
          <tr>
            <td align="right" class="wbText12">密&nbsp;&nbsp;&nbsp;&nbsp;码:</td>
            <td><input type="password" name="login_pass" maxlength="16" value="123456abcdef" class="loginInput">
            </td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td><table cellspacing="0">
                <tr style="color:#FFFF00;font:11px;font-weight:bold;vertical-align:bottom">
      <?php if (!$thisStyle) { ?>
                  <td><input type="checkbox" name="remember_name"></td>
                  <td>记住用户名</td>
      <?php } ?>
                  <td><input type="checkbox" name="remember_pass"></td>
                  <td>记住密码</td>
                </tr>
              </table></td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td><table>
                <tr>
                  <td width="70"><input name="login" type="submit" style="height:22px; font:11px; width:60px;" value="登录">
                  </td>
                  <td><input name="<?php echo $chgLogin ?>" type="submit" style="height:22px; font:11px; width:80px;" value="<?php echo $chgLoginVal ?>" >
                  </td>
                </tr>
    <tr><input name="loginType" type="hidden" value="<?php echo $loginType ?>"></tr>
              </table>
          </tr>
          <tr>
            <td height="6">&nbsp;</td>
          </tr>
          <tr bgcolor="<?php echo $color ?>">
            <td colspan="2" height="20" align="center" style="color:<?php echo $font_color ?>; font:12px;font-weight:bold;"><?php if($error_message) echo $error_message; ?></td>
          </tr>
        </table></td>
      <td width="40%" bgcolor="#4f33d7">&nbsp;</td>
    </tr>
    <tr>
      <td bgcolor="#5f33d7">&nbsp;</td>
      <td height="290" bgcolor="#4F33D7">&nbsp;</td>
      <td bgcolor="#5f33d7">&nbsp;</td>
    </tr>
  </table>
</form>
</body>
</html>
 
////////////// config.php
 
<?php
//error_reporting(0);
header("content-type: text/html; charset=UTF-8");
/* 数据库配置 */
$dbhost = "localhost";
$dbuser = "SnailWarrior";
$dbpass = "SnailPassword";
$dbname = "users";
/* 连接MySQL数据库 */
$link = mysqli_connect(
        $dbhost,   /* The host to connect to */
        $dbuser,   /* The user to connect as */
        $dbpass,   /* The md5_pass to use */
        $dbname);  /* The default database to query */
/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
    exit();
}
   
/* 设置utf8字符集 */
if (!mysqli_set_charset($link, "utf8")) {
    printf("Error loading character set utf8: %s", mysqli_error($link));
}
/* 获取客户端IP */
function get_client_ip() {
 $client_ip = "unknown";
 
 if($_SERVER['HTTP_CLIENT_IP']){
      $client_ip=$_SERVER['HTTP_CLIENT_IP'];
 }elseif($_SERVER['HTTP_X_FORWARDED_FOR']){
      $client_ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
 }else{
      $client_ip=$_SERVER['REMOTE_ADDR'];
 }
 
 return $client_ip;
}
?>
 

------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-05-03 08:48:21
【小蜗牛嗷嗷之作
 
    这里面主要是一个 recvmail() 函数,从POP3服务器检测并收取新的邮件,最后用 update_mail_table() 函数将新邮件信息(发信者, 主题, 发送时间, 邮件文件名, 邮件大小, 附件标志)插入到数据库。
 
    我在 update_mail_table()  函数里写的解释一封电子邮件内容的方法不规范,可能无法正确解释一些不严格遵守MIME规范的邮件。还有一些其它的实用函数,参考了互联网上的别人的一些方法,Thanks the Original Author. ;)
 
<?php
/* 系统默认参数,注意:这里是全局变量 */
$connection=0;   // 保存与主机的连接
$timeout = 5;    // 连接主机的最大超时时间
$err_str='';     // 如果出错,这里保存错误信息
$err_no;         // 如果出错,这里保存错误号码
$resp;           // 临时保存服务器的响应信息
$new_mail_count = 0; //新邮件数目
/*
 * 函数功能:接收POP3服务器上的(新)邮件
 * 输入参数:$host,$user,$pass
 * 返    回:如果顺利执行,返回true,否则返回false,
 *           错误信息保存在$err_str
 *
 */
function recvmail($host, $user, $pass) {
    /* 使用全局的数据库连接 */
 global $link;
 /* 使用全局的pop3连接参数 */
 global $connection;
 global $timeout;
 global $err_str;
 global $err_no;
 global $resp;
 /* 这次所取回的新邮件数目 */
 global $new_mail_count;
 global $new_mail_dir;
 
    $mail_uidl_stored = array();    // 数据库里的邮件UIDL列表
    $mail_uidl_fresh  = array();    // 邮件服务器上的UIDL列表
    /*===================== 从数据库读取UIDL列表 ========================*/
    $query = "select * from mail_uid_list";
    if ($result = mysqli_query($link, $query)) {
        $i = 0;
        while ($row = mysqli_fetch_row($result)) {
         $mail_uidl_stored[$i++] = $row[0];
     }
     mysqli_free_result($result);
    } else {
        printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
     exit();
    }
    /*========================= 连接POP3服务器 =========================*/
    if (!$connection=fsockopen($host, 110 , &$err_no, &$err_str, $timeout)) {
        $err_str="连接到POP服务器失败,错误信息:".$err_str."错误号:".$err_no;
     return false;
    } else {
     getresp();
        if (substr($resp,0,3)!="+OK") {
            $err_str="服务器返回无效的信息:".$resp."请检查POP服务器是否正确!";
      return false;
        }
    }

    /*========================= 登陆POP3服务器 =========================*/
    if (!login($user, $pass)) {
        $err_str = "帐号或者密码错误!";
  return false;
    }

    /*====================== 获取邮件列表,用UIDL命令 ====================*/
    command("UIDL", 3, "+OK");
    getresp();
    $i = 0;
    while ($resp != ".") {
        $mail_uidl_key[$i] = strtok($resp," ");
     $mail_uidl_fresh[$i] = strtok(" "); // 这是邮件的UID
        getresp();
     $i++;
    }
    /*====== 对邮件列表进行分析处理,对比数据库中的信息,收取新邮件 =======*/
    $new_mail_uidl = array_diff($mail_uidl_fresh, $mail_uidl_stored);
    if (empty($new_mail_uidl)) {
     $new_mail_count = 0;
  /* 注意:如果没有新邮件,这里就返回了 */
  return true;
    } else {
        $new_mail_count = count($new_mail_uidl);
    }
    /* 这里巧妙的运用了array_keys函数 */
    $new_mail_num = array_keys($new_mail_uidl);
    $i = 0;
    while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 循环收取新邮件
        $num += 1;
        if (!command("RETR $num", 3, "+OK")) {
         return false;
     }
 
     $mail_file_str = "";
     $mail_str = fgets($connection, 100);
        while ($mail_str != ".\r\n") {  // .\r\n 是邮件结束的标志
         $mail_file_str .= $mail_str;
      $mail_str = fgets($connection, 100);
        }
 
     /* 输出邮件文件 */
     $mail_file_name_array[$i] = date("YmdHis")."_hoho_".get_radom_str(10);
     file_put_contents($new_mail_dir.$mail_file_name_array[$i], $mail_file_str);
 
     $i ++;
    }
    /*====================== 关闭与服务器连接 =========================*/
 if (!command("QUIT",3,"+OK")) {
     return false;
 }
    fclose($connection);
    /*====================== 更新数据库UID列表 ========================*/
    $i = 0;
    while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 即使有一封新邮件,也要更新数据库
        //如果是大批量数据,最好采用数组合并,但目前没有掌握将数据存放msyql的方法
        //$mail_uidl_stored = array_unique(array_merge($mail_uidl_stored, $mail_uidl_fresh));
     //只好笨笨的这样做了
     $query = "insert into mail_uid_list values('".$new_mail_uidl[$new_mail_num[$i]]."', '".$mail_file_name_array[$i]."')";
     $result = mysqli_query($link, $query);
        if (!$result) {
         printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
            exit();
        }
 
     $i ++;
    }
    /*================ 更新mail列表 =======================*/
    $i = 0;
    while ($mail_file_name_array[$i]) {
        update_mail_table($mail_file_name_array[$i]);
     $i ++;
    }
    /*=============== 注意:这里不能关闭与数据库的连接 ==================*/
    //mysqli_close($link);
 
 return true;
}
function getresp() {
    /* 采用全局变量,再三思考,还是认为这样效率高 */
 global $connection;
 global $resp;
 
    for($resp = "";;) {  
        if(feof($connection))
            return false;
        $resp .= fgets($connection,100);
        $length = strlen($resp);
  
        if($length >= 2 && substr($resp, $length - 2, 2) == "\r\n") {
            $resp = strtok($resp,"\r\n");
            return true;
        }
    }
}
function command($command, $return_lenth=1, $return_code='+') {
    /* 采用全局变量,再三思考,还是认为这样效率高 */
    global $connection;
 global $resp;
 global $err_str;
 
    if (!fputs($connection, "$command\r\n")) {
        $err_str = "无法发送命令".$command;
        return false;
    } else {
        getresp();
        if (substr($resp, 0, $return_lenth) != $return_code) {
            $err_str = $command." 命令服务器返回无效:".$resp;
            return false;
     } else {
   return true;
  }
    }
}
function login($user, $password) {
    if (!command("USER $user",3,"+OK")) return false;
    if (!command("PASS $password",3,"+OK")) return false;
    return true;
}
function get_radom_str($len){
    $str = 'abcdefghijklmnopqrstuvwxyz0123456789';
    //从以上字串中产生随机串,你如果想要其它字符,可以自行加入,如大写字母
    return substr(str_shuffle($str),0,$len);
}
function update_mail_table($mail_file_name) {
    global $new_mail_dir;
 
    $mail_file_content = file_get_contents($new_mail_dir.$mail_file_name);
 
 $mail_file_size = filesize($new_mail_dir.$mail_file_name);
    /* 记录附件个数和对应名字、大小 */
 if ($mail_file_size > 1048576) {
     $mail_file_size = round($mail_file_size/1048576, "2")." MB ";
 } else if ($mail_file_size > 1024) {
     $mail_file_size = round($mail_file_size/1024, "2")." KB ";
 } else {
     $mail_file_size = $mail_file_size." Bytes ";
 }
 
    /*
     * 注意!这里好像没有先后,所以不能拿一个作为另一个的参考位置出发点
     */
    /*======== 发件人 ========*/
    $from_start = strpos($mail_file_content, "\r\nFrom:");
    $from_end   = strpos($mail_file_content, "\r", $from_start + 7);
    $from_str   = substr($mail_file_content, $from_start, $from_end - $from_start);
    if ($sender_start = strpos($from_str, "?B?")) {
        $sender_start += 3;
     $sender_end = strpos($from_str, "?=", $sender_start);
     $sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
     $sender = base64_decode($sender_str);
  
  /* 检测字符集类型,在recvmail_func.php中没有这一项 */
  $charset_start = strpos($from_str, "=?") + 2;
  $charset_end = strpos($from_str, "?", $charset_start);
  $charset = substr($from_str, $charset_start, $charset_end - $charset_start);
 } else if ($sender_start = stripos($from_str, "?Q?")) {
     $sender_start += 3;
     $sender_end = strpos($from_str, "?=", $sender_start);
     $sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
  
  /* 有些变态的名字,还分开几段来写,真郁闷! */
     while ($sender_start = stripos($from_str, "?Q?", $sender_end)) {
      $sender_start += 3;
         $sender_end = strpos($from_str, "?=", $subject_start);
         $sender_str .= substr($from_str, $sender_start, $sender_end - $sender_start);
     }
  
     $sender = quoted_printable_decode($sender_str);
  
  /* 检测字符集类型,在recvmail_func.php中没有这一项 */
  $charset_start = strpos($from_str, "=?") + 2;
  $charset_end = strpos($from_str, "?", $charset_start);
  $charset = substr($from_str, $charset_start, $charset_end - $charset_start);
    } else if ($sender_start = strpos($from_str, "\"")) {
        /* “预防”有的邮件没有 "发件人",虽然自己还没见到例外 2008-10-21 */
     $sender_start += 1;
  $sender_end = strpos($from_str, "\"", $sender_start);
  /* 这里是ascii组成 */
  $sender = substr($from_str, $sender_start, $sender_end - $sender_start);
    } else {
     $sender_start = 8;
  /* 先看看是否有空格,有空格就以空格为边界 */
  if (!$sender_end = strpos($from_str, " ", $sender_start)) {
      $sender_end = $from_end;
  }
  $sender = substr($from_str, $sender_start, $sender_end - $sender_start);
  if (substr($sender, 0, 1) == "<") {
      $sender = "";
  }
 }
 
    /* 发件人email地址 */
    if ($sender_email_start = strpos($from_str, "<")) {
        $sender_email_end   = strpos($from_str, ">");
        $sender_email = substr($from_str, $sender_email_start + 1, $sender_email_end - $sender_email_start - 1);
   
     if (strlen($sender) > 30 || strlen($sender) == 0){
         $sender = $sender_email;
     }
 }
    /*======== 收件人 ========*/
    /*
     *         暂略
     */
    /*========= 主题 =========*/
    $subject_start = strpos($mail_file_content, "\r\nSubject:");
    $subject_end   = strpos($mail_file_content, "\r", $subject_start+10);
    $subject_line  = substr($mail_file_content, $subject_start, $subject_end - $subject_start);
    if ($subject_start = strpos($subject_line, "?B?")) {
        $subject_start += 3;
     $subject_end = strpos($subject_line, "?=", $subject_start);
     $subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
     $subject = base64_decode($subject_str);
  
  /* 检测字符集类型,在recvmail_func.php中没有这一项 */
  $charset_start = strpos($subject_line, "=?") + 2;
  $charset_end = strpos($subject_line, "?", $charset_start);
  $charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
 } else if ($subject_start = stripos($subject_line, "?Q?")) {
     $subject_start += 3;
     $subject_end = strpos($subject_line, "?=", $subject_start);
     $subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
  
  /* 有些变态的名字,还分开几段来写,真郁闷! */
  while ($subject_start = stripos($subject_line, "?Q?", $subject_end)) {
      $subject_start += 3;
         $subject_end = strpos($subject_line, "?=", $subject_start);
         $subject_str .= substr($subject_line, $subject_start, $subject_end - $subject_start);
  }
  
     $subject = htmlspecialchars(quoted_printable_decode($subject_str));
  
  /* 检测字符集类型,在recvmail_func.php中没有这一项 */
  $charset_start = strpos($subject_line, "=?") + 2;
  $charset_end = strpos($subject_line, "?", $charset_start);
  $charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
    } else {
     $subject = substr($subject_line, 11, $subject_end - $subject_start - 11);
    }
    /*======== 发送日期 =======*/
    if ($date_start = strpos($mail_file_content, "\r\nDate:")) {
     $date_start += 8;
        $date_end   = strpos($mail_file_content, "\r", $date_start);
        $date_str   = substr($mail_file_content, $date_start, $date_end - $date_start);
        $date = date('Y年m月d日 H:i:s', strtotime($date_str));
 } else {
     $date = date('Y年m月d日 H:i:s');
 }
 
 /* 检查是否有附件 */
 if (strpos($mail_file_content, "\r\nContent-Disposition: attachment")) {
     $has_attachment = 1;
 } else {
     $has_attachment = 0;
 }
 
 global $link;
 
    if ($charset == "UTF-8" || $charset == "utf-8") {
     $sender = iconv("UTF-8", "GB2312", $sender);
  $subject = iconv("UTF-8", "GB2312", $subject);
 }
 /* 插入数据库 */
    $query = "insert into mail(Sender, Subject, Sendtime, Filename, Filesize, Attachment) \n
           values('$sender', '$subject', '$date', '$mail_file_name', '$mail_file_size', '$has_attachment')";
       
    $result = mysqli_query($link, $query);
    if (!$result) {
        printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
        exit();
    }
}
?>
 

------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-05-02 22:43:45
【小蜗牛五二无聊之作
 
    网络上能找到的相关资料太多了,也太繁杂,但有些人还整理得不错,下面根据自己的偏好再梳理一下,有些是自己对照着man手册翻译的,下面的例子都是自己编造自己测试OK,都是比较实用的东西,方便自己日后参考。
 
1、算术运算比较运算符(bash自身不能比较浮点数)
 
-eq 等于          [ $num1 -eq $num2 ]
-ne 不等于       [ 100   -ne $num1 ]
-lt 小于           [ 100   -lt `expr $num1 + $num2` ]
-le 小于或等于   [ 100   -le `expr $num1 \* $num2` ]
-gt 大于           [ 100   -gt `expr $num1 / $num2` ]
-ge 大于或等于   [ 100   -ge `expr $num1 % $num2` ]
 
2、字符串比较运算符  
 
-z string  如果 string 长度为零,则为真  [ -z "`ps aux | grep mysql`" ]
-n string  如果 string 长度非零,则为真  [ -n "$string" ]
              【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2  如果 string1 与 string2 不同,则为真  [ "$str1" != "Snail" ]
string1 == string2  如果 string1 与 string2 相同,则为真  [ "$str1" == "$str2" ]
                    (上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1 < string2   如果 string1 按字典顺序比较小于 string2,则为真
string1 > string2   如果 string1 按字典顺序比较大于 string2,则为真
 
3、文件比较运算符 
 
-a filename  如果 filename 存在,则为真                   [ -e $HOME/.bashrc ]
-e filename  (同上)
-b filename  如果 filename 存在,并且是块文件,则为真     [ -e /dev/loop0 ]
-c filename  如果 filename 存在,并且是字符文件,则为真   [ -e /dev/ttyS0 ]
-d filename  如果 filename 存在,并且为目录,则为真       [ -d /home/snail ]
-f filename  如果 filename 存在,并且为常规文件,则为真   [ -f /dev/ttyS0 ]
-g filename  如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename  如果 filename 存在,并且为符号连接,则为真   [ -h /bin/vi ]
-L filename  (同上)
-k filename  如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename  如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename  如果 filename 存在,并且可读,则为真         [ -r /etc/passwd ]
-s filename  如果 filename 存在,并且大小不为零,为真     [ -s ./none-zero ]
-u filename  如果 filename 存在,并且为set-user-id,为真  [ -f $HOME/ak47 ]      
-w filename  如果 filename 存在,并且可写,则为真         [ -w /var/log/mail ]
-x filename  如果 filename 存在,并且可执行,则为真       [ -x ./start.sh ]
 
下面这些不常用的:
 
-t fd        如果文件描述符被打开并指向一个终端,则为真   [ -t /proc/1/fd/10 ]
              【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename  如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename  如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename  如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename  如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname   如果 shell 选项 optname 被开启,则为真
              【提示】使用 set -o 来查看
file1 -nt file2  如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2  如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2  如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真
              【提示】查看文件的索引节点可以用 ls -i 选项
 

------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-05-02 11:32:48
【小蜗牛五二无聊之作
        
BASH只支持一维数组,但参数个数没有限制。
 
声明一个数组:
declare -a array

(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)
 
数组赋值:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
    arrya[1]=var2
    ...
    array[n]=varN
   
计算数组元素个数:
${#array[@]}  或者  ${#array[*]}
 
BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。
 
引用数组:
echo ${array[n]}
 
遍历数组:
filename=(`ls`)
for var in ${filename[@]};do
echo $var
done
 
数组实用示例:(个人收集整理)
 
1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5
while [ "$i" -lt $n ] ; do
  echo "Please input strings ... `expr $i + 1`"
  read array[$i]
  b=${array[$i]}
  echo "$b"
  i=`expr $i + 1`
done
 
2、将字符串里的字母逐个放入数组,并输出到“标准输出”
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<26; i++ )) ; do
    array[$i]=${chars:$i:1}
    echo ${array[$i]}
done
 
这里有趣的地方是 ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符。如果将 1 改为 3 ,就获取 3 个字符啦~ 结果是:
abc
bcd
...
vxy
xyz
yz     //没有足够字符串获取了
z      //没有足够字符串获取了
3、将数组应用到shell环境变量
 
3、将数组应用到shell环境变量(1)
 
数组赋值:
[root@pps ~]# SEASON=("Srping" "Summer" "Autumn" "Winter")
当你发现赋值错了,也可以立刻从新赋值纠正,如上面的 Spring 被写成 Srping。
重新赋值:(原来的值被重写)
[root@pps ~]# SEASON=("Spring" "Summer" "Autumn" "Winter")
 
查看一下环境变量:
[root@pps ~]# set | grep SEASON
SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
 
显示整个数组:
[root@pps ~]# echo ${SEASON[*]}  或者 echo ${SEASON[@]}
Spring Summer Autumn Winter
 
显示某一数组元素:
[root@pps ~]# echo ${SEASON[3]}
Winter
 
给单个数组元素赋值:
[root@pps ~]# SEASON[0]="New_Spring"
 
再查看一下看数组:
[root@pps ~]# echo ${SEASON[*]}
New_Spring Summer Autumn Winter
 
清除指定的单个数组元素:
[root@pps ~]# unset SEASON[2]
 
清除整个数组:
[root@pps ~]# unset SEASON
 
4、将数组应用到shell环境变量(2) 【这个用法不错!给原作者赞一个!】
 
使用tr命令将文件中的回车转换成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file
 
将文件中内容给数组赋值:(碰到第一个回车符之前的内容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file
 
查看数组赋值情况:
[root@pps ~]# set | grep "SHELLS"
SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")
 
后面可以将这个数组环境变量应用到其它的SHELL脚本或者应用程序里了~
 
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-05-01 11:07:27
【小蜗牛五一无聊之作

如果你每天收到很多垃圾邮件,很憎恨…你不是一个人在愤怒,你不是一个人…

垃圾邮件的本质:牺牲公共利益,满足个人私利,损耗世界资源,污染世界环境。
 
    小蜗牛不是邮件专家,只从事过相关的技术支持,下面,我根据自己的小小经验,“按角色”给大家说一下我所认识的垃圾邮件以及相关斗争……

主角:垃圾邮件发送者
 
工具:邮件群发软件
 
邮件地址来源:
1、邮件群发软件穷举邮件地址,盲目投递,只管成功,不管失败。
2、购买某些网站、个人或企业提供的邮件地址数据、行业信息、企业名录等
3、某些软件或者邮件群发软件自身能自动采集互联网上的邮件地址
...
 
小提示:你可以搜索一下“邮件群发软件”~嘿嘿!
 
有专门的垃圾邮件发送商,它们可能有更先进的垃圾邮件发送技术和相关网络服务支持,提投递成功率和客户命中率。

受害者:世界网民(狭义)

广义来说,垃圾邮件的危害还包括资源消耗、环境污染等,大家可以搜索相关信息
 
除了垃圾邮件群发软件主动试探我们的邮箱地址外,我们自己也可能有意无意的在互联网上暴露、泄漏了自己的邮箱地址。比如:

1、注册网站,留下email信息(有可能被邮件地址搜索软件搜索到或被网站出卖)
2、网上开店,个人博客等(比如,每一个sohu博客对应一个sohu邮箱)

邮件服务器反垃圾邮件手段
 
【注意】下面的技术只是根据自己接触过的邮箱服务器粗略的讲述,有太多新技术我没有接触过。
 
1、在网络层对外来的连接进行判断。比如判断对方的IP是否为动态IP(一般正规的邮件服务器都是静态IP,而很多垃圾邮件发送者用的都是动态IP),是否被列入国际或者国内反垃圾组织的RBL(动态黑名单),或者是RWL(动态白名单),或者被列入本系统的黑名单、白名单等等。在网络层还可以进行速率控制、并发控制等防止邮件系统过载。
 
2、SMTP会话层进行判断。比如检验HELO域名是否和IP匹配,是否存在反向解释等。灰名单技术(GrayList 一种基于重试原则的技术)是SMTP会话层和网络层的相互配合实现的。
 
3、邮件系统全局过滤规则。系统过滤规则可以有很多很多,每一条都用来过滤特定的垃圾邮件,比如过滤邮件主题包含“发票”字样,或内容包含“培训”字样等邮件。基于规则,我们可以对邮件进行多样性的分类处理,比如删除、转发、放到垃圾箱、回复发信人、将发信人列入黑名单等等。
 
4、反垃圾系统过滤。这个就比较难说了,各种反垃圾系统有各自的特性和优点,不过原理上离不开通过对邮件主题、内容(甚至内容里的图片、HTTP链接等)、附件等邮件各个部分进行检测分析、判断或评分(垃圾邮件评分原则,也即将邮件进行一层一层的过滤、评分,到最后出来一个总分数,如果分数超过一定阀值,就被认为是垃圾邮件或者直接被系统删除)。比较著名的开源反垃圾引擎有 SpamAssassin,官方网站是 [url]http://spamassassin.apache.org[/url] 。在网络层、SMTP会话层、或在过滤规则里,都可以对邮件来源(IP),发件人、收件人等进行垃圾邮件过滤。因此,“反垃圾邮件系统”是一个分层次、相互协调、相互补充的反垃圾体系。
 
相关反垃圾技术术语:白名单、黑名单、灰名单、实时黑(白)名单、反向MX解释、关键字过滤、指纹技术、意图分析技术、贝叶斯过滤技术...
 
5、用户级别的黑名单、白名单、过滤规则等。一般的邮件系统都有用户自己的黑白名单,过滤规则设置,还有垃圾邮件举报等功能。
 
6、客户端的垃圾邮件过滤功能。比如Foxmail就带有垃圾邮件过滤系统,并且还具有垃圾邮件学习功能。

个人邮箱地址保护手段

1、用图片形式的邮件地址。目前有很多可以自动生成免费邮箱图片的网站,比如
[url]http://pic.sdodo.com/tool/mailpic/[/url], [url]http://services.nexodyne.com/[/url]
 
2、用链接形式的邮件地址,真实的邮件地址为链接所指向的网站所保护,需要输入验证码才能获取真实的用户邮箱地址。目前有很多网站为大家提供免费的邮件地址保护服务,比如 [url]http://scr.im[/url] , [url]http://tinymail.me[/url] 。有些网站提供免费的“中转”服务,比如 [url]http://whspr.me[/url],你在它那里申请邮件地址保护,它提供你一个链接,点击这个链接打开一个页面,别人在这个页面里给你留言,这个网站就将这些信息转发到你真正的邮箱里了。
 
【实质上,这些网站为大家提供免费的邮箱地址保护服务,大家为该网站做宣传】
 
3、使用 # % & 等其它符号代替 @ 符号,这样能很大程度上减少被搜索软件识别的几率。,但某些比较“聪明”的搜索软件也能识别这种小技巧,当然你可以更聪明,多加一些其它“漂亮”的干扰,只要能让大家正确识别你的邮件地址就可以了。

目前市场上免费的、收费的、或者是企业的电子邮件系统各有优劣,反垃圾反病毒方面肯定存在差距,我在这里也无法加于评判,大家读完这篇小短文,会有什么动作吗?
 
反垃圾斗争的手段,除了采用先进的反垃圾技术外,有讨论说通过收费邮件、或者法律手段对垃圾邮件进行控制、惩罚,但我认为,从根本上消灭垃圾邮件,就像从根本上消灭恐怖分子一样困难……


------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-04-29 16:18:48
【小蜗牛悠悠之作
 
    当你给某人发送了一封电子邮件,想知道对方是否阅读了吗?这里不是说我们平常使用的“回执”方式,靠收件人发送回执是不可行的,因为像我这样的人就不喜欢给对方回执,呵呵。
   
    我们可以通过这里所说的“电子邮件追踪技术”来实现,其实道理挺简单的,但仅适用于html邮件,普通的plain-text或者rich-text邮件不行(因为不支持内嵌图片),下面就简单的说一下“电子邮件追踪”原理:
 
    在所写的html邮件里,包含一个链接图片,其实在html中的表示就是一个URL链接,例如我的小蜗牛头像 <img src=[url]http://img1.51cto.com/image/upload/680306_1235977773.jpg[/url] /> 。当这封邮件被阅读的时候,无论是在网页里或者在客户端(Foxmail,Outlook)阅读,由于都要显示该图片,因此该URL图片的链接或者访问次数就会增加。因此,只要在URL图片的服务器端记录该图片的访问次数(或者作其它的标记、记录等),就可以知道你所发送的电子邮件是否被对方阅读过了。如果URL图片所在的服务器是你自己的,那就最好不过了,自己编写简单的小程序管理控制,比如,一旦发现图片的访问次数增多了(比如由0增加为1),服务器就给发信人(当然服务器要知道发信人是谁)发送一封通知信,通知发信人某某主题(或其它的信息)的邮件已经被对方阅读了。
 
    如果你没有自己的服务器或者网站,那也没关系,因为早就有非常好的“免费”的网站为你提供邮件追踪服务:[url]http://www.spypig.com[/url] (侦察猪)。
 
    打开“侦察猪”网站的首页,你只需要输入你的邮件地址,邮件主题(可以和你发给对方的主题一样或者随便写都可以,你自己清楚就行),然后选择一个猪猪图片或者透明图片,最后选择最多通知的次数(一般都不止一次阅读或者打开查看该邮件),点击step5的大图片即可生成一个随机命名的图片(和你上面选择的那个图片一样,但这个图片的命名关联了你输入的邮件地址、邮件主题等信息),然后在60秒内复制该图片到你想要发送的html电子邮件中即可(透明图片让收件人几乎无法察觉图片的存在)。
 
    说一下为什么要在60秒内复制并粘贴到邮件中。在60秒内,这个图片还没有被spypig网站激活,也就是,你在60秒内随意复制粘贴多次都没所谓,如果60秒后,你再尝试复制粘贴,那么在你还没有发送邮件之前,你的收件箱就会收到来自spypig的一封(或多封)邮件通知说你的邮件已经被阅读了,呵呵,明白怎么回事了吧?
 
    国内某高人利用该方法来发送应聘简历(赞一个!),还自己用php来尝试实现一下spypig的功能(再赞两个!!),值得我们模仿(发简历)和学习(php)!
这就是我说的那高人的文章:
[url]http://www.cnblogs.com/czy1121/archive/2009/02/24/1397154.html[/url]
 
文章后面的评论比较精彩,值得看看学习学习:)
如果图片被过滤了,那么阅读追踪功能也就实效了:(
评论中还提到,垃圾邮件商为了确认邮箱地址是否活跃,就会用到这狠招!
NND,估计自己一直以来也中招不少~
 
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-04-28 13:56:19
【小蜗牛嗷嗷之作
 
在短信发送编码的时候,有必要判断要发送的内容是否带有中文或者其它的多字节字符,从而采取最优的编码方式。(如果没有中文,则使用7BIT压缩编码,以在一条短信中容纳最多160个ASCII字符)
 
我查看过某些编码资料,了解到中文UTF8编码的范围为2-3个字节(我还没碰到过2个字节UTF8编码的中文,日常碰到的几乎都是3个字节的)。
 
我发现中文UTF8编码的一个共同特点,无论是2个字节还是3个字节的UTF8中文编码,其实每一个字节的最高位都是 1 。因此,我利用这个特点,就能简单快速的判断UTF8字符串里是否有中文。这里顺便说一下,ASCII的UTF8编码也是和ASCII一样,只占用一个字节,最高位是0(这里不包括扩展ASCII)。
 
下面是我的C函数:
 
//如果检测到多字节字符,返回1,否则返回0
int scanMultiBytes(const char *pSrc)
{
    int i;
    for (i = 0; i < strlen(pSrc); i ++)
        if (*(pSrc+i) & 0x80)
            return 1;
    return 0;
}
 
经我观察(不一定正确,请大家指正),几乎所有的多字节字符最高位都是 1,因此上面我的函数名为“扫描多字节字符”- scanMultiBytes()。
 
【注意】上面我用 strlen() 函数来获取源字符串的长度,这里仅限于UTF8编码的源字符串,如果是其它编码的字符串就不一定适用了(比如我上一篇文章提到的UCS2编码就不适用)

 
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-04-28 10:01:50
【小蜗牛清心之作
 
UCS2编码在发送短信时候经常用到,如果发送的是纯ASCII字符的短信,采用7BIT压缩编码最大一次可以发送160个ASCII,但是如果想发送中文的话,只能采用UCS2编码了,一条短信最大可以发送70个中文(或70个中英文、数字混合短信,比如,如果有1个中文,后面可以再有69个中文,或者69个英文、数字)。
 
中文、普通ASCII的UCS2编码都是要占用两个字节,但是,ASCII的UCS2编码有一个字节为0x0,导致无法用 strlen() 函数来计算UCS2编码的长度,我是这么计算UCS2编码长度的:
 
// 计算出UCS2编码的长度并返回长度
int ucs2Count(const unsigned char *pSrc)
{
    int i;
    for (i = 0; pSrc[i]+pSrc[i+1] != 0; i += 2);
    //注意上面有个";"
    return i;
}
 
pSrc这里存放着已经UCS2编码好的字节串,这里需要注意的是,我们必须有 n*2+2 字节的空间来存储UCS2字节串,这里的 n 是需要进行UCS2编码的字符个数,中文当作一个字符,英文字母、数字也是一个字符。并且,我们在编码转换的时候,需要先把 n*2+2 字节的空间清零,可以使用函数 bzero(pSrc, n*2+2) 或者 memset(pSrc, 0, n*2+2)。
 
温馨提示一下,在Linux下各种编码转换,可以使用 iconv() 函数哦~
 
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..



2009-04-27 11:28:48



2009-04-26 21:47:52
【小蜗牛无聊之作
 
我经常需要用到for循环,自己小结一下它的用法:
 
方法1:
    for 变量 in 常量列表; do 一些命令; done;
   
    (注意:我这里用“常量列表”来表述不一定准确,希望大家理解即可,
     我实在想不出更好的表述了,请大家指教!)   
   
如:for file in `ls`; do echo $file; done;
    for i in 1 2 3 4 5; do echo $i; done;
   
   
方法2:
    for (( 变量初始化; 条件判断; 变量自变 )); do 一些命令; done;
   
如:for (( i = 0; i < 10; i++)); do echo $i; done;
    这里就像使用C语言那样哦~不过是用两个括号而已。
   
这里举一个有趣的例子:
 
#!/bin/bash
# test.sh
 
MAX=10
 
for (( i = 0; i < MAX ; i ++ ))
do
    echo $i
done
 
有趣的是,这里的 MAX 前面没有 '$',当然,你使用 $MAX 也是可以的。
难道 bash 就那么宽容吗?听说,类似C的这种语法,只有bash独有哦~

顺便提一下,在bash中使用expr进行简单的数学计算,如下:
 
MAX=10
 
for (( i = 0; i < MAX ; i ++ ))
do
    echo `expr $i \* $i`
   
    # 或者这样
    #  echo $[$i * $i]
done
 
注意,这里需要用 ` ` 括号(一时想不起它叫啥名字)起来表示 expr 是一个命令,前面的 `ls` 也就是取 ls 命令的输出结果。还有,这里的'*'要用'\'来转义,使用 '+' '-' 等算术符则不需要转移。使用上面注释掉的第二种方法就不需要转义。
 
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: 
snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己!
 [/img]..



 <<   1   2   3   4   5   >>   页数 ( 1/7 )