今天下午我坐在星巴克工作(Ubuntu 12.04 Desktop x64),系统托盘中出现了一个带有红圈和白线的错误图标,提示软件包错误。此外,apt、aptitude、update-manager 和 synaptic 都因此无法启动。
仔细一看,错误是:
> sudo aptitude install mmv
[sudo] password for kurtosis:
[ ERR] Reading package lists
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/linux.dropbox.com_ubuntu_dists_precise_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.
[ ERR] Reading package lists
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/linux.dropbox.com_ubuntu_dists_precise_main_binary-i386_Packages
E: The package lists or status file could not be parsed or opened.
于是打开了罪魁祸首/var/lib/apt/lists/linux.dropbox.com_ubuntu_dists_precise_main_binary-i386_Packages
,瞧,整个文件已被星巴克 ATT wifi 条款和条件页面的 html 源代码覆盖,您必须在第一次登录他们的免费 wifi 时选中复选框以同意该条款和条件(下面前几行)。
这非常奇怪,也有点令人不安,因为一些随机网站已经设法覆盖了只有 root 才能修改的文件。知道发生了什么吗?
通过删除/var/lib/apt/lists
并重新生成解决使用此命令:
$ sudo -i
# apt-get clean
# cd /var/lib/apt
# mv lists lists.old
# mkdir -p lists/partial
# apt-get clean
# apt-get update
星巴克ATT wifi主页来源:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>AT&T Wi-Fi Service @ Starbucks</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" type="image/ico" href="/favicon.ico" />
<script type="text/javascript" language="javascript" src="/dhtml/master.js"></script>
<script type="text/javascript" language="javascript" src="/dhtml/x_core.js"></script>
<script type="text/javascript" language="javascript" src="/dhtml/x_event.js"></script>
<script type="text/javascript" language="javascript" src="/dhtml/x_xhr.js"></script>
<script type="text/javascript" src="/dhtml/aws/dhtml.js"></script>
<script type="text/javascript" src="/dhtml/jquery/jquery-1.3.2.js"></script>
<script type="text/javascript" language="javascript" src="/dhtml/jquery/aws_jclock_2.2.0.js"></script>
<script type="text/javascript" language="javascript">
$(function($) {
var options = {
format: '%i:%M<span class="clock_ampm">%P</span>'
}
$('.jclock').jclock(options);
});
</script>
<link rel="stylesheet" type="text/css" href="/css/att/themes/sbux/laptop_free_v3.css"/>
<link rel="stylesheet" type="text/css" href="/css/att/themes/sbux/sbux_auto_addl_v2.css"/>
</head>
<body>
<div id="free_wrap">
<div id="topblock">
<div id="topmid">
<div id="free_sbux_mainform">
<div id="iframe_free">
<iframe id="sbux_iframe" src="http://www.starbucks.com/coffeehouse/wi-fi-landing" scrolling="no">
</iframe>
</div id="iframe_free">
<div id="free_sbux_logo"><a href="http://www.starbucks.com"></a></div id="free_sbux_logo">
<div id="free_sbux_location"><div id="location_city">PALO ALTO, CA</div id="id="location_city"></div id="free_sbux_location">
<div id="inline_free_form">
<div id="free_text_line">Starbucks is pleased to offer complimentary Wi-Fi <b>including the premium content of the Starbucks Digital Network</b> to customers who are enjoying our food and beverages.</div>
...
答案1
事情是这样的。
- A
sudo apt-get update
要么手动执行,要么自动触发(还记得更新管理器的自动更新吗?)并尝试刷新列表。 - 您恰好已连接到 WiFi,但尚未接受许可证或其他任何内容。
- wifi 状况很糟糕,可能会发送 HTTP 301/302 状态(重定向)而不是更合适的内容,并且 apt 会乖乖地遵循它,将响应页面转储到列表文件中。
- 这看起来完全正常,是由于 wifi 配置错误造成的。理想情况下,当您尚未被允许访问时,将返回错误代码,以免发生类似的事情。打个比方,如果您有一个脚本或备用设置,可以在您连接到互联网时恢复下载,并且当您连接到此 wifi 时它开始工作,而您尚未接受协议,则该工具将尽职尽责地转储同一页面并声明文件已下载,可能会覆盖原始文件的任何先前部分。
如果您已连接到互联网,删除整个文件夹/var/lib/apt/lists
并进行更新应该是绝对安全的。这将解决这个问题。为了安全起见,您可以选择备份而不是删除。
sudo mv /var/lib/apt/lists ~;sudo apt-get update
应该可以解决问题,如果没有,请恢复sudo mv ~/lists /var/lib/apt