Создаем скрипт автоматического добавления репозиториев и установки пакетов.

Один из читателей просил написать статью про создание скрипта, чтобы автоматически добавить нужные репозитории и установить из них нужные нам пакеты.

То есть, чтобы переустановка системы не доставляла нам проблем с установкой нужных приложений и подключения репозиториев.

Вот собственно об этом и пойдет речь в данной статье.

Для начала опишу команды:

sudo - это команда, которая дает права суперпользователя, для доступа к действиям root текущему пользователю.

apt-get - это пакетный менеджер в ubuntu.
с помощью пакетного менеджера мы обновляем систему, устанавливаем пакеты. Облегчает жизнь пользователям.
Итак нам понадобятся команды пакетного менеджера:
apt-get update - обновляет информацию о пакетах в добавленных в систему репозиториях
add-apt-repository - данная команда добавляет репозитории в систему.
возможно два способа добавления:

  1. add-apt-repository 'deb uri distribution [component1] [component2] [...]'
  2. add-apt-repository ppa:<ppa_name>

Вот, стоит также упомянуть, что нужно в скрипте указывать параметр
-y
так как придется подтверждать установку или обновление системы без этого параметра, и весь автоматизм теряется.
Можно еще добавить параметр
--force-yes 
означает отвечать на любые вопросы «ДА».
Например о решении проблемы с зависимыми пакетами
Пожалуй достаточно.

Приступим к практике.

Советую также прочитать мою статью о скриптах sh, так как там полезные вещи описаны:

Создаем простой текстовый файл, называем его "name.sh" (называйте как угодно, главное, чтобы разрешение было .sh)

Открываем текстовым редактором.
Для начала нужно обязательно поставить вверху следующее обозначение:

#!/bin/bash

Важное замечание!
Не вводите команды в скрипт используя команду sudo, так как скрипт вы будете запускать с помощью этой команды, и следовательно все команды внутри скрипта будут выполняться от суперпользователя.
А если внесете эту команду в скрипт, то будет спрашивать ввод пароля, а при долгой выполнении одной из команд, прервется сессия суперпользователя, вы пойдете пить чай, а в командной строке будет висеть выполнение задачи. Думаю смысл ясен.

Итак сначала мы записываем команду для обновления информации о пакетах:

apt-get update

Затем с новой строчки вписываем команду для обновления системы полностью:

apt-get -y --force-yes dist-upgrade

Теперь можно записывать сюда нужные репозитории, каждое добавление с новой строчки, я лишь покажу несколько примеров добавления различных репозиториев:

add-apt -repository ppa:rvm/smplayer

либо

add-apt -repository 'deb http://packages.linuxmint.com/ julia main'

либо как из моей статьи по установке opera и google chrome:
вписываем команду (в одну строку) для добавления репозитория chrome: 

sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

Теперь загружаем ключ репозитория Chrome:

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Что я хочу донести до вас?
То есть Вы прописываете те команды, что вводите в консоле без sudo для установки тех пакетов что вам нужно.
Только здесь удобнее сначала добавить все репозитории и ключи, а потом уже список пакетов поставить сразу.

После того, как добавили список репозиториев, теперь нужно записать команду для обновления информации о пакетах в репозиториях:

apt-get update

Затем, можно ввести команду, чтобы проверить, что у всех добавленных репозиториев добавились ключи, и если у каких то репозиториев ключи не добавились, добавятся (команду также в одну строчку):

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com
apt-get update 2>&1 | grep -o '[0-9A-Z]{16}$' | xargs

Для установки пакетов воспользуемся следующей "фишкой":
Создаем именованный список элементов:

PACKAGES="p7zip libgcc faad  gimp conky"

В этот список вы записываете все пакеты через пробел, которые хотите установить. 

А потом следующая строчкой устанавливаем этот список пакетов:
sudo apt-get -y --force-yes install $PACKAGES

Вот таким образом у вас должно получиться нечто такое (для увеличения картинки кликните по ней):

Кроме того в этот скрипт можно добавить и удаление программ, которые в убунту стоят по умолчанию(как пример), просто запишите с новой строки

apt-get -y --force-yes remove название_пакета

Кроме этого, еще можно вставить с новой строки команды для настройки системы gsettings, например команду для решения проблемы с коддировкой:

gsettings set org.gnome.gedit.preferences.encodings auto-detected
"['UTF-8', 'WINDOWS-1251', 'CURRENT', 'ISO-8859-15', 'UTF-16']"

В принципе всё, если будут еще какие-то вопросы специфичные по этому поводу, задавайте в комментариях.
Я постараюсь ответить и в случае чего дополнить статью.

Ну и конечно, чтобы запустить скрипт:
sudo sh /путь/script.sh
Вместо script.sh ваше название скрипта и путь.

Вот и всё.

  • https://www.blogger.com/profile/07459817117118080304 bakla

    Класс, вот таких бы статей побольше, спасибо. Однозначно в закладки.

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      Спасибо за отзыв, буду стараться. Просто не всегда есть время.

  • http://forum.ubuntu.ru/index.php?action=profile&u=130380 coden

    Кому интересно, скрипт автоматической установки — http://ubuntuone.com/1dfgwAHuphn10VoKaq3QIu
    Замечания.
    1)После добавления репозитариев и обновления списка пакетов, перед установкой пакетов, думаю, стоит применять команду apt-get -y dist-upgrade , для обновления системы. Она корректно обновит систему и программы до актуального состояния.
    2)Для полной автоматизации установки, можно добавить команду dpkg -i /путь до папки/*.deb , для установки программ, у которых нет репозитариев, из пакетов. Предварительно сохраняем нужные пакеты в папку.
    3)Для удаления всех неиспользуемых пакетов, из установленных в системе, в конце можно применить команду apt-get -y autoremove .
    4)Для автоматизации установки пакетов, которые выводят окно подтверждения, использовал xdotool. Работает следующим образом. Запускаем скрипт в терминале, сворачиваем окно терминала, перед установкой программы, показывающей окно подтверждения, на передний план выходит окно терминала, через 10 секунд, автоматически нажимается Tab, затем через 2 секунды нажимается Enter.

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      перед установкой пакетов, думаю, стоит применять команду apt-get -y dist-upgrade

      Мы сделали это с самого начала. Скрипта. Если есть желание делать по другому, то конечно. Я же не настаивал именно на таком, просто показал как это делается. Так же можно добавить и dpkg -i /путь до папки/*.deb
      apt-get autoclean и apt-get autoremove
      Да можно хоть добавить обновление ядер 🙂
      Это уже ваше решение.

    • coden

      Да, извиняюсь, не заметил. Статья хорошая. Подробно и четко.
      Замечание по скрипту script.sh
      Из начала скрипта убрать строки:
      #Начальное обновление системы
      apt-get -y update
      apt-get -y —force-yes dist-upgrade
      и добавить строку:
      apt-get -y —force-yes dist-upgrade
      после строк:
      #После того как добавили репозитарии и ключи, обновляем информацию о пакетах
      apt-get -y update

      Это нужно для того чтобы во первых не терять времени на двойную работу команды apt-get -y update, во вторых обновление информации о пакетах и установку/обновление этих пакетов нужно делать после добавления новых репозитариев, так как именно оттуда будет браться информация о новых пакетах.

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      Ну да, в принципе логично. Поправлю этот момент.

  • Анонимный

    а нельзя ли сделать скрипт, который бы считал список репозиториев уже установленных пакетов в систему и сохранил его в файл с тем, чтобы, скажем после переустановки системы можно было восстановить установленное ПО одной командой?

  • ALPom

    В этот список вы записываете все пакеты через запятую, которые хотите установить.
    Не через запятую, а через пробел, как при обычной установке через apt-get install.
    Анонимный, можно, и не так сложно. Все используемые репозитории хранятся в папке /etc/apt/. Точнее это файлы /etc/apt/source.list и папка /etc/apt/source.list.d. Если скопировать ее в другую систему, а потом установить ключи командой:
    sudo apt-key adv —recv-keys —keyserver keyserver.ubuntu.com apt-get update 2>&1 | grep -o '[0-9A-Z]{16}$' | xargs
    , то все должно заработать.

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      Спасибо, действительно написал "через запятую", Сейчас исправлю.

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      Про папки правильно написали, всё именно так и есть. Должно сработать.

  • https://www.blogger.com/profile/09229915452060637778 Александр Гунько

    клас спасибо

  • https://www.blogger.com/profile/06648086789097368554 Кирилл Калиниченко

    Спасибо большое за такую полезную статью! Ваш сайт стал для меня вторым домом:))

  • https://www.blogger.com/profile/17231709542286499211 Serge

    coden, на ваш скрипт ругается терминал )
    а именно на строку if [[ -n "$DISPLAY" ]] ; then
    и
    function press_key_tab_enter()

    в чем может быть ошибка?

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      Составьте свой скрипт на примере моей статьи и не будет ругаться.

    • https://www.blogger.com/profile/17231709542286499211 Serge

      Edward, вопрос в автоматической установке пакета с кодеками, где нужно вмешательсво — нажать таб и интер, я так понимаю у вас это не автоматизировано.

      заметил, что часть программ не установилось, попробую потом еще раз, но в это раз для каждой программы новая строка, а не оптом )

    • https://www.blogger.com/profile/00865845114198842309 Edward Kobylyanets

      вот это я не учел, спасибо. Попробую обход этого момента на днях и допишу в статье.

  • Антон

    Возможно позно но всеже:
    if [ «$(id -u)» != «0» ]; then
    echo «This script must be run as root»
    exit 1
    fi
    Проверит запущен ли процес от root (sudo)