当前位置:首页 » 编程语言 » 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

热点内容
云服务器网速慢 发布:2025-01-19 16:20:17 浏览:404
电脑上传监控 发布:2025-01-19 16:13:16 浏览:307
书旗小说怎样离线缓存 发布:2025-01-19 16:12:30 浏览:284
如何给盘符设置密码 发布:2025-01-19 16:11:47 浏览:345
delphi字符加密解密 发布:2025-01-19 16:00:55 浏览:209
为什么安卓不发烫 发布:2025-01-19 15:57:57 浏览:581
oracle存储过程参数游标 发布:2025-01-19 15:57:53 浏览:522
光遇安卓哪个渠道好 发布:2025-01-19 15:41:17 浏览:744
波段的算法 发布:2025-01-19 15:37:00 浏览:424
如何调取三层数据交换机配置文件 发布:2025-01-19 15:18:41 浏览:215