Назад | Перейти на главную страницу

Запретить 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

но есть ли способ лучше?

По этому поводу есть выдающийся отчет об ошибке: Отчет об ошибке 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 вариант, поэтому, предположительно, не хочу, чтобы он задавал вопросы или читал ответы, - это перенаправить stdin на / dev / null. Когда я делаю следующее:

apt-get install -y gdb-doc < /dev/null

мой типаж во время выполнения apt-get команда не сбрасывается.

Способ избежать проблемы с вырезанием и вставкой, а также безопасно запускать команды подряд - это поместить их в одну строку, разделенную символом && который будет выполнять только cp об успешном завершении sudo apt-get install:

sudo apt-get install -y postfix && sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

В конце концов, если первая команда не удалась, вы, вероятно, не захотите продолжать выполнение остальных команд.

Что касается того, почему команды проглатываются, когда вы вставляете сразу несколько строк ... когда postfix устанавливается, он задает вопросы конфигурации с интерфейсом диалога debconf, который, вероятно, мешает вырезанию и вставке. Может, другой интерфейс вроде readline или неинтерактивный помешал бы меньше? Тем не менее, я бы использовал && в любом случае, так как он безопаснее.

Если вы устанавливаете postfix со своими скриптами, похоже, вы пытаетесь автоматизировать установку новых систем? Если да, рассмотрите возможность использования предпосев как вариант (вот несколько Специальная документация Ubuntu 11.10) или, может быть, использовать кукольный?

Для apt-get я нахожу, что yes работает лучше чем -y:

yes | apt-get install postfix

Я не уверен, почему это происходит с вашей пастой. Со мной такого не бывает.

Возможно, решение скорее социальное, чем техническое.

Напишите свои команды в отдельной строке, разделив их документацией:


Сначала устанавливаем постфикс:

    sudo apt-get install -y postfix

Затем мы получаем его конфигурацию:

    sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

Если людей заставляют вырезать и вставлять строку за строкой, проблема «последующей строки» исчезает. И больше документации никогда не помешает. :)

Если ваша проблема связана с apt-get install команду, вы можете попробовать следующее:

sudo apt-get install -y -q=2 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