python—pexpect用户操作linux系统命令,命令信息保存到日志
1、在kali linux 中配置如下
root@kali:~/python/anquangongji# pwd
/root/python/anquangongji
root@kali:~/python/anquangongji# ls
checkfile.py dictionary.txt pexpectcreaksshpassword.py pexpectshhnocommand.py scanmultports.py
cmd.log openfiletest.py pexpectftplogin.py pexpectshhusecommand.py vulnbanners.txt
crarkpassword.py passwordunix.txt pexpectlog.py scanerftpbanner.py vulnftpbanner.txt
root@kali:~/python/anquangongji#
2、脚本:
root@kali:~/python/anquangongji#
root@kali:~/python/anquangongji# cat pexpectlog.py
#!/usr/bin/python
#--*-- coding:utf-8 --*--
import os,sys,getopt
import traceback
import pexpect
#使用方法:python pexpectlog.py -a -c pwd cmd.log中的pwd为命令,存储的日志文件为cmd.log文件,存储的日志会自动累加保存cmd.log文件中
#使用方法:python pexpectlog.py -c pwd cmd.log中的pwd为命令,存储的日志文件为cmd.log文件,只存储最后一条的命令运行日志信息
def exit_with_usage():
print globals()["__doc__"]
os._exit(1)
def main():
try:
optlist,args = getopt.getopt(sys.argv[1:],"h?ac:",["help","h","?"])
#如果指定的参数不是"-a",-h",-c",-?",--help","--h"或"--?"时,会抛出exception,这里catch住,然后打印出,exception的信息,并输出usage提示信息
except Exception,e:
print str(e)
exit_with_usage()
options = dict(optlist)
if len(args) > 1:#最多只能指定一个logfile,否则出错
exit_with_usage()
if [elem for elem in options if elem in ["-a","-h","-c","-?","--help"]]:#如果指定的是'-h','--h','-?','--?'或'--help',只输出usage提示信息
print "Help:"
exit_with_usage()
if len(args) == 1:#获取logfile的名字
script_filename = args[0]
else:#如果用户没指定,默认logfile的名字是command.log
script_filename = "command.log"
if "-a" in options:#如果用户指定了参数-a,如果之前该logfile存在,那么接下来的内容会附加在原先内容之后,如果之前没有该logfile新建一个文件,并且接下来将内容写入到该文件中
fout = open(script_filename,"ab")
else:#如果用户没指定参数-a,默认按照用户指定logfile文件名新建一个文件,然后将接下来将内容写入到该文件中
fout = open(script_filename,"wb")
if "-c" in options:#如果用户指定了-c参数,那么运行用户指定的命令
command = options["-c"]
else:#如果用户没有指定-c参数,那么默认运行命令'ls -la'
command = "ls -la"
fout.write("===============Log Title: wuwuheihei================")
fout.write("\n")
fout.write("你输入的命令是:")
fout.write(command)
fout.write("\n")
p = pexpect.spawn(command)#为接下来的运行命令生成一个pexpect的spawn类子程序的对象
p.logfile = fout#将之前open的file对象指定为spawn类子程序对象的log文件
p.expect(pexpect.EOF)#命令运行完后,expect EOF出现,这时会将spawn类子程序对象的输出写入到log文件
fout.close()#open完文件,使用完毕后,需关闭该文件
return 0
if __name__ == "__main__":
try:
main()
except SystemExit,e:
raise e
except Exception,e:
print "ERROR"
print str(e)
traceback.print_exc()
os._exit(1)
root@kali:~/python/anquangongji#
3、脚本运行情况:
root@kali:~/python/anquangongji# vi cmd.log
root@kali:~/python/anquangongji# cat cmd.log
root@kali:~/python/anquangongji# clear
root@kali:~/python/anquangongji# python pexpectlog.py -a -c ifconfig cmd.log
root@kali:~/python/anquangongji# python pexpectlog.py -a -c pwd cmd.log
root@kali:~/python/anquangongji# python pexpectlog.py -a -c ls cmd.log
root@kali:~/python/anquangongji# cat cmd.log
===============Log Title: wuwuheihei================
你输入的命令是:ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:ad:34:08
inet addr:192.168.100.139 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fead:3408/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2104610 errors:0 dropped:1370 overruns:0 frame:0
TX packets:266409 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:299484980 (285.6 MiB) TX bytes:26903598 (25.6 MiB)
Interrupt:19 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:52636 errors:0 dropped:0 overruns:0 frame:0
TX packets:52636 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5058696 (4.8 MiB) TX bytes:5058696 (4.8 MiB)
===============Log Title: wuwuheihei================
你输入的命令是:pwd
/root/python/anquangongji
===============Log Title: wuwuheihei================
你输入的命令是:ls
checkfile.py passwordunix.txt pexpectshhusecommand.py
cmd.log pexpectcreaksshpassword.py scanerftpbanner.py
crarkpassword.py pexpectftplogin.py scanmultports.py
dictionary.txt pexpectlog.py vulnbanners.txt
openfiletest.py pexpectshhnocommand.py vulnftpbanner.txt
root@kali:~/python/anquangongji#
参考:https://www.cnblogs.com/dkblog/archive/2013/03/20/2970738.html