⑴ python 獲取ssh響應嗎
最近在做一個項目,需要在客戶端集成一個互動式ssh功能,大概就是客戶端跟伺服器申請個可用的機器,服務端返回個ip,埠,密碼, 然後客戶端就可以直接登錄到機器上操做了。該程序基於paramiko模塊。
經查找,從paramiko的源碼包demos目錄下,可以看到互動式shell的實現,就是那個demo.py。但是用起來有些bug,於是我給修改了一下interactive.py(我把windows的代碼刪掉了,剩下的只能在linux下用)。代碼如下:
[python]view plain
#coding=utf-8
importsocket
importsys
importos
importtermios
importtty
importfcntl
importsignal
importstruct
importselect
now_channel=None
definteractive_shell(chan):
posix_shell(chan)
defioctl_GWINSZ(fd):
try:
cr=struct.unpack('hh',fcntl.ioctl(fd,termios.TIOCGWINSZ,'aaaa'))
except:
return
returncr
defgetTerminalSize():
cr=ioctl_GWINSZ(0)orioctl_GWINSZ(1)orioctl_GWINSZ(2)
returnint(cr[1]),int(cr[0])
defresize_pty(signum=0,frame=0):
width,height=getTerminalSize()
ifnow_channelisnotNone:
now_channel.resize_pty(width=width,height=height)
defposix_shell(chan):
globalnow_channel
now_channel=chan
resize_pty()
signal.signal(signal.SIGWINCH,resize_pty)#終端大小改變時,修改pty終端大小
stdin=os.fdopen(sys.stdin.fileno(),'r',0)#stdinbuff置為空,否則粘貼多位元組或者按方向鍵的時候顯示不正確
fd=stdin.fileno()
oldtty=termios.tcgetattr(fd)
newtty=termios.tcgetattr(fd)
newtty[3]=newtty[3]|termios.ICANON
try:
termios.tcsetattr(fd,termios.TCSANOW,newtty)
tty.setraw(fd)
tty.setcbreak(fd)
chan.settimeout(0.0)
whileTrue:
try:
r,w,e=select.select([chan,stdin],[],[])
except:
#解決SIGWINCH信號將休眠的select系統調用喚醒引發的系統中斷,忽略中斷重新調用解決。
continue
ifchaninr:
try:
x=chan.recv(1024)
iflen(x)==0:
print'rn***EOFrn',
break
sys.stdout.write(x)
sys.stdout.flush()
exceptsocket.timeout:
pass
ifstdininr:
x=stdin.read(1)
iflen(x)==0:
break
chan.send(x)
finally:
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)
使用示例:
[python]view plain
#coding=utf8
importparamiko
importinteractive
#記錄日誌
paramiko.util.log_to_file('/tmp/aaa')
#建立ssh連接
ssh=paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.11',port=22,username='hahaha',password='********',compress=True)
#建立互動式shell連接
channel=ssh.invoke_shell()
#建立互動式管道
interactive.interactive_shell(channel)
#關閉連接
channel.close()
ssh.close()
interactive.py代碼中主要修復了幾個問題:
1、當讀取鍵盤輸入時,方向鍵會有問題,因為按一次方向鍵會產生3個位元組數據,我的理解是按鍵一次會被select捕捉一次標准輸入有變化,但是我每次只處理1個位元組的數據,其他的數據會存放在輸入緩沖區中,等待下次按鍵的時候一起發過去。這就導致了本來3個位元組才能完整定義一個方向鍵的行為,但是我只發過去一個位元組,所以終端並不知道我要干什麼。所以沒有變化,當下次觸發按鍵,才會把上一次的信息完整發過去,看起來就是按一下方向鍵有延遲。多位元組的粘貼也是一個原理。解決辦法是將輸入緩沖區置為0,這樣就沒有緩沖,有多少發過去多少,這樣就不會有那種顯示的延遲問題了。
2、終端大小適應。paramiko.channel會創建一個pty(偽終端),有個默認的大小(width=80, height=24),所以登錄過去會發現能顯示的區域很小,並且是固定的。編輯vim的時候尤其痛苦。channel中有resize_pty方法,但是需要獲取到當前終端的大小。經查找,當終端窗口發生變化時,系統會給前台進程組發送SIGWINCH信號,也就是當進程收到該信號時,獲取一下當前size,然後再同步到pty中,那pty中的進程等於也感受到了窗口變化,也會收到SIGWINCH信號。
3、讀寫『慢』設備(包括pipe,終端設備,網路連接等)。讀時,數據不存在,需要等待;寫時,緩沖區滿或其他原因,需要等待。ssh通道屬於這一類的。本來進程因為網路沒有通信,select調用為阻塞中的狀態,但是當終端窗口大小變化,接收到SIGWINCH信號被喚醒。此時select會出現異常,觸發系統中斷(4, 'Interrupted system call'),但是這種情況只會出現一次,當重新調用select方法又會恢復正常。所以捕獲到select異常後重新進行select可以解決該問題。
⑵ 怎麼遠程開機
1.進行硬體及相關准備。首先要確保區域網計算機的主板支持遠程網路喚醒功能。可以進入CMOS參數設置,查看「PowreManagementSetup」中是否有「Wake on LAN」項目,如果有將其設置為「Enable」。
2.獲取工作站網卡的物理地址。先進入計算機的系統,輸入「Ipconfig/all」命令,結果中的Physical Address後對應的網卡的物理地址。
3.進行相應的軟體准備。安裝遠程開機軟體,比如Magic Packet。安裝後運行程序,在Magic Packets菜單中輸入開機命令,可以遠程喚醒一台計算機,也可以遠程喚醒多台計算機。
4.此時就可以嘗試遠程喚醒計算機了。選擇菜單中的「Power On One Host」,在6組輸入框中分別輸入上一步獲取的遠程機器的網卡物理地址,單擊「Send」,程序就發送了一個喚醒數據包到了遠程主機中。只要在關機時沒有切斷電源,網卡受到數據包的信息後,就會激活主板自動開機了。
步驟一:在家裡個人電腦安裝網路人遠程式控制制軟體旗艦版控制端,使用一個固定的會員賬號A登陸(需要賬號和密碼);
網路人遠程開機卡分為固化版和手機版,主要通過安裝在電腦主機PCI插槽,通過撥打電話進入到遠程開機平台進行遠程開機、遠程關機操作。單純使用硬體並不能實現遠程操作計算機,當辦公室電腦關閉的時候,你可以通過遠程開機卡對電腦進行遠程開機,之後使用網路人遠程式控制制軟體遠程式控制制被控端電腦。
⑶ 怎麼通俗理解python epoll
首先我們來定義流的概念,一個流可以是文件,socket,pipe等等可以進行I/O操作的內核對象。不管是文件,還是套接字,還是管道,我們都可以把他們看作流。
現在我們來討論I/O的操作,通過read,我們可以從流中讀入數據;通過write,我們可以往流寫入數據。現在假定一個情形,我們需要從流中讀數據,但是流中還沒有數據,(典型的例子為,客戶端要從socket讀如數據,但是伺服器還沒有把數據傳回來),這時候該怎麼辦?
阻塞:阻塞是個什麼概念呢?比如某個時候你在等快遞,但是你不知道快遞什麼時候過來,而且你沒有別的事可以干(或者說接下來的事要等快遞來了才能做);那麼你可以去睡覺了,因為你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。
非阻塞忙輪詢:接著上面等快遞的例子,如果用忙輪詢的方法,那麼你需要知道快遞員的手機號,然後每分鍾給他掛個電話:「你到了沒?」
很明顯一般人不會用第二種做法,不僅顯很無腦,浪費話費不說,還佔用了快遞員大量的時間。
大部分程序也不會用第二種做法,因為第一種方法經濟而簡單,經濟是指消耗很少的CPU時間,如果線程睡眠了,就掉出了系統的調度隊列,暫時不會去瓜分CPU寶貴的時間片了。
為了了解阻塞是如何進行的,我們來討論緩沖區,以及內核緩沖區,最終把I/O事件解釋清楚。緩沖區的引入是為了減少頻繁I/O操作而引起頻繁的系統調用(你知道它很慢的),當你操作一個流時,更多的是以緩沖區為單位進行操作,這是相對於用戶空間而言。對於內核來說,也需要緩沖區。
假設有一個管道,進程A為管道的寫入方,B為管道的讀出方。一開始內核緩沖區是空的,B作為讀出方,被阻塞著。然後首先A往管道寫入,這時候內核緩沖區由空的狀態變到非空狀態,內核就會產生一個事件告訴B該醒來了,這個事件姑且稱之為「緩沖區非空」。但是「,緩沖區非空」事件通知B後,B卻還沒有讀出數據;且內核許諾了不能把寫入管道中的數據丟掉這個時候,A寫入的數據會滯留在內核緩沖區中,如果內核也緩沖區滿了,B仍未開始讀數據,最終內核緩沖區會被填滿,這個時候會產生一個I/O事件,告訴進程A,你該等等(阻塞)了,我們把這個事件定義為「緩沖區滿」。後來B終於開始讀數據了,於是內核的緩沖區空了出來,這時候內核會告訴A,內核緩沖區有空位了,你可以從長眠中醒來了,繼續寫數據了,我們把這個事件叫做「緩沖區非滿」。也許事件「緩沖區非滿「已經通知了A,但是A也沒有數據寫入了,而B繼續讀出數據,知道內核緩沖區空了。這個時候內核就告訴B,你需要阻塞了!,我們把這個時間定為「緩沖區空」。
這四個情形涵蓋了四個I/O事件,緩沖區滿,緩沖區空,緩沖區非空,緩沖區非滿(注都是說的內核緩沖區,且這四個術語都是我生造的,僅為解釋其原理而造)。這四個I/O事件是進行阻塞同步的根本。(如果不能理解「同步」是什麼概念,請學習操作系統的鎖,信號量,條件變數等任務同步方面的相關知識)。
然後我們來說說阻塞I/O的缺點:阻塞I/O模式下,一個線程只能處理一個流的I/O事件。如果想要同時處理多個流,要麼多進程(fork),要麼多線程(pthread_create),很不幸這兩種方法效率都不高。
現在我們再來考慮一下」非阻塞忙輪詢「的I/O方式,我們發現我們可以同時處理多個流了(把一個流從阻塞模式切換到非阻塞模式再此不予討論):
[java]view plain
whiletrue{
active_stream[]=epoll_wait(epollfd)
foriinactive_stream[]{
readorwritetill
}
}
[java]view plain
whiletrue{
active_stream[]=epoll_wait(epollfd)
foriinactive_stream[]{
readorwritetill
}
}
⑷ python什麼指令能喚醒手機屏幕
python肯定不行啊,需要python調用手機自身的介面才可以實現。
⑸ python wait()函數問題
看了你發的函數:
def Wait(self):
self._app.MainLoop()
看名字應該是啟動了阻塞循環,去處理app的請求,這個就是需要一直運行的,因為一旦停止了,你的app請求就沒發處理了。
如果你需要啟動後再執行的別的程序,可以使用多進程,把這個啟動放在別的進程里去執行。
如果解決了您的問題請採納!
如果未解決請繼續追問
⑹ 請問如何跨網段實現網路喚醒
下面的分析可以參考,跨網喚醒需要在路由上進行設置:
遠程喚醒:
1、除了在BIOS中開啟遠程喚醒功能外,有些主板要求開啟以下功能:
AC Back Function(設置掉電重啟後系統的狀態)
主板的來電喚醒功能 比如一插電源線主機就啟動看你想怎麼設置了 使用遠程喚醒將「AC BACK Function」設置為「Full-on」即可 關機,開機,先前的狀態(原來開時後來電就馬上開機,原來關機後來電時還保持關機狀態)
2、另外,有些網卡還要在其屬性中進行另外設置:
系統重新啟動後,單擊[開始]-][控制面板],然後選擇[系統]。
在「系統屬性」窗口中,選擇[硬體] 標簽,然後單擊[設備管理器]。
在「設備管理器」窗口中,單擊[網路適配器] 旁邊的加號+,然後雙擊[marvell yukon 88e8036/8053 pci-e fast ethernet controller]。
選擇[高級] 標簽,然後選擇[wake from shut down] 屬性。
在「值」列表中選擇[開],然後單擊[確定] 以關閉對話框。
跨網段遠程喚醒:
由
於跨網段要經過交換機或路由器,而它們是不允許廣播的,所有些網友回答用 ip help address 原理么類似跨網段的DHCP,或者IP
DIRECTED BROADCAST 和 IP FORWARD PROTOCOL 需要ENABLE等。可是使用後發現還是不行,後來見到一文章:
************************************************************
遠程開機,現在有兩種方法,本地同一廣播域內開機,遠程過路由開機。
先談談本地開機。
要打開mac地址是00-0E-7F-7B-BD-32這台主機,發起pc發出一個廣播。通過sniffer的ip包。可以看到目的MAC地址是FF-
FF-FF-FF-FF-FF,這是一個廣播,再看目的ip地址,192.168.200.255,是ip廣播,向下看,數據包是UDP,目的埠是
2304,源埠不必理會。
那麼說,發一個廣播,只要埠是2304就可以開機嗎?顯然不是,開機是有針對性的,不是發一個這樣的廣播,所有的機器都開機。關鍵就在那個數據裡面。
看一下這個126位元組的數據到底有什麼,最初的6個子位元組是全F,7到12位元組就是要開機的MAC地址,然後循環出現,直到填充到126個位元組為止。這才
是確定開那一台機器的關鍵。
總結一下,要開機就必須讓被開的機器,收到埠為2304的udp數據包,包的內容包含了被開機的MAC地址。但是沒有開機的機器沒有辦法設定ip地址,怎麼才能讓其收到,於是廣播就是最好的方式了。
那麼遠程過路由開機怎麼辦,又不能進行廣播。
通過抓包可以發現,目的mac地址變成了網關的,目的ip地址變成了那台機器設定的靜態ip,其它數據沒有變化。那麼這樣可以開機嗎?前面不是說過了,沒有開機的機器是無法設定ip的,它如何才能把這個數據送到該網卡呢。
這里就牽扯到一些路由器,交換機,hub的一些原理。hub是把所有的數據都發送到所有埠(物理),所以效率不高;交換機呢,是根據已經注冊的mac
地址和埠(物理)的對應關系轉發,那麼沒有開機的情況下,當然也沒有注冊mac地址了,但是交換機在對待沒有注冊的mac地址的時候,會把這個數據包發
往所有的埠(物理),這樣也沒問題了。那麼作為遠程的關鍵導入點的路由器,是工作在3層,它要查找ip地址和mac的對應關系,就用arp協議,我們知
道如果這台機器是down狀態下,是不會應答arp廣播的,那麼這樣說來無法開機了?結果卻出人意料,機器卻開機了,為什麼?
分
析一下,進入路由器,察看arp
table,竟然有ip地址和mac的對應,稍作思考就明白,原來這台測試用的電腦剛剛做完開機測試,剛關機,開機的時候,即使我們什麼都不
做,windows機器也會去找微軟的伺服器的,這已經不是秘密,那麼它必然找過網關,所以網關當然就知道了這個ip和mac的對應關系,根本就不用
arp查找,直接就發出數據,機器接收到也就能開機了。為了證實這個想法,把路由器內的對應關系刪除,果然不能開機了。
遠程開機不能只開剛剛關閉的機器吧,症結就在ip和mac的關繫上,那麼綁定對應關系,問題迎刃而解。
************************************************************
於是在交換機中加入IP與MAC地址的綁定命令:arp 192.168.1.2 0011.e4e5.2489 arpa
然後用AMD的開機軟體測試,在IP地址中輸入192.168.1.2,在MAC地址中輸入0011.e4e5.2489 ,OK成功。
⑺ Python 在編程語言中是什麼地位為什麼很多大學不教 Python
python的地位很高,目前是世界第5大編程語言。。但我覺得大學不教python,其實是正確的。
Python在誕生之初,只是用來在Linux上給Perl和shell做銜接用的「膠水」,而今天已經成為了主流的編程語言,能獲得今天的地位,當然具備諸多優勢。。。比如數學運算相關的各種庫,爬蟲,等等。。。但這都不是導致Python流行的最根本原因。
有沒有比Python運算更強的語言?多得是
有沒有比Python爬蟲效率更高的語言?也不少
所以其實平日里隨口道來的種種優勢,並不是不可替代的。。這些優勢,很多語言都具備。就比如perl,erlang,Julia等語言,其實用來做運算或爬蟲比Python更強,但為什麼這些語言卻流行不起來?
說到底,Python成功的秘訣只有一條,其實就是在功能基本夠用的前提下,比其他語言簡單。而比Python簡單的語言,功能又不夠全面,比如Lua,Javascript,Ruby這些語言比Python更簡單,但往往只適合一兩個領域的工作,而無法面面俱到。
Python可以提供的這些功能,對於非專業程序員來講,已經顯得非常強大了。。但對於專業程序員來說,Python最大的作用,其實也只是用來「偷懶」而已。因為相比JAVA或C#這種工業級的編程語言來講,Python除了入門簡單之外,並無任何優勢可言。而Python的動態語言特性、不利於維護等缺點,成為了限制它邁向深層開發的重大缺陷。
而如果熟練掌握JAVA或C#中的任何一門,想利用閑暇之餘學習一下Python,看幾個案例便可以入門,幾乎不需要專門學習。
如果你並不以成為專業程序員做為目標,那麼以Python為主,是可以的。但若想靠編程養家糊口,靜態語言才是重中之重。
但如果是計算機專業的話,僅僅學Python,似乎就有點對不起「科班出身」的稱號了。。。。學生們花著昂貴的學費,消耗四年光陰,卻只學個Python,豈不是誤人子弟?
就像你若報考攝影專業,老師應該教你使用單反,而不是教你使用手機攝像頭。
⑻ Python如何使電腦進入睡眠狀態
os.system('rundll32 powrprof.dll,SetSuspendState')
⑼ 如何自學 python
編程在某種程度上和寫作無比類似。編程語言的意義和紙筆類似,是寫東西的必要條件,但不充分。學會了編程語言,不過是有了在用筆在紙上寫字的能力,離能寫出好的文章差的可遠著吶。 那麼,怎麼才能提高寫出東西的能力?這個和寫作一樣,首先你得有寫的動力,其次是要學習如何去寫,最後才是多寫。 動力是最重要的。不管是因為興趣愛好還是因為生活所迫,你都需要給自己一個努力的理由。
除了敦促你努力,帶來動力的源泉往往會直接或間接的指明你的努力方向,這對後續發展有很大幫助。如果你的動力是應聘好公司拿高薪,那麼目標公司的職位要求就是你的方向;如果你想寫出有趣的網站,那麼web相關就是你的方向;如果你對編程語言本身感到著迷,那麼編程語言理論或編譯器就是你的方向。這樣,你就不會迷茫,今天寫個爬蟲,明天寫個貪吃蛇,可過了好久發現自己還在原地踏步。
接下來是學習如何去寫。說白了就是學,使勁學,把你希望的方向里能學會的全學會。先爬上巨人的肩膀才有可能墊高巨人的肩膀。 最後才是多寫。什麼也不學的瞎寫是毫無意義的。在沒有學會許多東西之前一味強調多寫是十分愚蠢的事情。當你學了一些東西時,寫的時機才到了。這時去放手實踐你學到的東西吧。 之後的路就相對清晰了。一直學下去,寫下去,就這么簡單。
除此之外,如果想要快速學好成為一名大神,需要注意幾個非常重要的點。
1、不隨波逐流
不要看周圍的人做什麼,自己就做什麼,也許別人做的並不適合你。別人的優勢很可能會成為你的劣勢。所以,堅定自己的想法,讓自己知道那些方面適合自己,自己可以勝任。
2、不斷嘗試
不斷的嘗試可能成為自己的優勢。你不知道什麼適合自己,所以才要大膽、勇敢地嘗試。找到一種可以屬於你的獨特的優勢。 堅定信念。一旦你堅定了自己的信念,就不要被別人的意見或是諷刺或是嘲笑所干擾。
3、不茫然,不多想
別讓太多的事干擾到你奮斗下去的信念。夢想不容許太多的雜念。那些雜念只會讓你的心愈來愈脆弱,多為一個人考慮,到頭來,傷害的還是自己。
4、選擇自己學習方法
每個人都有適合自己的方法,有的人去選擇自學,有的人選擇看視頻學習,有的人選擇報名培訓班,那在這個時候,你就要自己考慮清楚,到底那樣對的幫助是最大的,個人覺得是跟著培訓班最好的,畢竟人家的實戰項目多,我們學軟體開發的都知道實戰項目對於學好一門語言是 很重要的。(在學習的路上需要的是老師的指點和鼓勵,是學習上的啟迪,更是課後的陪伴,激發興趣,喚醒夢想,才能真正的學好Python!有夢想是一件值得人敬佩的事情,穩步實踐最終實現夢想的人值得尊敬,如果你願意,渴望學好python可以加我的球球