我目前正在编制一个列表,其中只包含该区域内所有可用网络的ESSID,以用于其他目的。
这是剧本:
from subprocess import check_output
scanoutput = check_output(["iwlist", "wlan0", "scan"])
for line in scanoutput.split():
if line.startswith("ESSID:"):
line=line[7:-1]
print line
当我从SSH运行命令“sudo iwlist wlan0 scan | grep ESSID”时,这是输出:
ESSID:"easybell DSL"
ESSID:"FRITZ!Box Fon WLAN 7360 SL_EXT"
ESSID:"NoTrespassing"
ESSID:"WLAN-519293"
ESSID:"Cinque"
ESSID:"EasyBox-738461"
ESSID:"FRITZ!Box WLAN 3270"
ESSID:"EasyBox-A2B246"
可悲的是,Python脚本输出:
easybel
FRITZ!Bo
NoTrespassing
WLAN-519293
Cinque
EasyBox-738461
FRITZ!Bo
EasyBox-A2B246
仔细检查一下,当有空间时它看起来像是笨拙的,但它似乎也会在打印之前删除空格前的最后一个字母。有人可以解释这里发生了什么吗?
据我所知,是来自代码
line=line[7:-1]
是7负责删除前7个字符,因此:ESSID:“和-1从最后一个负责”因此产生一个只有SSID名称的简洁行。
当我运行没有此行的代码时,这是输出:
ESSID:"easybell
ESSID:"NoTrespassing"
ESSID:"WLAN-519293"
ESSID:"Cinque"
ESSID:"EasyBox-738461"
ESSID:"FRITZ!Box
ESSID:"FRITZ!Box
如何从SSH线路获取正确的信息,但是当我让python运行代码时它会丢失部分?
有什么方法可以解决这个问题吗?
谢谢!
答案 0 :(得分:2)
split()
默认剪切任何空格,您需要将split()
分隔符明确设置为\n
:
string.split(s [,sep [,maxsplit]]):如果缺少可选的第二个参数sep或
None
,则单词由空格字符的任意字符串分隔(空格,制表符,换行符,返回,换页)
>>> test = '''
ESSID:"easybell DSL"
ESSID:"FRITZ!Box Fon WLAN 7360 SL_EXT"
ESSID:"NoTrespassing"
[...]
'''
>>> for l in test.split():
... if l.startswith('ESSID'):
... print(l[7:-1])
...
easybel
FRITZ!Bo
NoTrespassing
[...]
>>> for l in test.split('\n'):
... if l.startswith('ESSID'):
... print(l[7:-1])
...
easybell DSL
FRITZ!Box Fon WLAN 7360 SL_EXT
NoTrespassing
[...]
或使用splitlines()
:
>>> for l in test.splitlines():
... if l.startswith('ESSID'):
... print(l[7:-1])
...
easybell DSL
FRITZ!Box Fon WLAN 7360 SL_EXT
NoTrespassing
[...]
答案 1 :(得分:1)
你在输出上使用了split()
,它在任何空格上划分(不仅仅是换行符),因此line
实际上设置为ESSID:"easybell
然后DSL"
和然后ESSID:"FRITZ!Box
等。请注意,由于最终"
与ESSID
不在同一个字词中,line[7:-1]
最终会切断ESSID:"easybell
中的最后一个字符},所以你最终得到了easybel
。你想要做的是for line in scanoutput.splitlines():
。
答案 2 :(得分:1)
这不会删除最后一个字符(仅限开始/结束引号)。执行line = line.strip()
可确保startswith("ESSID:")
因为白色空格而失败,因为#34; ESSID:"。
from subprocess import check_output
scanoutput = check_output(["iwlist", "wlan0", "scan"])
for line in scanoutput.split("\n"):
line = line.strip()
if line.startswith("ESSID:"):
line=line[7:-1]
print line