您的位置:首页 > 其它

paramiko intertive.py文件简单修改记录用户输入命令 v1

2016-09-15 09:40 232 查看
# Copyright (C) 2003-2007  Robey Pointer <robeypointer@gmail.com>
#
# This file is part of paramiko.
#
# Paramiko is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Paramiko is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Paramiko; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.

import socket
import sys
from paramiko.py3compat import u
import time

# windows does not have termios...
try:
import termios
import tty
has_termios = True
except ImportError:
has_termios = False

def interactive_shell(chan):
if has_termios:
posix_shell(chan)
else:
windows_shell(chan)

def posix_shell(chan):
import select

oldtty = termios.tcgetattr(sys.stdin)
try:
tty.setraw(sys.stdin.fileno())
tty.setcbreak(sys.stdin.fileno())
chan.settimeout(0.0)
recode = []
cmd = ''
log_file = "audit_log_%s.log" % time.strftime('%Y_%m_%d')
f = file(log_file,'ab+')

while True:
r, w, e = select.select([chan, sys.stdin], [], [])
if chan in r:
try:
x = u(chan.recv(1024))
if len(x) == 0:
sys.stdout.write('\r\n*** EOF\r\n')
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read(1)
cmd += x
if x == '\r':
#print "cmd===>",cmd
cmd_time = time.strftime('%Y-%m-%d-%H-%M-%S')
log_line = "username:192.169.10.12:root:%s       %s \n     " %(cmd_time,cmd)
f.write(log_line)
print log_line
cmd = ''
if len(x) == 0:
break
chan.send(x)
else:
f.close()

finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)

# thanks to Mike Looijmans for this code
def windows_shell(chan):
import threading

sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n")

def writeall(sock):
while True:
data = sock.recv(256)
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush()

writer = threading.Thread(target=writeall, args=(chan,))
writer.start()

try:
while True:
d = sys.stdin.read(1)
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  paramiko 简单修改
相关文章推荐