/var/lib/apt/lists 中的 apt 列表被星巴克 wifi 条款的 html 页面覆盖

/var/lib/apt/lists 中的 apt 列表被星巴克 wifi 条款的 html 页面覆盖

今天下午我坐在星巴克工作(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

事情是这样的。

  • Asudo 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

相关内容