Execute o script heredoc via su anexado ao tty atual

1

Estou tentando fazer algo assim:

sudo su <<EOF
select x in a b c; do echo "Selected $x"; break; done
EOF

No entanto, termina sem aceitar entrada.

Funciona se eu fizer isso:

sudo su -c 'select x in a b c; do echo $x; break; done'

Mas é melhor escrever scripts mais longos com heredoc (sim, eu sei que é melhor ainda colocá-los em um arquivo).

Tenho certeza de que isso é respondido em vários lugares, mas parece que não consigo acertar o combo de termos de pesquisa direito bash / heredoc / tty / stdin.

Existe alguma maneira de conseguir isso?

    
por c24w 07.06.2017 / 18:03

2 respostas

1

O problema é que select está tentando ler de stdin, que é redirecionado para o here-doc. Como não há resposta para o prompt, ele recebe um erro.

A solução é redirecionar a entrada de volta para o terminal dentro do here-doc.

sudo -s <<'EOF'
select x in a b c; do 
    echo "Selected $x"
    break
done </dev/tty
EOF

Além disso, você precisa colocar aspas em torno de EOF para evitar a expansão de variáveis no aqui-doc. Caso contrário, ele expande $x no shell original, não no subshell que obtém o valor de select .

    
por 08.06.2017 / 17:19
0

Uma maneira com um arquivo se você quiser que o restante seja executado como algo diferente

$ cat asdf
who am i
sudo su
who am i
$ bash < asdf
jhldoe   tty??    Jun  7 16:30 
root     tty??    Jun  7 16:30 
$ 

Mais simples pode ser que os shells dados na entrada padrão executem esses comandos

$ sudo sh <<EOF
> who am i
> pwd
> EOF
root     tty??    Jun  7 16:31 
/var/tmp
$ 

Para o problema de ler a entrada padrão e também ter acesso ao terminal, posso resolver isso com meu feed script ( documentação , testes unitários , .feedrc arquivo para o diretório home do root).

$ (echo 'select x in a b c; do echo "Selected $x"; break; done') | sudo feed - bash

Embora isso o deixe em um shell raiz e insira a entrada nesse shell, isso pode ou não ser adequado à sua necessidade.

    
por 07.06.2017 / 18:32