免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2976 | 回复: 0
打印 上一主题 下一主题

sftp浏览 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-25 17:34 |只看该作者 |倒序浏览
想作1个类winscp,目前只作出1个通过sftp浏览远程服务器的界面,如有希望,继续无谓的努力:
1. 看看sort怎么折腾
2. 加几个菜单选项
==========================================================
import wx
import sys,glob,random,os,re
import paramiko
import socket,stat,time
import _winreg as winreg
import traceback,StringIO
   
def sftp(host,user,passwd,port=22):
        mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        mysock.settimeout(None)
        mysock.connect((host,port),)
        myssh = paramiko.Transport(mysock)
        myssh.set_keepalive(60)
        try:
            myssh.connect(username=user,password=passwd)
        except paramiko.AuthenticationException,r:
            print "paramiko.AuthenticationException: ",r            
        mysftp = myssh.open_sftp_client()
        return mysock,myssh,mysftp
def isdir(sftp,src):
    return stat.S_ISDIR(sftp.stat(src).st_mode)                           
   
def dealicon(iconfile,width=16,height=16):
    '''
# 由于icon和bmp不能进行大小变化, 需要icon->bmp->image->bmp 才可;
    '''
    tmpimage = wx.ImageFromBitmap(wx.BitmapFromIcon(wx.Icon(iconfile,wx.BITMAP_TYPE_ICO)))
    tmpimage = tmpimage.Scale(width,height)
    bmp = wx.BitmapFromImage(tmpimage)
    return bmp
        
def listrdir(sftp,dirname='.'):
    dirname = dirname.strip()
    lists = sftp.listdir_attr(dirname)   
    #basedir = sftp.getcwd()  
    columnlist = []
    columndesc = ['filename','size','last modify time','rights','owner','group',]
    c_filename = None
    c_size = None
    c_atime = None
    c_rights = None
    c_owner = None
    c_group = None
    for l in lists:
        c_filename = l.filename
        if isdir(sftp,'%s/%s' %(dirname,c_filename)):
            c_icon = 'c:\windows\system32\\shell32.dll;3'  # 文件夹的选用图标文件
        else:  c_icon = fileimage(c_filename)
        
        c_size = l.st_size
        c_atime = l.st_atime
        c_rights = l.longname.split()[0]
        c_owner = l.longname.split()[2]
        c_group = l.longname.split()[3]
        columnlist.append(((c_filename,str(c_size),time.ctime(c_atime),c_rights,c_owner,c_group),dealicon(c_icon)))
    columnlist.sort()
    columnlist.insert(0,(('..','','','','',''),dealicon('c:\windows\system32\\shell32.dll;87')))   # 在顶上插入1条上一级目录选择
    return columnlist      
def sshclose(sock,ssh,sftp):
    sftp.close()
    ssh.close()
    sock.close()  
   
def fileimage(filename):
    fileicon = None
    suffix = extrsuffix(filename)
    if suffix:  fileicon = regicon(suffix)
    if not fileicon:  fileicon = 'c:\windows\system32\\shell32.dll;0'
    return fileicon        
def extrsuffix(filename):
    m = re.match(r'.*(\.\w+)$',filename)
    if m:  return m.group(1)
    else: return None
        
def regicon(suffix):
    '''
# 通过注册表查找相应文件后缀打开方式
# 1. 通过suffix的default(即''),取得detail file
# 2. 如果detail file存在一个FriendlyTypeName,取该数值;
# 3. 否则取detail file 的DefaultIcon;
# 4. 若该值为%1,表示已注册在classID, 则通过对应的class id找到DefaultIcon;
    '''
    try:   
        k1 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,suffix)
        v1 = winreg.QueryValueEx(k1,'')[0]              
        k2 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s\DefaultIcon' %(v1))
        v = winreg.QueryValueEx(k2,'')[0]
        
        if v == '"%1"':
            k3 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s\CLSID' %(v1))
            clsid = winreg.QueryValueEx(k3,'')[0]
            k4 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'CLSID\%s\DefaultIcon' %(clsid))
            v = winreg.QueryValueEx(k4,'')[0]  
        else:
            try:
                k2 = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT,'%s' %(v1))
                v = winreg.QueryValueEx(k2,'FriendlyTypeName')[0]
            except:  pass
        v = re.sub(r'(.*),(\d+$)',r'\1;\2',v)
        v = re.sub(r'(.*),(-\d+$)',r'\1;0',v)
        v = re.sub(r'@{0,1}%SystemRoot%',os.environ['SYSTEMROOT'],v)      
        return v  
      
    except:
        t , v, tb = sys.exc_info()
        errstr = StringIO.StringIO()
        test_tb = traceback.print_exception(t,v,tb,file=errstr)
        errstr.close()     
        return None
        
        
class scpdemo(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,'report mode test',size=(600,400))
        self.list = wx.ListCtrl(self,-1,style=wx.LC_REPORT)
        #self.list.AssignImageList(il,wx.IMAGE_LIST_SMALL)        
        host = '1.1.1.1'
        user = 'root'
        passwd = 'root'
        self.mysock,self.myssh,self.mysftp = sftp(host,user,passwd)  
        columndesc = ['filename','size','last modify time','rights','owner','group',]        
        for col,text in enumerate(columndesc):
            self.list.InsertColumn(col,text)   
        rows,imagelist = zip(*listrdir(self.mysftp,'. '))
        
        self.il = wx.ImageList(16,16,True)
        for bmp in imagelist:  il_max = self.il.Add(bmp)
        self.list.AssignImageList(self.il,wx.IMAGE_LIST_SMALL)        
        
        i = 0
        for item in rows:
            #self.list.InsertStringItem(i, item[0])
            index = self.list.InsertStringItem(i,item[0])
            for col,text in enumerate(item[1:]):
                #print type(text)
                self.list.SetStringItem(index,col+1,text)
                self.list.SetItemImage(index,i,i)
            i = i + 1
        
        for i in range(0,len(columndesc)):
            self.list.SetColumnWidth(i,wx.LIST_AUTOSIZE)
            
        self.Bind(wx.EVT_CLOSE,self.OnExit)
        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)
        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDclicked,self.list)
        self.list.Bind(wx.EVT_LEFT_DCLICK,self.anotherdbclicked)
        self.itemforchange = None
        self.nowdir = '.'
        
    def listchange(self,sdir='.'):
        self.list.DeleteAllItems()
        self.il.RemoveAll()   
        rows,imagelist = zip(*listrdir(self.mysftp,sdir))   
        for bmp in imagelist: il_max = self.il.Add(bmp)
        i = 0
        for item in rows:
            self.list.InsertImageStringItem(i,item[0],i)
            for col,text in enumerate(item[1:]):
                self.list.SetStringItem(i,col+1,text)
            i = i + 1
        self.list.Refresh()   
   
    def getnowdir(self):
        return self.nowdir + '/' + self.itemforchange
   
    def getColumnText(self, index, col):
        item = self.list.GetItem(index, col)
        return item.GetText()        
            
    def OnExit(self,evt):
        print self.mysftp,self.myssh, self.mysock
        if self.mysftp:  self.mysftp.close()
        if self.myssh:  self.myssh.close()
        if self.mysock:  self.mysock.close()
        self.Destroy()
     
    def resetselect(self):
        self.nowitem = None
        self.lastitem = None
     
    def OnDclicked(self,evt):
        print "double clicked"
        self.itemforchange = evt.GetItem().GetText()           
        if isdir(self.mysftp,self.getnowdir()):  # deal with dir
            self.nowdir = self.getnowdir()
            print "test::: choose is dir, wait to open it ..", self.nowdir
            self.listchange(self.nowdir)
        else:  # deal with file
            print "choose if file, do nothing "
            pass
   
    def anotherdbclicked(self,evt):
        print "another click monitor on self.list"
        evt.Skip()
            
     
    def OnItemSelected(self, event):   
        self.currentItem = event.m_itemIndex
        
        print ("OnItemSelected: %s, %s, %s, %s\n" %
                           (self.currentItem,
                            self.list.GetItemText(self.currentItem),
                            self.getColumnText(self.currentItem, 1),
                            self.getColumnText(self.currentItem, 2)))   
        self.list.SetItemState(self.currentItem,4,4)        
        '''
        wx.LIST_STATE_CUT  = 8
        wx.LIST_STATE_DONTCARE = 0
        wx.LIST_STATE_DROPHILITED = 1
        wx.LIST_STATE_FOCUSED = 2
        wx.LIST_STATE_SELECTED = 4
        '''
    def OnItemDeselected(self,event):
        pass
        
            
app =wx.PySimpleApp()
frame = scpdemo()
frame.Show()
app.MainLoop()
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57278/showart_1944441.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP