當前位置:首頁 » 編程語言 » pythontermios

pythontermios

發布時間: 2022-08-19 07:39:58

① 新手求助,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)

  • 使用示例:

    [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可以解決該問題。

③ 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==" ":
print
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

熱點內容
phplinux安裝配置 發布:2025-01-19 19:10:23 瀏覽:233
人才招聘系統php 發布:2025-01-19 19:10:22 瀏覽:586
大學資料庫題庫 發布:2025-01-19 19:00:27 瀏覽:572
樓下大門如何設置開門密碼 發布:2025-01-19 18:59:43 瀏覽:161
dns怎麼配置最優 發布:2025-01-19 18:59:42 瀏覽:518
車輛辦理解壓要收費怎麼處理 發布:2025-01-19 18:39:46 瀏覽:951
san存儲櫃 發布:2025-01-19 18:39:35 瀏覽:64
伏魔記安卓版怎麼什麼鍵都沒有 發布:2025-01-19 18:38:54 瀏覽:902
lol聲音文件夾 發布:2025-01-19 18:38:54 瀏覽:318
銳程cc尊貴版都有哪些配置 發布:2025-01-19 18:27:08 瀏覽:978