python使用paramiko模块实现ssh远程登陆
程序执行时需要读取两个文件command.txt和ipandpass.txt。格式如下:
复制代码代码如下:
command.txt:
ThreadNum:1
port:22
local_dir:hello_mkdir
remote_dir:hello_mkdir
alter_auth:chmod 755 hello_mkdir
exec_program:./hello_mkdir
ipandpass.txt:
ip username password
程序中的队列操作是修改的别的程序,写的确实不错。
该程序亦正亦邪,如果拿去做坏事,我先声明与我无关,我只是分享我的代码罢了。
希望有兴趣的同志们来讨论技术应用。
这其中用到了paramiko,队列,多线程,后续也会写一些这三个方面的东西。欢迎批评指正。
其实这个程序有些地方还有待优化。
复制代码代码如下:
#function:upload files through ssh protocal and excute the files
#lib:paramiko
#MyThread:init a thread to run the function
#ThreadPol:init a thread pool
#uploadAndExecu:upload file and excute
#readConf:read config file
#-- coding = utf-8 --
import Queue
import sys
import threading
import paramiko
import socket
from threading import Thread
import time
class MyThread(Thread):
def init(self, workQueue, timeout=1):
Thread.init(self)
self.timeout = timeout
self.setDaemon(False)
self.workQueue = workQueue
self.start()
#print ‘i am runnning …’
def run(self):emptyQueue = 0while True:try:callable, username, password, ipAddress, port,comms = self.workQueue.get(timeout = self.timeout)#print 'attacking :',ipAddress,username,password,threading.currentThread().getName(),' time : 'callable(username,password, ipAddress, port,comms)except Queue.Empty:print threading.currentThread().getName(),":queue is empty ; sleep 5 seconds\\n"emptyQueue += 1#judge the queue,if it is empty or not.time.sleep(5)if emptyQueue == 5:print threading.currentThread().getName(),'i quit,the queue is empty'breakexcept Exception, error:print error
class ThreadPool:
def init(self, num_of_threads=10):
self.workQueue = Queue.Queue()
self.threads = []
self.__createThreadPool(num_of_threads)
#create the threads pool
def __createThreadPool(self, num_of_threads):for i in range(num_of_threads):thread = MyThread(self.workQueue)self.threads.append(thread)def wait_for_complete(self):#print len(self.threads)while len(self.threads):thread = self.threads.pop()if thread.isAlive():thread.join()def add_job(self, callable, username, password, ipAddress, Port,comms):self.workQueue.put((callable, username, password, ipAddress, Port,comms))
def uploadAndExecu(usernam,password,hostname,port,comm):
print usernam,password,hostname,port,comm
try:
t = paramiko.Transport((hostname,int(port)))t.connect(username=username,password=password)sftp=paramiko.SFTPClient.from_transport(t)sftp.put(comm['local_dir'],comm['remote_dir'])
except Exception,e:print 'upload files failed:',et.close()
finally:t.close()try:ssh = paramiko.SSHClient()ssh.load_system_host_keys()ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())ssh.connect(hostname, port=int(port), username=username, password=password)ssh.exec_command(comm['alter_auth'])ssh.exec_command(comm['exec_program'])
except Exception,e:print 'chang file auth or execute the file failed:',e
ssh.close()
def readConf():
comm={}
try:
f = file(‘command.txt’,‘r’)
for l in f:
sp = l.split(‘:’)
comm[sp[0]]=sp[1].strip(‘\\n’)
except Exception,e:
print ‘open file command.txt failed:’,e
f.close()
return comm
if name == “main”:
commandLine = readConf()
print commandLine
#prepare the ipswm = ThreadPool(int(commandLine['ThreadNum']))try:ipFile = file('ipandpass.txt','r')
except:print "[-] ip.txt Open file Failed!"sys.exit(1)for line in ipFile:IpAdd,username,pwd = line.strip('\\r\\n').split(' ')wm.add_job(uploadAndExecu,username,pwd,IpAdd,commandLine['port'],commandLine)