pythontermios
① 新手求助,windows版本的python沒有termios這個模塊
對的啊,木有問題
python是一個解釋器,為啥要有界面?好看點的話可以點那個開始菜單里的python底下的IDLE
② 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)
#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()
使用示例:
[python]view plain
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可以解決該問題。
③ python中,怎麼使數字變為*就想輸密碼似的
其實最簡單的方法是import getpass 這個裡面有方法可以不回顯的輸入密碼,但是想用*回顯的話就比較麻煩了。。可以用下面這個方法。調用getpass方法,參數默認使用`*`回顯,可以修改成其他回顯字元。。
importsys,tty,termios
defgetch():
fd=sys.stdin.fileno()
old_settings=termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch=sys.stdin.read(1)
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old_settings)
returnch
defgetpass(maskchar="*"):
password=""
whileTrue:
ch=getch()
ifch==" "orch==" ":
returnpassword
elifch==""orord(ch)==127:
iflen(password)>0:
sys.stdout.write("")
password=password[:-1]
else:
ifmaskchar!=None:
sys.stdout.write(maskchar)
password+=ch
if__name__=="__main__":
print"Enterpassword:",
password=getpass("*")
printpassword
④ python: tty.setraw()和tty.sercbreak()把terminal弄壞了
你需要用termios模塊,請參考下面的示例代碼。
defgetpass(prompt="Password:"):
importtermios,sys
fd=sys.stdin.fileno()
old=termios.tcgetattr(fd)
new=termios.tcgetattr(fd)
new[3]=new[3]&~termios.ECHO#lflags
try:
termios.tcsetattr(fd,termios.TCSADRAIN,new)
passwd=raw_input(prompt)
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old)
returnpasswd
原則上,就是先將原先的屬性保持下來,然後再進行恢復。
⑤ 新手求助,windows版本的python沒有termios這個模塊
應該是LINUX或者UNIX吧?
你編譯python的時候沒有編譯TKINTER
JPEG,ZLIB庫freetype2的相關庫都缺少
你編譯好上述庫,再重新安裝PIL就沒問題了。
⑥ 新手求助,windows版本的python沒有termios這個模塊
編譯python的時候沒有編譯TKINTERJPEG,ZLIB庫freetype2的相關庫都缺少你編譯好上述庫,再重新安裝PIL就沒問題了。
⑦ python怎麼獲取鍵盤上輸入的小寫a
Python 讀取鍵盤輸入字元
Python 讀取鍵盤輸入字元
找了一圈,發現Python下讀取鍵盤輸入的字元還挺麻煩的,找到這個例子,linux下用這個,ch是讀取的字元
import os
import sys
import tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
在windows下,就簡單的多
import msvcrt
ch = msvcrt.getch()
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/marising/archive/2008/10/29/3173848.aspx
⑧ 新手求助,windows版本的python沒有termios這個模塊
應該是LINUX或者UNIX吧?你編譯python的時候沒有編譯TKINTERJPEG,ZLIB庫freetype2的相關庫都缺少你編譯好上述庫,再重新安裝PIL就沒問題了。
⑨ 新手求助,windows版本的python沒有termios這個模塊
termios官方只在unix版本中提供,並沒有在windows環境中提供。
可以用Cygwin代替,可以看看這個模塊 https://pypi.python.org/pypi/cygwinreg/1.0