我正在玩一个程序,如果在通过Paramiko发送的命令的输出中存在某个值,则需要触发该程序,在这种情况下是特定的SSID。
我从命令获得的输出如下所示:
[u'{\n', u" 'autoname' => 0,\n", u" 'class' => 'itfhw',\n", u" 'data' => {\n", u" 'ap_bridgemode' => 'none',\n", u" 'bridge' => '',\n", u" 'client_isolation' => 0,\n", u" 'comment' => '',\n", u" 'crypto_alg' => 'aes',\n", u" 'description' => 'Remote Wireless Network',\n", u" 'dot11r' => 0,\n", u" 'dynamic_vlan' => 0,\n", u" 'encryption_mode' => 'wpa2_personal',\n", u" 'freq_bands' => 'a',\n", u" 'hardware' => 'wlan1',\n", u" 'hide_ssid' => 0,\n", u" 'interface_name' => 'wifi1',\n", u" 'mac' => '00:1a:8c:0a:73:01',\n", u" 'mac_filter' => 'disable',\n", u" 'mac_list' => '',\n", u" 'mesh_id' => '',\n", u" 'mesh_mode' => 'none',\n", u" 'mesh_subtag' => '',\n", u" 'name' => 'wlan1 (Remote Wireless Network)',\n", u" 'network_mode' => 'mixed_bgn',\n", u" 'network_name' => 'Test1',\n", u" 'psk' => 'secretpw',\n", u" 'r0kh_secret' => 'o2ZT4VYEYB7hhlfQnHmJQONGYnvY12',\n", u" 'ssid' => 'HACKME',\n", u" 'ssid_vlantag' => '',\n", u" 'status' => 1,\n", u" 'time_scheduling' => 0,\n", u" 'time_select' => [],\n", u" 'utf8_ssid' => 1,\n", u" 'vlantag' => 101,\n", u" 'wep128' => '',\n", u" 'wep_authentication' => 'open'\n", u' },\n', u" 'hidden' => 0,\n", u" 'lock' => '',\n", u" 'nodel'
=> '',\n", u" 'ref' => 'REF_ItfAweTest1',\n", u" 'type' => 'awe_network'\n", u' }\n']
这就是我需要搜索ssid名称,在这种情况下是HACKME,以便触发程序的下一部分。那部分看起来像这样:
'ssid' => 'HACKME',\n", u"
如果我使用以下代码
from re import search as re_search
ssid = 'HACKME'
#lots of guff removed
if not re_search('\'ssid\' =\> \'' + ssid +'\'', str(stdout.readlines())):
continue
else:
print 'SSID found - let's do something
一切正常。但是,如果我改为使用它:
import re
ssid = 'HACKME'
# lots of guff removed
ssidRegex = re.compile('\'ssid\' => \'' + ssid +'\'')
ssidresult = ssidRegex.search(str(stdout.readlines))
if not ssidresult:
continue
else:
print 'SSID found - let's do something'
我可以在相同的输出上相继运行这两个,但它只会在未编译的'它的版本。这正在让我发疯。
在执行过程中,我甚至添加了一个' print ssidRegex.pattern'到我的代码,这对我来说很好。这必然意味着某些事情是非常错误的。输出如下:
'ssid' => 'HACKME'
我现在希望你们中的一个人能够发现我(很可能是非常)明显的错误并让我走上正轨。我知道还有一个额外的' \'在' ='之间和'>'在代码的第一个版本中,但是当我将它添加到编译版本时,我会收到错误,而且我似乎无法正确地将其排除。
是的 - 我知道编译正则表达式可能不会给我的程序增加太多速度,但我想知道我现在在做什么错。纯粹的原则问题。 ;)
答案 0 :(得分:4)
()
之后的代码遗失stdout.readlines
。
ssidresult = ssidRegex.search(str(stdout.readlines()))
^^
<强>更新强>
使用read
方法可能更合适,因为read
将返回字符串而不是字符串列表;无需致电str
:
ssidresult = ssidRegex.search(stdout.read())