我试图通过python检索系统上配置的当前iptables链.如果我strace iptables命令,它输出:
strace iptables -L INPUT
socket(PF_INET, SOCK_RAW, IPPROTO_RAW) = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, "filter\0\377`\2\351\1\0\210\377\377\210}\313\276\0\210\377\377\354\206\0\201\377\377\377\377"..., [84]) = 0
Run Code Online (Sandbox Code Playgroud)
完整输出:http://pastebin.com/e7XEsaZV
在python中我创建套接字obj并尝试调用getsockopt并且它出错:
>>> s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
>>> s.getsockopt(socket.SOL_IP, 0x40)
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
s.getsockopt(socket.SOL_IP, 0x40)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 22] Invalid argument
>>>
>>> s = socket.socket(2, socket.SOCK_RAW, socket.IPPROTO_RAW)
>>> s.getsockopt(socket.SOL_IP, 0x41)
Traceback (most recent call last):
File "<pyshell#48>", line 1, …Run Code Online (Sandbox Code Playgroud) ConfigParser要求所有部分,键和值都是字符串; 没有惊喜.它的方法来将值转换为数据类型有getfloat,getint,getboolean.如果你不知道的数据类型,你可以包装get()与eval()获得有评估,如字符串:
>>> from ConfigParser import SafeConfigParser
>>> cp = SafeConfigParser()
>>> cp.add_section('one')
>>> cp.set('one', 'key', '42')
>>> print cp.get('one', 'key')
'42'
>>> print eval(cp.get('one', 'key'))
42
>>> cp.set('one', 'key', 'None')
>>> print eval(cp.get('one', 'key'))
None
>>>
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?我认为在评估文件中的文本方面存在一些严重的安全问题 - 我承认这一点; 我完全信任该文件.
我以为我会用pickle它,但我真的想保持配置文件是人类可读的.
你会怎么做?
我想出了两种方法来生成相对较短的随机字符串 - 一种更快更简单,另一种更慢但我认为更随机.是否有一种不太复杂的方法或方法来衡量每种方法的数据随机性如何?
我已经尝试压缩输出字符串(通过zlib),确定数据越真实随机,压缩的程度就越小,但事实证明并不多.
这是我用Python修改信号处理程序的另一篇文章的后续文章.简而言之,Linux阻止所有信号到PID 1(包括SIGKILL),除非Init为特定信号安装了信号处理程序; 如果有人要向PID1发送终止信号,以防止内核恐慌.我一直遇到的问题是signal,Python中的模块似乎没有以系统识别的方式安装信号处理程序.我的Python Init脚本似乎完全忽略了所有信号,因为我认为它们被阻止了.
我好像找到了解决方案; 使用ctypes安装与所述信号处理程序signal()在libc函数(在这种情况下uClibc的).下面是一个基于python的测试init.它在TTY2上打开一个shell,我可以从中向PID1发送信号进行测试.它似乎在KVM中用于测试(我愿意与任何感兴趣的人分享VM)
这是解决这个问题的最佳方法吗?在没有信号模块的情况下安装信号处理器是否有"更好"的方法?(我完全不关心可移植)
这是Python中的错误吗?
#!/usr/bin/python
import os
import sys
import time
from ctypes import *
def SigHUP():
print "Caught SIGHUP"
return 0
def SigCHLD():
print "Caught SIGCHLD"
return 0
SIGFUNC = CFUNCTYPE(c_int)
SigHUPFunc = SIGFUNC(SigHUP)
SigCHLDFunc = SIGFUNC(SigCHLD)
libc = cdll.LoadLibrary('libc.so.0')
libc.signal(1, SigHUPFunc) # 1 = SIGHUP
libc.signal(17, SigCHLDFunc) # 17 = SIGCHLD
print "Mounting Proc: %s" % libc.mount(None, "/proc", "proc", 0, None)
print "forking for ash"
cpid …Run Code Online (Sandbox Code Playgroud) 可能重复:
学习有效的算法
我最近遇到了一个问题,通过应用正确的算法解决了:计算插件依赖性
虽然我最终能够理解规定算法的逻辑,但对我来说这不是一件容易的事.我能够提出有效代码的唯一原因是因为维基百科页面上的逻辑示例.
完全是自学成才,没有任何CS或数学背景,我想至少得到一些实际的基础,能够应用算法来解决问题.
这就是说,有什么伟大的书籍/资源,不希望你们("算法傻瓜"类似的东西)已经完成了大学代数9或微积分5,可以教的基本知识?我不希望永远是一个巫师,只是扩展我的问题解决工具集.
做一个亚马逊搜索会出现一堆书,但我希望你们能指出我真正有用的资源.
我有任何真正经验的唯一语言是Python(一点点C),所以无论我发现什么都需要与语言无关或以Python/C为中心.
在下面的示例中,方法中的最后两行都从中B.Go()调用Go()方法class A.它们功能相同吗?使用super()它的唯一好处是我不必知道继承的类名吗?
class A(object):
def Go(self):
print "Calling A.Go()"
class B(A):
def Go(self):
super(B, self).Go()
A.Go(self)
inst = B()
inst.Go()
Run Code Online (Sandbox Code Playgroud) 我试图理解CRC,我对如何计算'除数'感到困惑.
在维基百科上的示例中,除数为11(1011),输入为11010011101100
11010011101100 000 <--- input left shifted by 3 bits
1011 <--- divisor (4 bits) = x³+x+1
------------------
01100011101100 000 <--- result
Run Code Online (Sandbox Code Playgroud)
除数是如何计算的?在这个例子中(x³+ x + 1)x是2?2来自哪里?
我需要创建一个具有依赖支持的插件系统,我不确定解决依赖关系的最佳方法.插件将全部从基类中进行子类化,每个基类都有自己的execute()方法.在每个插件类中,我计划创建一个dependencies属性作为它依赖的所有其他插件的列表.
当加载插件,我会导入所有的人,并把它们放在一个列表,并根据依赖关系进行排序.一旦它们都处于正确的顺序(因此任何具有依赖关系的东西都在其所述依赖关系之后的列表中)我将遍历执行每个方法execute()方法的列表.
我不断变得模糊的是排序背后的逻辑.我可以开始按字母顺序排列它们直到我遇到一个具有依赖关系的 - 如果它的依赖关系不在列表中,则将其放入tmp列表中.在第一轮导入结束时,从临时列表的末尾开始(除了具有依赖项的插件之外的任何列表)并再次检查"运行列表".如果我在"运行列表"中找到它的依赖项,请确保它的索引号高于其最高依赖项.如果它的依赖项不在列表中,请按住它并移动到临时列表中的下一个插件.一旦我到达tmp列表的末尾,请从顶部开始再试一次.一旦所有插件都被排序,或者tmp列表在循环之后没有改变大小 - 开始执行插件.
临时列表中剩下的是插件,它们没有找到它们的依赖关系,或者具有循环依赖关系.(tmp列表中的2个插件彼此依赖)
如果你还在阅读并且你能够遵循我的逻辑; 这是一个合理的计划吗?有更简单的方法吗?如果我想为执行顺序实现序列号,那么有一种"简单"的方法来同时拥有序列和依赖关系吗?(如果存在冲突,依赖性会击败排序)或者插件是否应该使用序列或依赖性?(首先运行带有序列号的插件,而不是带有依赖性的插件?)
TL; DR
您如何编写用于计算插件系统中的依赖项的逻辑?
编辑:
好吧 - 我想我从维基百科页面实现了拓扑排序; 遵循其DFS的逻辑示例.它似乎有效,但我以前从未做过这样的事情.
http://en.wikipedia.org/wiki/Topological_sorting#Examples
data = {
'10' : ['11', '3'],
'3' : [],
'5' : [],
'7' : [],
'11' : ['7', '5'],
'9' : ['8', '11'],
'2' : ['11'],
'8' : ['7', '3']
}
L = []
visited = []
def nodeps(data):
S = []
for each in data.keys():
if not len(data[each]):
S.append(each)
return S
def dependson(node): …Run Code Online (Sandbox Code Playgroud) 我不知道该怎么称呼我正在寻找的东西; 所以,如果我没有在其他地方找到这个问题,我道歉.简而言之,我正在编写将直接与Linux内核连接的python代码.它很容易从包含头文件中获取所需的值并将它们写入我的源代码:
IFA_UNSPEC = 0
IFA_ADDRESS = 1
IFA_LOCAL = 2
IFA_LABEL = 3
IFA_BROADCAST = 4
IFA_ANYCAST = 5
IFA_CACHEINFO = 6
IFA_MULTICAST = 7
Run Code Online (Sandbox Code Playgroud)
在构造要发送到内核的结构时,它很容易使用这些值.但是,它们几乎无助于解析内核响应中的值.
如果我将值放入dict中,我将不得不扫描dict中的所有值,从我假设的内核中查找每个结构中每个项的键.必须有一种更简单,更有效的方式.
你会怎么做?(如果关闭的话,请随时重新提出问题)