⑴ 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可以加我的球球