Можно. Но список пакетов тоже надо обновлять. Поэтому там, где ubuntu желателен хоть какой-то выход в интернет, можно даже gprs. По моему опыту, обновление спписка пакетов - где-то 300-400Кб трафика.
Сейчас хочу сделать его интерактивным, и чтоб можно было использовать для установки ПО. Набросок:
#!/bin/bash
#---------------------------------------------------#
# Скрипт обновляет систему и устанавливает #
# новое ПО. Работает в зависимости от того, #
# на каком компьютере запущен, дополнительных #
# скриптов не надо #
# Пнд 18 Янв 2010 19:13:10 #
#---------------------------------------------------#
# ОБОЗНАЧЕНИЯ: #
# 0 - компьютер без интернета, 1 - с интернетом #
#---------------------------------------------------#
#--------------------------------------------------------------------------------------------------
temp_dir0='/home/ploop/files/updfl/' # > Временные файлы на компьютере 0
temp_dir1='/home/ploop/files/updfl/' # > Временные файлы на компьютере 1
flash_fname='updates' # > Имя архива на flash
flash_name='ploop_flash' # > Имя flash-накопителя ("метка тома")
flash_mount='/media/' # > Куда монтируются флешки
pc=1 # > На каком компьютере скрипт.
soft_source='/home/ploop/sss' # > Имя файла списка софта, генерируемое синаптиком
upd_dir='updates' # Папка с обновлениями внутри temp_dir
soft_dir='soft' # Папка с ПО внутри temp_dir
soft_list='soft-list' # Список ссылок на софт, внутри soft_dir
upd_list='upd-list' # Список ссылок на обновления, внутри upd_dir
password='XXXXXXXXXX' # Пароль для шифрования архива
tar_key='' # Ключ для архиватора tar.
# +Пусто - не архивировать, или -z, -j, --lzma, --lzop
#--------------------------------------------------------------------------------------------------
# Функция копирования на flash
copy_to_flash ()
{
# В $1 путь к файлам на компе, в $2 - на флешке
# Создадим полный архив папки
cd "$1"
echo ' Создание архива...'
tar -cf $tar_key 'tmp' "$upd_dir" "$soft_dir"
echo ' Шифрование файла...'
echo "$password" | gpg --passphrase-fd 0 --no-tty -c 'tmp' > /dev/null
echo ' Копирование на flash...'
cp 'tmp.gpg' 'tmp'
rm 'tmp.gpg'
# Скопируем её на flash
cp 'tmp' "$2" &>/dev/null
if [ $? -ne 0 ]
then
return 1
else
rm 'tmp'
return 0
fi
}
# Функция чтения из flash
copy_from_flash ()
{
# В $1 путь к файлам на компе, в $2 - на флешке
echo ' Копирование из flash на компьютер...'
if cp "$2" "$1"'tmp.gpg' &>/dev/null
then
cd "$1"
echo ' Удаление старых файлов...'
rm -rf $upd_dir > /dev/null
rm -rf $soft_dir > /dev/null
else
return 1
fi
echo ' Расшифровка файлов...'
echo "$password" | gpg --no-tty --passphrase-fd 0 -q -o 'tmp' 'tmp.gpg' &>/dev/null
echo ' Распаковка файлов...'
if tar -xf $tar_key 'tmp' 1>/dev/null
then
rm 'tmp' &>/dev/null
rm 'tmp.gpg' &>/dev/null
return 0
else
#rm 'tmp' &>/dev/null
#rm 'tmp.gpg' &>/dev/null
return 2
fi
}
# Функция выводит ошибки красным
echored ()
{
red='\E[31;1m'
echo -e$2 "$red""$1"
tput sgr0
}
# Функция выводит сообщения синим
echoblue ()
{
red='\E[34;1m'
echo -e$2 "$red""$1"
tput sgr0
}
# Завершение работы приложения
end ()
{
echo
echoblue " Завершение работы"
read -sn 1 -p " Нажмите любую клавишу для выхода..."
echo; echo
if [ -z $1 ]
then
exit 0
else
exit $1
fi
}
# Далее действия, в зависимости от того, на каком компьютере запущен скрипт.
if [ "$pc" -eq 1 ] # Если с интернетом
then
# Проверим наличие флешки и файла
echo
echo " Скрипт работает на компьютере со свободным доступом в интернет"
echo -n " Продолжить? [y/n] "
read q
echo
echo "$q" | grep -q [yYдД]
if [ $? -ne 0 ] || [ ${#q} -ne 1 ]
then
echo " Отказ от продолжения!"
end
fi
if ! [ -f "$flash_mount""$flash_name"'/'"$flash_fname" ]
then
echored " Flash-накопитель не подключен, подключен не тот,"
echored " либо на нём отсутствует необходимый файл!"
end 1
fi
# Проверим наличие папки назначения
if ! [ -d "$temp_dir1" ]
then
echored " Каталог "$temp_dir1" не найден!"
echored " Создайте его, либо отредактируйте сценарий."
end 1
fi
# Распакуем архив
copy_from_flash "$temp_dir1" "$flash_mount""$flash_name"'/'"$flash_fname" &>/dev/null
r=$?
if [ $r -eq 1 ]
then
echored " Ошибка при копировании файла с носителя!"
echored " Проверьте, исправен ли носитель, есть ли права на чтение"
echored " файла \"$flash_fname\" и на запись его в \"$temp_dir1\""
end 1
fi
if [ $r -eq 2 ]
then
echored " Ошибка при распаковке файла!"
echored " Возможно, файл не расшифрован или повреждён."
echored " Проверьте пароль."
end 1
fi
# Проверим, есть ли обновления
if [ -f "$temp_dir1""$upd_dir"'/'"$upd_list" ] || [ -s "$temp_dir1""$upd_dir"'/'"$upd_list" ]
then
echoblue " Задания на закачку обновлений системы найдены"
cnt=0
ecnt=0
n=0
cd "$temp_dir1""$upd_dir"
for str in `cat "$temp_dir1""$upd_dir"'/'"$upd_list"`
do
let "n += 1"
echo -n " Загрузка файла \""`basename $str`\"
link=`echo $str | sed s/\'//g`
if wget -c $link &>/dev/null
then
echoblue " OK"
let "cnt += 1"
else
echored " Ошибка!"
echo $str >> not-loaded
let "ecnt += 1"
fi
done
echo
if [ $ecnt -eq 0 ]
then
echo " Загружено файлов: $cnt."
else
if ! [ $ecnt -eq $n ]
then
echo
echo " Загружено файлов: $cnt, не загружено: $ecnt."
echo " Вы можете докачать их повторным запуском скрипта."
else
echo
echored " Ни одного файла не загружено!"
echored " Проверьте соединение с интернет."
fi
# Если есть недокачанные, добавим:
cp "not-loaded" "$upd_list"
rm "not-loaded"
fi
else
echo " Загрузка обновлений системы не требуется."
fi
# Проверим, есть ли софт
if [ -f "$temp_dir1""$soft_dir"'/'"$soft_list" ] || [ -s "$temp_dir1""$soft_dir"'/'"$soft_list" ]
then
echo
echoblue " Задания на закачку нового софта найдены"
cnt=0
ecnt=0
n=0
cd "$temp_dir1""$soft_dir"
for str in `cat "$temp_dir1""$soft_dir"'/'"$soft_list"`
do
let "n += 1"
echo -n " Загрузка файла \""`basename $str`\"
if wget -c $str &>/dev/null
then
echoblue " OK"
let "cnt += 1"
else
echored " Ошибка!"
echo $str >> not-loaded
let "ecnt += 1"
fi
done
echo
if [ $ecnt -eq 0 ]
then
echo " Загружено файлов: $cnt."
else
if ! [ $ecnt -eq $n ]
then
echo " Загружено файлов: $cnt, не загружено: $ecnt."
echo " Вы можете докачать их повторным запуском скрипта."
else
echored " Ни одного файла не загружено!"
echored " Проверьте соединение с интернет."
fi
# Если есть недокачанные, добавим:
cp "not-loaded" "$soft_list"
rm "not-loaded"
fi
else
echo " Загрузка нового софта не требуется."
fi
# Сбросим данные на flash
copy_to_flash "$temp_dir1" "$flash_mount""$flash_name"'/'"$flash_fname"
if [ $? -eq 1 ]
then
echo
echored " Ошибка записи на flash!"
echored " Носитель не исправен или не подключен."
echo
fi
end
fi
# ------------------------------------------------------------------------
if [ "$pc" -eq 0 ] # Если без интернета
then
if [ "$UID" -ne 0 ]
then
echo
echored " Для работы в этом режиме"
echored " требуются права администратора!"
echo
end 1
fi
# Проверим наличие флешки и файла
echo
echo " Скрипт работает на компьютере с ограниченным доступом в интернет"
echo -n " Продолжить? [y/n] "
read q
echo
echo "$q" | grep -q [yYдД]
if [ $? -ne 0 ] || [ ${#q} -ne 1 ]
then
echo " Отказ от продолжения!"
end
fi
# Проверим наличие папки назначения
if ! [ -d "$temp_dir0" ]
then
echored " Каталог \"$temp_dir0\" не найден!"
echored " Создайте его, либо отредактируйте сценарий."
end 1
fi
# Проверим, есть ли файл
file_exist=0
if [ -f "$flash_mount""$flash_name"'/'"$flash_fname" ]
then
copy_from_flash "$temp_dir0" "$flash_mount""$flash_name"'/'"$flash_fname" &>/dev/null
r=$?
if [ $r -eq 1 ]
then
echored " Ошибка при копировании файла с носителя!"
echored " Проверьте, исправен ли носитель."
end 1
fi
if [ $r -eq 2 ]
then
echored " Ошибка при распаковке файла!"
echored " Возможно, файл не расшифрован или повреждён."
echored " Проверьте пароль."
end 1
fi
file_exist=1
else
echoblue ' Файл с обновлениями не найден. Будет создан новый.'
file_exist=0
fi
if [ $file_exist -eq 1 ] #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
then
# Проверим, есть ли .deb пакеты в папке обновлений
if ls "$temp_dir0""$upd_dir" | grep '.\.deb$'
then
# Если да, обновляем систему:
echoblue ' Найдены пакеты с обновлениями системы!'
echo ' Копирование пакетов в /var/cache/apt/archives'
cd "$temp_dir0""$upd_dir"
cp *.deb '/var/cache/apt/archives'
echo ' Запуск aptitude full-upgrade...'
# Установим пакеты:
if aptitude full-upgrade > /tmp/upd_auto_install.txt
then
echo
echoblue ' Обновление завершено.'
echo ' Удаление временных файлов...'
echo
rm *.deb &>/dev/null
else
echo
echored ' Обнаружена ошибка при обновлении системы!'
echo ' Подробности:'
echo
cat /tmp/upd_auto_install.info
echo
fi
else
echo ' Файлы обновлений не найдены.'
fi
# Проверим, есть ли .deb пакеты в папке нового ПО
if ls "$temp_dir0""$soft_dir" | grep '.\.deb$'
then
# Установим ПО
# Предварительно скопируем в /var/cache/apt/archives
echoblue ' Найдены пакеты с новым ПО!'
echo ' Копирование пакетов в /var/cache/apt/archives'
cd "$temp_dir0""$soft_dir"
cp *.deb '/var/cache/apt/archives'
echo ' Установка пакетов'
if dpkg -i *.deb &>/tmp/pak_auto_install.txt
then
echo
echoblue ' Новое ПО установлено.'
echo
echo ' Удаление временных файлов...'
echo
rm *.deb &>/dev/null
else
echo
echored ' Обнаружена ошибка при установке ПО!'
echo ' Подробности:'
echo
cat /tmp/pak_auto_install.info
echo
fi
else
echo ' Файлы установки ПО не найдены.'
fi
echo ' Работа с имеющимися пакетами закончена.'
echo ' Обновить список пакетов сейчас, для последующей'
echo -n ' установки обновлений? [y/n] '
read q
echo
echo "$q" | grep -q [yYдД]
if [ $? -ne 0 ] || [ ${#q} -ne 1 ]
then
echo " Понял! Обновим потом."
end
fi
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
fi
echo ' Для обновления списка пакетов необходим'
echo ' доступ в интернет. Подключитесь любым'
echo ' возможным способом (dial-up, GPRS и т.д.)'
read -sn 1 -p ' и нажмите любую клавишу для продолжения...'
echo; echo
# Обновление списка пакетов
echo ' Загрузка списка. Ждите...'
mkdir "$temp_dir0""$upd_dir" &>/dev/null
mkdir "$temp_dir0""$soft_dir" &>/dev/null
apt_text=`apt-get update 2>&1`
var1=`echo "$apt_text" | grep 'Ош'`
if [ -z "$var1" ]
then
echo ' Список загружен. Формирование файла...'
plist=`apt-get --print-uris -y dist-upgrade`
# Распарсим вывод apt-get'а и добавим ссылки в список
# Предварительно удалим старый файл с ссылками
cd "$temp_dir0""$upd_dir"
rm $upd_list &>/dev/null
ok=0
cnt=0
for str in $plist
do
out=`echo $str | grep 'http://'`
if ! [[ -z $out ]]
then
echo $out >> "$temp_dir0""$upd_dir"'/'"$upd_list"
ok=1
let "cnt += 1"
fi
done
if [ $ok -eq 0 ]
then
echoblue ' Система не требует обновления.'
else
echo ' Список необходимых обновлений создан.'
echo ' Добавлено: '$cnt' файлов.'
fi
else
echo
echored ' Обнаружена ошибка при обновлении списка пакетов!'
echo ' Подробности:'
echo
echo "$apt_text"
end 1
fi
echo
echo ' Для установки нового софта запуститcя synaptic,'
echo ' выберите необходимые пакеты, создайте сценарий'
echo ' закачки (Файл -> Создать сценарий закачки пакетов),'
echo ' сохраните его как '"$soft_source"
echo ' и закройте synaptic.'
echo -n ' Хотите устанавливать ПО? [y/n] '
read q
echo
echo "$q" | grep -q [yYдД]
if [ $? -ne 0 ] || [ ${#q} -ne 1 ]
then
echo " Отказ от установки ПО."
else
echo ' Запускается synaptic...'
/usr/sbin/synaptic > /dev/null
fi
if [ -f "$soft_source" ]
then
echo " Обработка файлов..."
# Удалим старый список софта
cd "$temp_dir0""$soft_dir"
rm $soft_list > /dev/null
ok=0
plist=`cat "$soft_source"`
for str in $plist
do
out=`echo $str | grep 'http://'`
if ! [[ -z $out ]]
then
echo $out >> "$temp_dir0""$soft_dir"'/'"$soft_list"
ok=1
fi
done
if [ $ok -eq 0 ]
then
echoblue ' Новое ПО выбрано!'
else
echo " Новое ПО не выбрано."
fi
else
echo " Новое ПО не выбрано."
fi
echo ' Копирование даных на носитель...'
# Сбросим данные на flash
copy_to_flash "$temp_dir0" "$flash_mount""$flash_name"'/'"$flash_fname"
if [ $? -eq 1 ]
then
echo
echored " Ошибка записи на flash!"
echored " Носитель не исправен или не подключен."
echo
end 1
fi
end
fi