??? 這些日子在公司測試機頂盒游戲,每次啟動游戲的時候都要在windows黑色的dos窗口輸命令,非常不方便,于是借著自己剛學的一點點python+wxPython的知識,寫了這個telnet客戶端,功能比較簡單,根據需要可以再作修改。界面用wxGlade生成,本來我不喜歡wxGlade的,覺得不是很好用,但用著用著發現其實還不錯,生成的代碼也很容易和自己的代碼結合。
??? 輸入指令的輸入框有默認的指令提示,為了方便寫了個COMMAND指令列表,這是公司里用的,可以在源代碼中COMMADN列表中修改自己需要的指令,或者去掉COMMAND,直接往輸入框輸指令。
#!/usr/bin/env python
# -*- coding: GB2312 -*-
# @author 小星星 zyl198692@sina.com
# generated by wxGlade 0.6.3 on Mon Aug 17 13:50:13 2009
import wx
import telnetlib
import sys
# begin wxGlade: extracode
# end wxGlade
# 預先定義的指令列表
COMMAND=['busybox mount -t nfs -o nolock,ro,mountvers=2 192.168.1.128:/iptv /mnt','cd mnt/czy/llz/soundddz','sh run.sh']
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
# 初始化組件,由wxGlade產生
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, u"遠程登錄")
self.label_2 = wx.StaticText(self.panel_1, -1, u"地址:")
self.ip_ctrl = wx.TextCtrl(self.panel_1, -1, "192.168.18.11")
self.label_3 = wx.StaticText(self.panel_1, -1, u"端口:")
self.port_ctrl = wx.TextCtrl(self.panel_1, -1, "23")
self.label_4 = wx.StaticText(self.panel_1, -1, u"用戶:")
self.user_ctrl = wx.TextCtrl(self.panel_1, -1, "root")
self.label_5 = wx.StaticText(self.panel_1, -1, u"密碼:")
self.pwd_ctrl = wx.TextCtrl(self.panel_1, -1, "6e58f908")
self.label_6 = wx.StaticText(self.panel_1, -1, u"連接信息")
self.info_ctrl = wx.TextCtrl(self.panel_1, -1, "", style=wx.TE_MULTILINE)
self.label_7 = wx.StaticText(self.panel_1, -1, u"發送指令")
self.cmd_ctrl = wx.TextCtrl(self.panel_1, -1, "", style=wx.TE_MULTILINE)
self.send_btn = wx.Button(self.panel_1, -1, u"發送指令")
self.static_line_1 = wx.StaticLine(self.panel_1, -1)
self.logout_btn = wx.Button(self.panel_1, -1, u"退出登錄")
self.login_btn = wx.Button(self.panel_1, -1, u"遠程登錄")
self.clear_btn = wx.Button(self.panel_1, -1, u"清空信息")
self.exit_btn = wx.Button(self.panel_1, -1, u"退出程序")
# 組件添加屬性值,由wxGlade產生
self.__set_properties()
self.__do_layout()
# 按鈕事件綁定,由wxGlade產生
self.Bind(wx.EVT_BUTTON, self.OnSend, self.send_btn)
self.Bind(wx.EVT_BUTTON, self.OnLogout, self.logout_btn)
self.Bind(wx.EVT_BUTTON, self.OnLogin, self.login_btn)
self.Bind(wx.EVT_BUTTON, self.OnExit, self.exit_btn)
self.Bind(wx.EVT_BUTTON, self.OnClear, self.clear_btn)
# telnet連接標志
self.isconnected=False
# end wxGlade
# 連接遠程計算機
def connect(self):
# 計數器
self.temp=0
# telnet登陸必須參數,端口默認23,這里就沒再設置
self.HOST=str(self.ip_ctrl.GetValue())
self.USER=str(self.user_ctrl.GetValue())
self.PASS=str(self.pwd_ctrl.GetValue())
self.cmd_ctrl.SetValue(COMMAND[self.temp])
# 實例化一個telnet對象
self.tn=telnetlib.Telnet()
try:
# 連接,出現異常則宣告連接失敗
self.tn.open(self.HOST)
self.info_ctrl.AppendText("已連上遠程計算機,等待登錄...\n")
return True
except:
self.info_ctrl.AppendText("對不起,遠程計算機連接失敗!\n")
return False
def login(self):
# 從遠程計算機獲取登錄提示信息,需要輸入用戶名(包含"login"字符串)
user_info=self.tn.expect(['login:'],5)
self.info_ctrl.AppendText("反饋:"+user_info[2]+"\n")
# 發送用戶名
self.tn.write(self.USER+'\n')
self.info_ctrl.AppendText("登錄用戶:"+self.USER+"\n")
# 從遠程計算機獲取登錄提示信息,需要輸入密碼(包含"Password"字符串)
pwd_info=self.tn.expect(['Password:'],5)
self.info_ctrl.AppendText("反饋:"+pwd_info[2]+"\n")
# 發送密碼
self.tn.write(self.PASS+'\n')
self.info_ctrl.AppendText("登錄密碼:"+self.PASS+"\n")
# 如果登陸成功,會回顯用戶名,這里根據是否回顯用戶名判斷登陸是否成功
result=self.tn.expect([self.USER],5)
self.info_ctrl.AppendText("反饋:"+result[2]+"\n")
if result[0]==-1:
self.info_ctrl.AppendText("登錄失敗,請確認用戶名和密碼!\n")
return False
else:
self.info_ctrl.AppendText("恭喜你!登陸成功!\n")
self.info_ctrl.AppendText("等待輸入指令......\n")
#為了減少用戶錯誤操作,這里加了些手段
self.logout_btn.Enable(True)
self.login_btn.Enable(False)
self.send_btn.Enable(True)
self.isconnected=True
return True
# 發送telnet指令
def sendCommand(self,cmd):
self.send_btn.Enable(False)
self.info_ctrl.AppendText("指令:"+cmd+"\n")
self.tn.write(cmd+'\n')
reply=self.tn.expect(['%'],5)
self.info_ctrl.AppendText("反饋:"+reply[2]+"\n")
self.info_ctrl.AppendText("等待輸入指令......\n")
self.send_btn.Enable(True)
# 退出telnet登陸
def logout(self):
self.tn.close()
self.info_ctrl.AppendText("成功退出登錄!\n")
del self.tn
self.send_btn.Enable(False)
self.logout_btn.Enable(False)
self.login_btn.Enable(True)
self.isconnected=False
# 組件屬性賦值,由wxGlade產生
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("小星星遠程登錄工具")
self.SetSize((618, 463))
self.info_ctrl.SetMinSize((600, 180))
self.cmd_ctrl.SetMinSize((600, 50))
self.send_btn.Enable(False)
self.logout_btn.Enable(False)
# end wxGlade
# 界面布局,由wxGlade產生(wxGlade的確是個好東西!)
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_2 = wx.BoxSizer(wx.VERTICAL)
sizer_3 = wx.StaticBoxSizer(self.sizer_3_staticbox, wx.VERTICAL)
grid_sizer_4 = wx.GridSizer(1, 4, 0, 0)
grid_sizer_3 = wx.GridSizer(1, 1, 0, 0)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_8 = wx.BoxSizer(wx.HORIZONTAL)
sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
sizer_5.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_5.Add(self.ip_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_4.Add(sizer_5, 1, wx.EXPAND, 0)
sizer_6.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_6.Add(self.port_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_4.Add(sizer_6, 1, wx.EXPAND, 0)
sizer_7.Add(self.label_4, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_7.Add(self.user_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_4.Add(sizer_7, 1, wx.EXPAND, 0)
sizer_8.Add(self.label_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_8.Add(self.pwd_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_4.Add(sizer_8, 1, wx.EXPAND, 0)
sizer_3.Add(sizer_4, 1, wx.EXPAND, 0)
sizer_3.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(self.info_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(self.label_7, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(self.cmd_ctrl, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_3.Add(self.send_btn, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(grid_sizer_3, 1, wx.EXPAND, 0)
sizer_3.Add(self.static_line_1, 0, wx.EXPAND, 0)
grid_sizer_4.Add(self.exit_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_4.Add(self.clear_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_4.Add(self.logout_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_4.Add(self.login_btn, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(grid_sizer_4, 1, wx.EXPAND, 0)
self.panel_1.SetSizer(sizer_3)
sizer_2.Add(self.panel_1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
self.SetSizer(sizer_2)
self.Layout()
# end wxGlade
# 響應"發送指令"按鈕動作,執行發送操作
def OnSend(self, event): # wxGlade: MyFrame.<event_handler>
self.sendCommand(str(self.cmd_ctrl.GetValue()))
self.temp=self.temp+1
if self.temp>=len(COMMAND):
self.cmd_ctrl.SetValue("")
else:
self.cmd_ctrl.SetValue(COMMAND[self.temp])
# 響應"退出登錄"按鈕動作,執行退出登錄操作
def OnLogout(self, event): # wxGlade: MyFrame.<event_handler>
self.logout()
# 響應"遠程登錄"按鈕動作,執行登錄操作
def OnLogin(self, event): # wxGlade: MyFrame.<event_handler>
self.connect()
self.login()
self.temp=0
# 響應"退出程序"按鈕動作,執行退出程序操作
def OnExit(self,event):
# 當然,如果登陸的時候強制退出,為了安全,彈出提示
if self.isconnected:
dlg=wx.MessageDialog(parent=None,message="如果現在退出,將會丟失遠程登錄連接,是否確認退出?",caption="警告",style=wx.OK|wx.CANCEL)
if dlg.ShowModal()==wx.ID_OK:
self.logout()
self.Close()
sys.exit()
else:
self.Close()
sys.exit()
# 響應"清空信息"按鈕動作,執行清空消息內容
def OnClear(self,event):
self.info_ctrl.SetValue("")
# end of class MyFrame
# 主程序入口,這個也是wxGlade產生的
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 =MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

