##入門
這將是第一個一系列關于python編程的博客文章。python是一門非常強大的語言,因為它有信息安全社區的支撐。這意味著很多工具都是由python編寫并且可以在腳本中調用很多模塊。使用模塊的好處就是只需要少量的代碼就能夠完成所需的任務。
這篇文章假定你的系統是Linux,python版本是2.*。在寫代碼的時候你也可以直接的寫在解釋器里面(linux里面輸入python即可進入),也可以把代碼放到一個文件里面。很多人會發現把代碼存放到文件里面要比直接寫在解釋器上面要好很多。值得注意的是python 中強制縮進。大家在寫函數聲明,循環,if/else語句等等的時候就會發現。
**python解釋器**
在終端里面輸入python:
```
~$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
輸入之后你就可以直接在解釋器里面寫你的代碼了。下面我們將聲明兩個變量,并且使用type()函數查看變量的類型。假設我們聲明了一個字符串和整型:
```
>>>
>>> ip = '8.8.8.8'
>>> port = 53
>>>
>>> type(ip)
<type 'str'>
>>>
>>> type(port)
<type 'int'>
>>>
```
你可以使用內置的help()函數去了解一個函數的詳細。記住這一點,它可以幫助你在學習語言的時候學習到更多的詳細內容.
```
>>>
>>> help(type)
>>>
```
有時你會想把一些變量和字符串連接起來然后通過腳本顯示出來。那么你就需要使用str()函數把整型轉換成字符串類型
```
>>> ip='1.1.1.1'
>>> port=55
>>> print 'the ip is:'+ip+'and the port is:'+str(port)
the ip is:1.1.1.1and the port is:55
```
前面聲明變量的時候"IP"就是一個字符串就不需要轉換,而"port"就需要。現在你就已經知道了兩個基本的數據類型(string和integer)。現在你可以試試使用內置函數與這兩個數據類型寫出其他的代碼。
Python字符串允許你通過偏移值來獲取你想需要的字符串,并且可以通過len()函數來獲取字符串的長度,它可以幫助你更方便的操作字符串。
```
>>>
>>> domain='primalsecurity.net'
>>> domain
'primalsecurity.net'
>>> domain[0]
'p'
>>> domain[0:3]
'pri'
>>> domain[1:]
'rimalsecurity.net'
>>> len(domain)
18
```
你可以使用內建的dir()函數來列出模塊定義的標識符。標識符有函數、類和變量。
```
>>> dir(ip)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
```
現在你可以使用上面列舉出來的內建字符串函數,如果想知道這個函數的更多描述可以參考前面提到的help()函數:
```
>>>
>>> help(ip.split)
>>>
>>> string = ip+':'+str(port)
>>> string
'8.8.8.8:53'
>>>
>>> string.split(':')
['8.8.8.8', '53']
```
這split函數把一個字符串通過":"切割生成一個新的列表。這是一個非常有用的字符串函數因為你能夠把這個字符串里面的有用信息提出出來。例如,你獲取到了一個ip列表,你想在這個列表里面添加一個索引值。你也可以刪除和添加新的值到這個列表里面通過.append()和.remove()函數
```
>>>
>>> list = string.split(':')
>>>
>>> list
['8.8.8.8', '53']
>>>
>>> list[0]
'8.8.8.8'
>>>
>>> list.append('google')
>>> list
['8.8.8.8', '53', 'google']
>>> list.remove('google')
>>> list
['8.8.8.8', '53']
>>>
```
**Python模塊**
在上面提到過,Python模塊能夠讓你用少量的代碼就能夠完成你的任務,Python有許多有用的內建模塊(os,subprocess,socket,urllib,httplib,re,sys等等)和第三方模塊(cymruwhois,scapy,dpkt,spider等等).使用Python模塊很簡單"import <moduleNmae>". OS模塊是非常重要的因為你需要在你的Python代碼里面調用系統命令:
```
>>>
>>> import os
>>>
>>> dir(os)
['EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_OK', 'NGROUPS_MAX', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_LARGEFILE', 'O_NDELAY', 'O_NOATIME', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_RSYNC', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'P_NOWAIT', 'P_NOWAITO', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_APPEND', 'ST_MANDLOCK', 'ST_NOATIME', 'ST_NODEV', 'ST_NODIRATIME', 'ST_NOEXEC', 'ST_NOSUID', 'ST_RDONLY', 'ST_RELATIME', 'ST_SYNCHRONOUS', 'ST_WRITE', 'TMP_MAX', 'UserDict', 'WCONTINUED', 'WCOREDUMP', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result', '_pickle_stat_result', '_pickle_statvfs_result', '_spawnvef', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'ctermid', 'curdir', 'defpath', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'getcwd', 'getcwdu', 'getegid', 'getenv', 'geteuid', 'getgid', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getresgid', 'getresuid', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'popen2', 'popen3', 'popen4', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'rmdir', 'sep', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'symlink', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'ttyname', 'umask', 'uname', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write']
>>>
```
你可以看到上面os模塊給你提供了很多可以使用的功能函數,其中我發現我經常使用"os.system",我可給它傳遞一個命令,然后通過它去在系統底層執行我們傳遞的命令.下面我們將會執行一個命令"echo ‘UHJpbWFsIFNlY3VyaXR5Cg==’ | base64 -d":
```
>>>
>>> os.system("echo 'UHJpbWFsIFNlY3VyaXR5Cg==' | base64 -d")
Primal Security
>>>
```
**創建一個文件對象**
現在我們將演示一些例子,如何在Python里面從一個文件里面讀取數據和創建一個文件。下面的這個例子演示了如何創建一個文件對象,并且讀取/寫入數據到這個對象里面,通常你自己讀取一個文件的數據,并且做一些邏輯處理然后把輸出的寫到文件里面:
```
>>>
>>> file = open('test.txt', 'w')
>>> file.write('Hello World')
>>> file.close()
>>> file = open('test.txt', 'r')
>>> file.readlines()
['Hello World']
>>>
```
在Python解釋器里面練習上面的內容并且多加鞏固,因為這些內容在后面的章節里面會經常使用,當我寫代碼的時候,我喜歡打開兩個終端,一個用于執行python解釋器,還有一個用來把邏輯寫入到腳本里面。下一章將會寫一個真實的Python腳本, 聲明定義,類和sys模塊。