<pre class="python"><span style="color: #008000;">#!/usr/local/bin/python
</span>

<span style="color: #008000;"># $Id: knock.py,v 1.2 2004/02/06 22:29:38 len Exp $
</span>
<span style="color: #008000;"># Latest version can be found at http://nemesisit.rdsnet.ro/len
</span>
<span style="color: #008000;"># Copyright (C) Marilen Corciovei <marilen.corciovei@nemesisit.ro>
</span><span style="color: #008000;">#
</span><span style="color: #008000;"># This program is free software; you can redistribute it and/or modify
</span><span style="color: #008000;"># it under the terms of the GNU General Public License as published by
</span><span style="color: #008000;"># the Free Software Foundation; either version 2 of the License, or
</span><span style="color: #008000;"># (at your option) any later version.  This program is distributed in
</span><span style="color: #008000;"># the hope that it will be useful, but WITHOUT ANY WARRANTY; without
</span><span style="color: #008000;"># even the implied warranty of MERCHANTABILITY or FITNESS FOR A
</span><span style="color: #008000;"># PARTICULAR PURPOSE.  See the GNU General Public License for more
</span><span style="color: #008000;"># details; it is available at <http://www.fsf.org/copyleft/gpl.html>
</span>
<span style="color: #004080;">""" knock.py -- Demonstrate the portknock concept at client side """</span>

<span style="color: #c00000;">import</span> <span style="color: #000000;">socket</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">fcntl</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">os</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">sys</span>
<span style="color: #c00000;">import</span> <span style="color: #000000;">select</span>

<span style="color: #004080;">""" Configs. CHANGE FOR YOUR CONFIGURATION """</span>

<span style="color: #000000;">ipdest</span> <span style="color: #0000c0;">=</span> <span style="color: #004080;">"10.10.10.23"</span>                   <span style="color: #008000;">#remote ip</span>
<span style="color: #000000;">portseq</span> <span style="color: #0000c0;">=</span> <span style="color: #0000c0;">[</span><span style="color: #0080c0;">4005</span><span style="color: #0000c0;">,</span> <span style="color: #0080c0;">40034</span><span style="color: #0000c0;">,</span> <span style="color: #0080c0;">9001</span><span style="color: #0000c0;">]</span>            <span style="color: #008000;">#port sequence</span>
<span style="color: #000000;">timeout</span> <span style="color: #0000c0;">=</span> <span style="color: #0080c0;">3</span>                              <span style="color: #008000;">#timeout waiting for connection</span>

<span style="color: #c00000;">def</span> <span style="color: #000000;">conn</span><span style="color: #0000c0;">(</span><span style="color: #000000;">sock</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">addr</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">dumbhack</span><span style="color: #0000c0;">=</span><span style="color: #000000;">None</span><span style="color: #0000c0;">)</span><span style="color: #0000c0;">:</span>

<span style="color: #000000;">sock</span><span style="color: #0000c0;">.</span><span style="color: #000000;">setblocking</span><span style="color: #0000c0;">(</span><span style="color: #0080c0;">0</span><span style="color: #0000c0;">)</span>
<span style="color: #c00000;">try</span><span style="color: #0000c0;">:</span>
<span style="color: #000000;">sock</span><span style="color: #0000c0;">.</span><span style="color: #000000;">connect</span><span style="color: #0000c0;">(</span><span style="color: #000000;">addr</span><span style="color: #0000c0;">)</span>
<span style="color: #c00000;">except</span> <span style="color: #000000;">socket</span><span style="color: #0000c0;">.</span><span style="color: #000000;">error</span><span style="color: #0000c0;">:</span>
<span style="color: #c00000;">pass</span>

<span style="color: #000000;">r</span><span style="color: #0000c0;">,</span><span style="color: #000000;">w</span><span style="color: #0000c0;">,</span><span style="color: #000000;">e</span> <span style="color: #0000c0;">=</span> <span style="color: #000000;">select</span><span style="color: #0000c0;">.</span><span style="color: #000000;">select</span><span style="color: #0000c0;">(</span><span style="color: #0000c0;">[</span><span style="color: #0000c0;">]</span><span style="color: #0000c0;">,</span> <span style="color: #0000c0;">[</span><span style="color: #000000;">sock</span><span style="color: #0000c0;">]</span><span style="color: #0000c0;">,</span> <span style="color: #0000c0;">[</span><span style="color: #0000c0;">]</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">timeout</span><span style="color: #0000c0;">)</span>
<span style="color: #c00000;">if</span> <span style="color: #000000;">w</span><span style="color: #0000c0;">:</span>
<span style="color: #c00000;">print</span> <span style="color: #004080;">'socket open !?'</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">addr</span>
<span style="color: #c00000;">else</span><span style="color: #0000c0;">:</span>
<span style="color: #c00000;">print</span> <span style="color: #004080;">'knock socket'</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">addr</span>

<span style="color: #c00000;">def</span> <span style="color: #000000;">knock_knock</span><span style="color: #0000c0;">(</span><span style="color: #0000c0;">)</span><span style="color: #0000c0;">:</span>

<span style="color: #c00000;">for</span> <span style="color: #000000;">port</span> <span style="color: #c00000;">in</span> <span style="color: #000000;">portseq</span><span style="color: #0000c0;">:</span>
<span style="color: #000000;">s</span> <span style="color: #0000c0;">=</span> <span style="color: #000000;">socket</span><span style="color: #0000c0;">.</span><span style="color: #000000;">socket</span><span style="color: #0000c0;">(</span><span style="color: #000000;">socket</span><span style="color: #0000c0;">.</span><span style="color: #000000;">AF_INET</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">socket</span><span style="color: #0000c0;">.</span><span style="color: #000000;">SOCK_STREAM</span><span style="color: #0000c0;">)</span>
<span style="color: #000000;">conn</span><span style="color: #0000c0;">(</span><span style="color: #000000;">s</span><span style="color: #0000c0;">,</span> <span style="color: #0000c0;">(</span><span style="color: #000000;">ipdest</span><span style="color: #0000c0;">,</span> <span style="color: #000000;">port</span><span style="color: #0000c0;">)</span><span style="color: #0000c0;">)</span>
<span style="color: #000000;">s</span><span style="color: #0000c0;">.</span><span style="color: #000000;">close</span><span style="color: #0000c0;">(</span><span style="color: #0000c0;">)</span>

<span style="color: #c00000;">if</span> <span style="color: #000000;">__name__</span><span style="color: #0000c0;">==</span><span style="color: #004080;">'__main__'</span><span style="color: #0000c0;">:</span>
<span style="color: #000000;">knock_knock</span><span style="color: #0000c0;">(</span><span style="color: #0000c0;">)</span>