Предотвратить sudo, apt-get и т. Д. От проглатывания вставленного ввода в STDIN?
Я часто пишу вики-инструкции по установке различных серверных пакетов в Ubuntu (сейчас 11.10 Oneiric). Они всегда включают такие вещи, как:
sudo apt-get install -y postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
но когда вы вырезаете и вставляете это в терминал, либо sudo, apt-get, либо некоторая подоболочка случайным образом проглатывают последующие строки ввода, и только apt-get install
случается.
Есть ли способ сделать это более удобным для вырезания и вставки? Я полагаю, я мог бы обернуть каждый раздел
cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script
но есть ли лучший способ?
6 ответов
Чтобы избежать проблемы вырезания и вставки, а также безопасного запуска последовательных команд, нужно поместить их в одну строку, разделенную &&
который будет выполнять только cp
на успешное завершение sudo apt-get install
:
sudo apt-get install -y postfix && sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
В конце концов, если первая команда потерпит неудачу, вы, вероятно, не захотите продолжать выполнение остальных команд.
Что касается того, почему команды проглатываются, когда вы вставляете несколько строк одновременно... когда устанавливается postfix, он задает вопросы конфигурации с интерфейсом диалога debconf, который, скорее всего, мешает вырезать и вставлять. Может быть, другой интерфейс, такой как readline или неинтерактивный, помешал бы меньше? Тем не менее, я бы использовал &&
метод в любом случае, так как это безопаснее.
Если вы устанавливаете postfix с вашими скриптами, это звучит так, как будто вы пытаетесь автоматизировать установку новых систем? Если это так, рассмотрите возможность использования preseeding в качестве опции (здесь приведена некоторая документация по Ubuntu 11.10) или, возможно, используйте puppet?
Об этом есть выдающийся отчет об ошибке: Отчет об ошибке Debian #728775 - apt-get неоправданно потребляет ввод. В отчете говорится:
Когда apt-get вызывается способом, который включает в себя фактическую установку пакета, он считывает любые доступные данные из стандартного ввода, независимо от фактической необходимости. Это нарушает обычную способность интерактивной оболочки вводить следующую команду во время выполнения текущей команды: apt-get использует ввод, предназначенный для оболочки. strace показывает, что входные данные считываются процессом apt-get верхнего уровня, с помощью read(2) из fd 0 в ответ на pselect (2).
...
Он находится в pkgDPkgPM::Go() в apt-pkg/deb/dpkgpm.cc. Далее по той же функции есть цикл pselect, который соответствует тому, что я видел с помощью strace. Он читает из stdin только при условии (master >= 0 &&! D->stdin_is_dev_null)
И в ответ:
Это нужно для того, чтобы не вводить следующую команду во время загрузки пакетов, а затем использовать этот ввод как ответ на приглашение во время установки.
Обходной путь для вас, так как вы уже даете apt-get
-y
Опция, которая, по-видимому, не хочет задавать вопросы или читать ответы, заключается в перенаправлении стандартного ввода в /dev/null. Когда я делаю следующее:
apt-get install -y gdb-doc < /dev/null
мой печатник во время исполнения apt-get
команда не сбрасывается
Для apt-get я нахожу это yes
работает лучше чем -y
:
yes | apt-get install postfix
Я не уверен, почему это происходит с вашей пастой. Это не происходит со мной.
Возможно, решение скорее социальное, нежели техническое.
Напишите ваши команды в одной строке, разделив их документацией:
Сначала мы устанавливаем постфикс:
sudo apt-get install -y postfix
Затем мы получаем его конфигурацию:
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
Если люди вынуждены вырезать и вставлять строку за строкой, проблема "последующей строки" исчезнет. И больше документации никогда не бывает плохой вещью.:)
sudo apt-get install -y postfix 2>&1 |tee
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix 2>&1 |tee
Если ваша проблема связана с apt-get install
Команда, вы можете попробовать следующее:
sudo apt-get install -y -q=2 postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix