﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-JulyRina's blog-随笔分类-网络安全</title><link>http://www.cppblog.com/JulyRina/category/21061.html</link><description>welcome to July Rina's blog</description><language>zh-cn</language><lastBuildDate>Tue, 17 Mar 2015 01:12:45 GMT</lastBuildDate><pubDate>Tue, 17 Mar 2015 01:12:45 GMT</pubDate><ttl>60</ttl><item><title>html页面“自动重定向”技术</title><link>http://www.cppblog.com/JulyRina/archive/2015/03/17/210070.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Tue, 17 Mar 2015 01:07:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/03/17/210070.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/210070.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/03/17/210070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/210070.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/210070.html</trackback:ping><description><![CDATA[<div>&nbsp; &nbsp; 自动转向(Auto-Redirecting)，也叫自动重定向。自动跳转，指当访问用户登陆到某网站时，自动将用户转向其它网页地址的一种技术。转向的网页地址可以是网站内的其它网页，也可以是其它网站。通常情况下，浏览器会收到一个网页，该页面含有自动加载一其它网页的代码。该页面有可能在服务器端被转换，这样的话，浏览器只收到一个页面，而自动转向往往意味着浏览器收到的页面具有自动将访问用户送至其它页面的功能。</div><div>　 　对自动转向技术(Auto-Redirecting)的合理应用包括：将用户转向到指定浏览器的网页版本；当网站的域名变更或删除后将人们转向到新域名 下，等等。但现在这种技术却往往被搜索引擎优化人士用来作为提高网站的搜索引擎排名的一种手段。例如，先专门针对搜索引擎做一个高度优化的网页，也就是我 们通常所说的&#8220;桥页&#8221;，然后把这个网页提交给搜索引擎来获得好的排名。但是，当搜索用户通过搜索引擎的搜索结果列表点击该网页列表进入后，将被自动转向到 一个用户本来无意去访问的网站地址。搜索引擎常常认为自动转向的网页是对读者的误导，所以它会对这种网页或网站施以惩戒，不过对一些自动转向方法它目前还 无法自动检测出来。</div><div>　　<strong>Meta Refresh Tag自动转向法</strong></div><div>　　由于搜索引擎能够读取HTML，而Meta tags也是HTML，所以对于这种自动转向法，搜索引擎能够自动检测出来。因而无论网站的转向出于什么目的，都很容易被搜索引擎视做对读者的误导而受到惩罚。不过，如果跳转延迟时间设置合适，搜索引擎就不会视之为作弊。</div><div>　　页面定时刷新元标识(Meta Refresh Tag)只能放在HTML代码的&lt; HEAD&gt;区里。如下所示：</div><div>　　&lt;meta http-equiv="refresh" content="10; url=http://www.baidu.com/"&gt;</div><div>　　其中的&#8220;10&#8221;是告诉浏览器在页面加载5秒钟后自动跳转到url这个页面。</div><div>　　这种方法常可以在论坛中见到。如果在论坛上发信息，先会看到一个确认页面，几秒后会自动重新跳转回当前的论坛页面中。</div><div>　　从搜索引擎优化的角度出发，一般不希望自动转向有延迟。不过，如果是用Meta Refresh标识进行转向，一定要注意把延迟时间设定成至少10秒以上。</div><div>　　<strong>&#8220;javascript&#8221;自动转向法</strong></div><div>　　由于不能解析javascript，所以搜索引擎无法察觉(自动检测到)用javascript脚本进行的自动转向。javascript自动重定向脚本可以放在网页的任何位置上，如果要求立即跳转，则可以将其放入网页源码的&lt;head&gt;区内的最上面。用javascript实现跳转的范例如下：</div><div>　　&lt;script language="javascript"&gt;&lt;!--location.replace("pagename.html")//--&gt;&lt;/script&gt;</div><div>　　其中的&#8220;pagename.html&#8221;指特定的重定向目标地址，用相对/绝对URL地址均可。</div><div>　 　用javascript实现自动重定向的好处在于：用户所访问的目标URL不会保留在用户浏览器的历史记录中，如果用户按返回按钮返回，则将回到跳转前 的网页，而不是包含javascript自动重定向脚本的跳转页面，所以不会出现当用户点击返回按钮后返回至重定向页，然后该页自动跳转到用户本来想离开 的那个页面的尴尬情形。</div><div>　　如果需要，可以把javascript自动重定向脚本存在一个外部文件中，并通过下面的命令行来加载，其中&#8220;filename.js&#8221;是该外部文件的路径和文件名：</div><div>　　&lt;script language="javascript" src="filename.js"&gt;&lt;/script&gt;</div><div>　　注意：若需实现即刻转向，或不希望人们看到转向前的那个页面，一般常用javascript脚本实现。在这种情况下应将javascript脚本放入HTML源码的&lt;HEAD&gt;区中。</div><div>　　表单(FORM)自动转向法</div><div>　　搜索引擎的&#8220;爬行&#8221;程序是不会填写表单的，所以它们也不会注意到提交表单，因而可以利用表单来实现自动转向(重定向)而不让搜索引擎察觉。</div><div>　 　对于表单，人们往往很少意识到：表单的Action参数中包含的URL地址其实正是浏览器向服务器所请求的URL。浏览器将会通过向请求的URL地址增 加一些格式为name=value的参数给予它以特殊的对待。在什么都没有的情况下，浏览器仍旧会为该URL安排请求至服务器。</div><div>　　用javascript脚本可让页面开始加载时即提交表单。下面是一个用javascript实现表单自动提交，以及提交表单的范例：</div><div>　　&lt;script language="javascript"&gt;&lt;!--document.myform.submit()//--&gt;&lt;/script&gt;</div><div>　　&lt;form name="myform" action="pagename.html" method="get"&gt;&lt;/form&gt;</div><div>　　其中&#8220;myform&#8221;可以是任意名称，&#8220;pagename.html&#8221;用相对/绝对URL地址均可。</div><div>　　小结</div><div>　 <span style="white-space:pre">	</span>如果访问用户最终看到的是他们想看到的，那么在搜索引擎优化中使用自动转向技术并没有什么不对，也并不是什么不道德的行为。但有些人往往会在利用&#8220;自动 跳转&#8221;技术，利用&#8220;桥页&#8221;吸引访问者，然后把他们送到他们无意浏览的页面或网站，这种做法只会引起访问用户的反感，又怎么能够期望访问流量可以有效转化为最终客户呢?</div><img src ="http://www.cppblog.com/JulyRina/aggbug/210070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-03-17 09:07 <a href="http://www.cppblog.com/JulyRina/archive/2015/03/17/210070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSOX线程简介</title><link>http://www.cppblog.com/JulyRina/archive/2015/03/16/210063.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Mon, 16 Mar 2015 13:18:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/03/16/210063.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/210063.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/03/16/210063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/210063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/210063.html</trackback:ping><description><![CDATA[<h3>线程是有趣的</h3>
了解如何正确运用线程是每一个优秀程序员必备的素质。线程类似于进程。如同进程，线程由内核按时间分片进行管理。在单处理器系统中，内核使用时间分片来模拟线程的并发执行，这种方式和进程的相同。而在多处理器系统中，如同多个进程，线程实际上一样可以并发执行。<br />
那么为什么对于大多数合作性任务，多线程比多个独立的进程更优越呢？这是因为，线程共享相同的内存空间。不同的线程可以存取内存中的同一个变量。所以，程序中的所有线程都可以读或写声明过的全局变量。如果曾用 fork() 编写过重要代码，就会认识到这个工具的重要性。为什么呢？虽然 fork() 允许创建多个进程，但它还会带来以下通信问题: 如何让多个进程相互通信，这里每个进程都有各自独立的内存空间。对这个问题没有一个简单的答案。虽然有许多不同种类的本地 IPC (进程间通信），但它们都遇到两个重要障碍：
<ul>
     <li>强加了某种形式的额外内核开销，从而降低性能。</li>
     <li>对于大多数情形，IPC 不是对于代码的&#8220;自然&#8221;扩展。通常极大地增加了程序的复杂性。</li>
</ul>
双重坏事: 开销和复杂性都非好事。如果曾经为了支持 IPC 而对程序大动干戈过，那么您就会真正欣赏线程提供的简单共享内存机制。由于所有的线程都驻留在同一内存空间，POSIX 线程无需进行开销大而复杂的长距离调用。只要利用简单的同步机制，程序中所有的线程都可以读取和修改已有的数据结构。而无需将数据经由文件描述符转储或挤入紧窄的共享内存空间。仅此一个原因，就足以让您考虑应该采用单进程/多线程模式而非多进程/单线程模式。<br />
<hr />
<h3>线程是快捷的</h3>
不仅如此。线程同样还是非常快捷的。与标准 fork() 相比，线程带来的开销很小。内核无需单独复制进程的内存空间或文件描述符等等。这就节省了大量的 CPU 时间，使得线程创建比新进程创建快上十到一百倍。因为这一点，可以大量使用线程而无需太过于担心带来的 CPU 或内存不足。使用 fork() 时导致的大量 CPU 占用也不复存在。这表示只要在程序中有意义，通常就可以创建线程。<br />
当然，和进程一样，线程将利用多 CPU。如果软件是针对多处理器系统设计的，这就真的是一大特性（如果软件是开放源码，则最终可能在不少平台上运行）。特定类型线程程序（尤其是 CPU 密集型程序）的性能将随系统中处理器的数目几乎线性地提高。如果正在编写 CPU 非常密集型的程序，则绝对想设法在代码中使用多线程。一旦掌握了线程编码，无需使用繁琐的 IPC 和其它复杂的通信机制，就能够以全新和创造性的方法解决编码难题。所有这些特性配合在一起使得多线程编程更有趣、快速和灵活。<br />
<hr />
<h3>线程是可移植的</h3>
如果熟悉 Linux 编程，就有可能知道 __clone() 系统调用。__clone() 类似于 fork()，同时也有许多线程的特性。例如，使用 __clone()，新的子进程可以有选择地共享父进程的执行环境（内存空间，文件描述符等）。这是好的一面。但 __clone() 也有不足之处。正如__clone() 在线帮助指出：<br />
&#8220;__clone 调用是特定于 Linux 平台的，不适用于实现可移植的程序。欲编写线程化应用程序（多线程控制同一内存空间），最好使用实现 POSIX 1003.1c 线程 API 的库，例如 Linux-Threads 库。参阅 pthread_create(3thr)。&#8221;<br />
虽然 __clone() 有线程的许多特性，但它是不可移植的。当然这并不意味着代码中不能使用它。但在软件中考虑使用 __clone() 时应当权衡这一事实。值得庆幸的是，正如 __clone() 在线帮助指出，有一种更好的替代方案：POSIX 线程。如果想编写 <strong>可移植的</strong> 多线程代码，代码可运行于 Solaris、FreeBSD、Linux 和其它平台，POSIX 线程是一种当然之选。<br />
<hr />
<h3>第一个线程</h3>
下面是一个 POSIX 线程的简单示例程序：<br />
<pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;&lt;pthread.h&gt;
#include&nbsp;&lt;stdlib.h&gt;
#include&nbsp;&lt;unistd.h&gt;
&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*thread_function(<span style="color: #0000FF; ">void</span>&nbsp;*arg)&nbsp;{
&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i;
&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;i=0;&nbsp;i&lt;20;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;printf("Thread&nbsp;says&nbsp;hi!\n");
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;}
&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;
}
<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">void</span>)&nbsp;{
&nbsp;&nbsp;pthread_t&nbsp;mythread;
&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;pthread_create(&nbsp;&amp;mythread,&nbsp;NULL,&nbsp;thread_function,&nbsp;NULL)&nbsp;)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;creating&nbsp;thread.");
&nbsp;&nbsp;&nbsp;&nbsp;abort();
&nbsp;&nbsp;}
&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;pthread_join&nbsp;(&nbsp;mythread,&nbsp;NULL&nbsp;)&nbsp;)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;joining&nbsp;thread.");
&nbsp;&nbsp;&nbsp;&nbsp;abort();
&nbsp;&nbsp;}
&nbsp;&nbsp;exit(0);
}</div>
</pre>
要编译这个程序，只需先将程序存为 thread1.c，然后输入：<br />
<pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->$&nbsp;gcc&nbsp;thread1.c&nbsp;-o&nbsp;thread1&nbsp;-lpthread</div>
</pre>
运行则输入：<br />
<pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->$&nbsp;./thread1</div>
</pre>
<hr />
<h3>理解 thread1.c</h3>
<p>thread1.c 是一个非常简单的线程程序。虽然它没有实现什么有用的功能，但可以帮助理解线程的运行机制。下面，我们一步一步地了解这个程序是干什么的。main() 中声明了变量 mythread，类型是 pthread_t。pthread_t 类型在 pthread.h 中定义，通常称为&#8220;线程 id&#8221;（缩写为 "tid"）。可以认为它是一种线程句柄。</p>
<p>mythread 声明后（记住 mythread 只是一个 "tid"，或是将要创建的线程的句柄），调用 pthread_create 函数创建一个真实活动的线程。不要因为 pthread_create() 在 "if" 语句内而受其迷惑。由于 pthread_create() 执行成功时返回零而失败时则返回非零值，将 pthread_create() 函数调用放在 if() 语句中只是为了方便地检测失败的调用。让我们查看一下 pthread_create 参数。第一个参数 &amp;mythread 是指向 mythread 的指针。第二个参数当前为 NULL，可用来定义线程的某些属性。由于缺省的线程属性是适用的，只需将该参数设为 NULL。</p>
<p>第三个参数是新线程启动时调用的函数名。本例中，函数名为 thread_function()。当 thread_function() 返回时，新线程将终止。本例中，线程函数没有实现大的功能。它仅将 "Thread says hi!" 输出 20 次然后退出。注意 thread_function() 接受 void * 作为参数，同时返回值的类型也是 void *。这表明可以用 void * 向新线程传递任意类型的数据，新线程完成时也可返回任意类型的数据。那如何向线程传递一个任意参数？很简单。只要利用 pthread_create() 中的第四个参数。本例中，因为没有必要将任何数据传给微不足道的 thread_function()，所以将第四个参数设为 NULL。</p>
<p>您也许已推测到，在 pthread_create() 成功返回之后，程序将包含两个线程。等一等， 两个 线程？我们不是只创建了一个线程吗？不错，我们只创建了一个进程。但是主程序同样也是一个线程。可以这样理解：如果编写的程序根本没有使用 POSIX 线程，则该程序是单线程的（这个单线程称为&#8220;主&#8221;线程）。创建一个新线程之后程序总共就有两个线程了。</p>
<p>我想此时您至少有两个重要问题。第一个问题，新线程创建之后主线程如何运行。答案，主线程按顺序继续执行下一行程序（本例中执行 "if (pthread_join(...))"）。第二个问题，新线程结束时如何处理。答案，新线程先停止，然后作为其清理过程的一部分，等待与另一个线程合并或&#8220;连接&#8221;。</p>
<p>现在，来看一下 pthread_join()。正如 pthread_create() 将一个线程拆分为两个， pthread_join() 将两个线程合并为一个线程。pthread_join() 的第一个参数是 tid mythread。第二个参数是指向 void 指针的指针。如果 void 指针不为 NULL，pthread_join 将线程的 void * 返回值放置在指定的位置上。由于我们不必理会 thread_function() 的返回值，所以将其设为 NULL.</p>
<p>您会注意到 thread_function() 花了 20 秒才完成。在 thread_function() 结束很久之前，主线程就已经调用了 pthread_join()。如果发生这种情况，主线程将中断（转向睡眠）然后等待 thread_function() 完成。当 thread_function() 完成后, pthread_join() 将返回。这时程序又只有一个主线程。当程序退出时，所有新线程已经使用 pthread_join() 合并了。这就是应该如何处理在程序中创建的每个新线程的过程。如果没有合并一个新线程，则它仍然对系统的最大线程数限制不利。这意味着如果未对线程做正确的清理，最终会导致 pthread_create() 调用失败。</p>
<hr />
<h3>无父，无子</h3>
<p>如果使用过 fork() 系统调用，可能熟悉父进程和子进程的概念。当用 fork() 创建另一个新进程时，新进程是子进程，原始进程是父进程。这创建了可能非常有用的层次关系，尤其是等待子进程终止时。例如，waitpid() 函数让当前进程等待所有子进程终止。waitpid() 用来在父进程中实现简单的清理过程。</p>
<p>而 POSIX 线程就更有意思。您可能已经注意到我一直有意避免使用&#8220;父线程&#8221;和&#8220;子线程&#8221;的说法。这是因为 POSIX 线程中不存在这种层次关系。虽然主线程可以创建一个新线程，新线程可以创建另一个新线程，POSIX 线程标准将它们视为等同的层次。所以等待子线程退出的概念在这里没有意义。POSIX 线程标准不记录任何&#8220;家族&#8221;信息。缺少家族信息有一个主要含意：如果要等待一个线程终止，就必须将线程的 tid 传递给 pthread_join()。线程库无法为您断定 tid。</p>
<p>对大多数开发者来说这不是个好消息，因为这会使有多个线程的程序复杂化。不过不要为此担忧。POSIX 线程标准提供了有效地管理多个线程所需要的所有工具。实际上，没有父/子关系这一事实却为在程序中使用线程开辟了更创造性的方法。例如，如果有一个线程称为线程 1，线程 1 创建了称为线程 2 的线程，则线程 1 自己没有必要调用 pthread_join() 来合并线程 2，程序中其它任一线程都可以做到。当编写大量使用线程的代码时，这就可能允许发生有趣的事情。例如，可以创建一个包含所有已停止线程的全局&#8220;死线程列表&#8221;，然后让一个专门的清理线程专等停止的线程加到列表中。这个清理线程调用 pthread_join() 将刚停止的线程与自己合并。现在，仅用一个线程就巧妙和有效地处理了全部清理。</p>
<a href="http://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/index.html" target="_blank">更多资料</a><img src ="http://www.cppblog.com/JulyRina/aggbug/210063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-03-16 21:18 <a href="http://www.cppblog.com/JulyRina/archive/2015/03/16/210063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClamAV源码解析之ClamAV运行流程</title><link>http://www.cppblog.com/JulyRina/archive/2015/03/09/209985.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Mon, 09 Mar 2015 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/03/09/209985.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209985.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/03/09/209985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209985.html</trackback:ping><description><![CDATA[下图很好的概括了ClamAV的运行流程。<br /><img src="http://www.cppblog.com/images/cppblog_com/julyrina/1333254492_5521.jpg" width="725" height="1024" alt="" /><br /><img src ="http://www.cppblog.com/JulyRina/aggbug/209985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-03-09 23:14 <a href="http://www.cppblog.com/JulyRina/archive/2015/03/09/209985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClamAV简介与安装</title><link>http://www.cppblog.com/JulyRina/archive/2015/03/09/209982.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Mon, 09 Mar 2015 11:41:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/03/09/209982.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209982.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/03/09/209982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209982.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209982.html</trackback:ping><description><![CDATA[<h3><font style="color:GoldenRod ">ClamAV 简介以及适用范围</font></h3>
<hr />
<a href="http://www.clamav.net/index.html" target="_blank">ClamAV</a>是一个在命令行下查毒软件，因为它不将杀毒作为主要功能，默认只能查出您计算机内的病毒，但是无法清除，至多删除文件。ClamAV可以工作很多的平台上，但是有少数无法支持，这就要取决您所使用的平台的流行程度了。另外它主要是来防护一些WINDOWS病毒和木马程序。另外，这是一个面向服务端的软件。<br />
<h4>需要反病毒软件？免费么？</h4>
<hr />
绝大多数的Linux都是很先进的，所以，很少有病毒能够在linux上运行和繁衍。而且，由于目前PC都使用的是Windows，所以病毒制造者们更愿意去写Windows下的病毒。但是还有很多的原因能致使您使用一些病毒扫描程序的，比如：<br />
<ul>
     <li>扫描在您计算机上的Windows设备</li>
     <li>扫描在本地网络中的Windows计算机</li>
     <li>扫描您即将要传送给别人的文件</li>
     <li>扫描您将要发送给别人的EMAIL</li>
</ul>
<h3><font style="color:GoldenRod ">ClamAV 安装设置</font></h3>
<hr />
<h4>安装ClamAV</h4>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->sudo&nbsp;apt-<span style="color: #0000FF; ">get</span>&nbsp;install&nbsp;clamav</div>
这里有两种的ClamAV供您选择 1.手动：安装ClamAV的安装包 2.自动：安装ClamAV-daemon 这两种都可以安装ClamAV，但是要是使用上面的方法，是手动的。 在您安装完成之后，您可能被程序问及一些问题，比如怎么去升级。这就需要您选择一个离您比较近的服务器来升级。ClamAV的升级程序是很小的，所以很值得去自动升级。<br />
<h4>怎么使用ClamAV</h4>
<hr />
<pre><strong>这部分将会介绍安装之后的使用</strong></pre>
<font style="color:GoldenRod">升级我的病毒库</font>
<hr />
运行 sudo freshclam.<br />
您将会看见以下说明<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->user@ubuntu:/etc/clamav&nbsp;#&nbsp;sudo&nbsp;freshclam<br />
ClamAV&nbsp;update&nbsp;process&nbsp;started&nbsp;at&nbsp;Wed&nbsp;Apr&nbsp;27&nbsp;00:06:47&nbsp;2005<br />
main.cvd is&nbsp;up&nbsp;to&nbsp;date&nbsp;(version:&nbsp;31,&nbsp;sigs:&nbsp;33079,&nbsp;f-level:&nbsp;4,&nbsp;builder:&nbsp;tkojm)<br />
daily.cvd is&nbsp;up&nbsp;to&nbsp;date&nbsp;(version:&nbsp;855,&nbsp;sigs:&nbsp;714,&nbsp;f-level:&nbsp;4,&nbsp;builder:&nbsp;ccordes)</div>
<h3></h3>
<font style="color:GoldenRod">使用ClamAV扫描我计算机中的文件</font>
<hr />
运行 clamscan.<br />
这里附带一些例子<br />
<ul>
     <li>扫描所有用户的主目录就使用 clamscan -r /home</li>
     <li>扫描您计算机上的所有文件并且显示所有的文件的扫描结果，就使用 clamscan -r /</li>
     <li>扫描您计算机上的所有文件并且显示有问题的文件的扫描结果， 就使用 clamscan -r --bell -i /</li>
     <li>当clamAV扫描完所有文件的时候，会显示如下的类似报告</li>
</ul>
<pre><font style="color:red">ClamAV只会去扫描对于ClamAV可以读取的文件。 如果您想扫描所有文件，在命令前加上 sudo .</font></pre>
<font style="color:GoldenRod">使ClamAV以daemon防护的方式运行</font>
<hr />
安装clamav-daemon就可以了，clamav-daemon将会建立一个名为'clamav'的帐户，这是为了可以使ClamAV扫描一些系统文件，比如您的Email存放的地方，您可以添加'clamav'为这些文件或者目录的所有者。<br />
<hr />
<font style="color:GoldenRod">如何知道clamav-daemon是否运行了?</font>
<hr />
查看进程列表就可以了: <br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->ps&nbsp;ax&nbsp;|&nbsp;grep&nbsp;[c]lamd</div>
<font style="color:GoldenRod">如何删除病毒文件？</font>
在扫描的时候，您可以添加'--remove'<br />
<font style="color:GoldenRod">如何知道我现在使用的ClamAV版本？</font>
<hr />
执行 clamscan -V<br />
<font style="color:GoldenRod">如何使ClamAV按计划自动运行</font>
<hr />
您可以使用'at'命令来使clamscan和freshclam运行，比如
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->at&nbsp;3:30&nbsp;tomorrow<br />
at&gt;clamscan&nbsp;-i&nbsp;/home/user&nbsp;&gt;&nbsp;mail&nbsp;user@example.com<br />
at&gt;&nbsp;&lt;CTRL-D&gt;<br />
job&nbsp;3&nbsp;at&nbsp;2015-03-10&nbsp;03:30</div>
或者编辑 /etc/crontab 加入以下内容<br />
0 3 * * * root /usr/bin/freshclam --quiet -l /var/log/clamav/clamav.log ＃＃每天3点升级<br />
<br />
更多内容请参见<a href="http://wiki.ubuntu.org.cn/ClamAV" target="_blank">Ubuntu中文社区ClamAV专栏</a>。
<img src ="http://www.cppblog.com/JulyRina/aggbug/209982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-03-09 19:41 <a href="http://www.cppblog.com/JulyRina/archive/2015/03/09/209982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>