pythonfcntl
A. python中fcntl函数需要导入吗
因为print,type是内置函数,所以可以直接使用. 你可以到__builtin__这个模块中找到所有的内置函数,也就是不需要导入就可以直接使用的函数。 如果解决了您的问题请采纳! 如果未解决请继续追问
B. 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可以解决该问题。
C. python log 文件锁判断是否有锁
Python的文件锁目前使用的是fcntl这个库,它实际上为 Unix上的ioctl,flock和fcntl 函数提供了一个接口。
1.fcntl库的简单使用
[python] view plain
import fcntl
import os, time
FILE = "counter.txt"
if not os.path.exists(FILE):
# create the counter file if it doesn't exist
file = open(FILE, "w")
file.write("0")
file.close()
for i in range(20):
file = open(FILE, "r+") #由于flock生成的是劝告锁,不能阻止进程对文件的操作,所以这里可以正常打开文件
fcntl.flock(file.fileno(), fcntl.LOCK_EX) #为了避免同时操作文件,需要程序自己来检查该文件是否已经被加锁。这里如果检查到加锁了,进程会被阻塞
print 'acquire lock'
counter = int(file.readline()) + 1
file.seek(0)
file.write(str(counter))
print os.getpid(), "=>", counter
time.sleep(10)
file.close() # unlocks the file
print 'release lock'
time.sleep(3)
分别启动2个进程来同时运行这个脚本,我们可以很明显的看到2者互相之间交替阻塞。同一时刻只有一个进程能够对counter.txt文件进行操作。
2.对fcntl.flock()函数的说明:
linux的flock() 的函数原型如下所示:
int flock(int fd, int operation);
其中,参数 fd 表示文件描述符;参数 operation 指定要进行的锁操作,该参数的取值有如下几种:
LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有;
LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有;
LOCK_UN:表示删除该进程创建的锁;
LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作;
通常情况下,如果加锁请求不能被立即满足,那么系统调用 flock()会阻塞当前进程。比如,进程想要请求一个排他锁,但此时,已经由其他进程获取了这个锁,那么该进程将会被阻塞。如果想要在没有获得这个排他锁的情况下不阻塞该进程,可以将LOCK_NB 和 LOCK_SH 或者 LOCK_EX 联合使用,那么系统就不会阻塞该进程。flock()所加的锁会对整个文件起作用。
注意:
1. 对于文件的 close() 操作会使文件锁失效;
2. 同理,进程结束后文件锁失效;
3. flock() 的 LOCK_EX是“劝告锁”,系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显式检查才能生效。
D. 如何用python脚本获取ip,掩码,地址,网段
#!/usr/bin/python
importfcntl,socket,struct
defgetHwAddr(ifname):
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
info=fcntl.ioctl(s.fileno(),0x8927,struct.pack('256s',ifname[:15]))
return':'.join(['%02x'%ord(char)forcharininfo[18:24]])
printgetHwAddr('eth0')
E. python2.7是不是没有fcntl 这个模块啊
将fcntl.py放在Python下的Lib文件夹里就行了。fcntl.py的下载办法:CSDN可以找到。
F. python 怎么调用linux下的tcpmp
之前在linux用python脚本写一个抓包分析小工具,实在不想用什么libpcap、pypcap所以,简单来了个tcpmp加grep搞定。基本思路是分别起tcpmp和grep两个进程,进程直接通过pipe交换数据,简单代码如下:
[python] view plain
#! /usr/bin/python
def tcpmp():
import subprocess, fcntl, os
# sudo tcpmp -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"
cmd1 = ['tcpmp', '-i', 'eth0', '-n','-B', '4096','-s', '0', '-w', '-']
cmd2 = ['grep', '--line-buffered', '-a', '-o', '-E', 'Host: .*|GET /.*']
p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stdin=p1.stdout)
flags = fcntl.fcntl(p2.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p2.stdout.fileno(), fcntl.F_SETFL, (flags | os.O_NDELAY | os.O_NONBLOCK))
return p2
def poll_tcpmp(proc):
#print 'poll_tcpmp....'
import select
txt = None
while True:
# wait 1/10 second
readReady, _, _ = select.select([proc.stdout.fileno()], [], [], 0.1)
if not len(readReady):
break
try:
for line in iter(proc.stdout.readline, ""):
if txt is None:
txt = ''
txt += line
except IOError:
print 'data empty...'
pass
break
return txt
proc = tcpmp()
while True:
text = poll_tcpmp(proc)
if text:
print '>>>> ' + text
G. python中用open保存文本到桌面
编辑器中打开相同的文件时,它会给我一个空白文件。创建并保存文件。
Python中的open函数可以打开并保存文本数据。open是多种语言、环境的一种函数,LINUX中open函数作用。打开和创建文件。PB程序语言中open功能。打开窗口。
open是UNIX系统(包括LINUX、Mac等)的系统调用函数,区别于C语言库函数fopen。对于open函数来说,第三个参数仅当创建新文件时(即使用了O_CREAT时)才使用,用于指定文件的访问权限位(accesspermissionbits)。pathname是待打开/创建文件的POSIX路径名(如/home/user/a。cppflags用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl。h)通过逻辑位或逻辑构成。
H. python程序运行后提示IOError: [Errno 22] Invalid argument 急啊!!!!
python程序运行后提示IOError: [Errno 22] Invalid argument是设置错误造成的,解决方法为:
1、根据提示找到错误代码处进行查看,是open函数出了问题。
I. python:如何以非阻塞的方式读
代码是这样的:
subp = subprocess.Popen(["d:/T1.exe"], shell=True, stdout=subprocess.PIPE, bufsize=0)
subp.stdout.read()
但是发现read和readline函数是阻塞方式调用的,一定要subprocess运行结束才能返回数据。
J. fcntl.ioctl(f, 0x107, pwm_struct),在python下的,坐等!
第一行:以可编辑模式打开文件
第二行:打包(..)使可识别
第三行:没见过这个用法,ioctl应该是一个I/O函数,但是这么用不知道具体意思是什么
这三行代码应该是某个调用I/O驱动程序的一部分,目的是编辑驱动文件。