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驅動程序的一部分,目的是編輯驅動文件。