Evitar sudo, apt-get, etc. de engolir entrada colada para STDIN?

4

Costumo escrever instruções wiki para instalar vários pacotes de servidores no Ubuntu (11.10 Oneiric no momento). Eles sempre envolvem coisas como:

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

mas quando você corta e cola isso em um terminal, sudo, apt-get ou algum subshell engula aleatoriamente as linhas subsequentes de entrada, e somente o apt-get install acontece.

Existe uma maneira de tornar isso mais fácil de copiar e colar? Eu suponho que eu poderia envolver cada seção com

cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script

mas existe uma maneira melhor?

    
por Jay Levitt 20.12.2011 / 12:58

6 respostas

6

Uma maneira de evitar o problema de recortar e colar, assim como executar com segurança os comandos sucessivos é colocá-los na mesma linha separada por && , que executará apenas o cp na conclusão bem-sucedida do sudo apt-get install :

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

Afinal, se o primeiro comando falhar, você provavelmente não desejará continuar executando o restante dos comandos.

Por que os comandos são engolidos quando você cola várias linhas de uma vez ... quando o postfix é instalado, ele faz perguntas de configuração com o frontend do diálogo debconf, o que provavelmente interfere no cut-and-paste. Talvez um front-end diferente, como readline ou não-interativo, pudesse interferir menos? Ainda assim, eu usaria o método && de qualquer forma, já que é mais seguro.

Se você está instalando o postfix com seus scripts, parece que você está tentando automatizar a instalação de novos sistemas? Em caso afirmativo, considere o uso de pré-configuração como uma opção (aqui estão algumas Documentação específica do Ubuntu 11.10 ) ou talvez use fantoche ?

    
por 20.12.2011 / 15:19
6

Existe um relatório de bug excelente sobre isso: Relatório de bugs do Debian # 728775 - apt-get unwarrantedly consome entrada . O relatório diz:

When apt-get is invoked in a way that involves actually installing a package, it reads any available data from standard input, regardless of actual need. This breaks the usual ability, at an interactive shell, to type the next command while the current one is running: apt-get consumes input that was intended for the shell. strace shows that the input is read by the top-level apt-get process, by read(2) from fd 0, in response to pselect(2).
...
It's in pkgDPkgPM::Go() in apt-pkg/deb/dpkgpm.cc. Further down the same function, there's a pselect loop which does match what I saw with strace. It reads from stdin conditional only upon (master >= 0 && !d->stdin_is_dev_null)

E em resposta:

It's to avoid someone typing their next command while packages are downloading, but then that input being used as the answer to a prompt during installation.

Uma solução alternativa para você, já que você já está dando a opção apt-get o -y , presumivelmente não quer fazer perguntas ou ler respostas, é redirecionar stdin para / dev / null. Quando faço o seguinte:

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

minha digitação durante a execução do comando apt-get não é liberada.

    
por 07.10.2014 / 18:36
1

Não sei por que isso está acontecendo com sua pasta. Isso não acontece comigo.

Talvez a solução seja social e não técnica.

Escreva seus comandos em uma linha sozinhos, com documentação separando-os:

Primeiro, instalamos o postfix:

    sudo apt-get install -y postfix

Então, buscamos sua configuração:

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

Se as pessoas são forçadas a recortar e colar linha por linha, o problema da "linha subsequente" desaparece. E mais documentação nunca é uma coisa ruim. :)

    
por 20.12.2011 / 13:46
1

Para o apt-get, eu acho que yes funciona melhor que -y :

yes | apt-get install postfix
    
por 21.08.2012 / 12:02
0

Se o seu problema estiver relacionado ao comando apt-get install , você pode tentar o seguinte:

sudo apt-get install -y -q=2 postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
    
por 20.12.2011 / 13:17
0
sudo apt-get install -y postfix  2>&1 |tee 
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix 2>&1  |tee 
    
por 11.10.2014 / 06:51