apt списки в /var/lib/apt/lists, перезаписанные html-страницей для условий Starbucks wifi
Сегодня днем я сел в Starbucks, чтобы поработать (Ubuntu 12.04 Desktop x64), и получил значок ошибки в виде красного кружка с белой линией в systray, уведомляющий об ошибке пакета. Кроме того, 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
и, о чудо, весь файл был перезаписан источником html для страницы условий и положений Wi-Fi Starbuck ATT, с которой вы должны согласиться, установив флажок при первом входе в их бесплатный Wi-Fi (первые несколько строк ниже),
Это очень странно и немного сбивает с толку, так как какой-то случайный интернет-сайт сумел перезаписать файл, который должен быть изменен только пользователем 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
Источник домашней страницы Wi-Fi Starbucks ATT:
<!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 ответ
Вот что случилось.
sudo apt-get update
либо был выполнен вручную, либо был запущен автоматически (Помните автоматические обновления из диспетчера обновлений?) и попытался обновить списки.- Вы оказались подключены к Wi-Fi, но еще не приняли лицензию или что-то еще.
- Wi-Fi был достаточно плох, чтобы отправить, вероятно, статус HTTP 301/302 (перенаправление) вместо чего-то более подходящего, и послушно последовал за ним, сбросив страницу ответа в файле списков.
- Это выглядит совершенно нормально, и из-за неправильной настройки Wi-Fi. В идеале, когда вам еще не разрешен доступ, должен быть возвращен код ошибки, чтобы подобные вещи не происходили. Просто для анологии, если у вас был сценарий или альтернативная установка для возобновления загрузки при каждом подключении к Интернету, и он начинает работать, когда вы подключаетесь к этому Wi-Fi, и вы еще не приняли соглашение, инструмент покорно сбросит ту же страницу и объявите, что файл был загружен, потенциально перезаписывая любую предыдущую часть исходного файла.
Если вы подключены к Интернету, должно быть совершенно безопасно удалить всю папку /var/lib/apt/lists
и сделать обновление. Это исправит это. Чтобы быть в безопасности, вы можете сделать резервную копию вместо удаления.
sudo mv /var/lib/apt/lists ~;sudo apt-get update
должен сделать трюк, и если это не так, вернитесь обратно с sudo mv ~/lists /var/lib/apt