Colando vários comandos em paradas de terminal na entrada do usuário

2

Colocar alguns comandos consecutivos em paradas de terminal em comandos com entrada do usuário, por exemplo:

read VAR
echo $VAR

ou

select VAR in 1 2 3; do break; done
echo $VAR

echo $VAR não está sendo colado / executado.

Ter todos os comandos em uma única linha funciona:

read VAR; echo $VAR

Mas isto não é preferido quando se tem mais comandos a seguir.

Por que esse é o caso e como resolver isso?

Meu caso de uso está tendo alguns comandos recorrentes em uma documentação de serviço.
Eu poderia, claro, escrever um script, mas não é isso que pretendo fazer e talvez não seja possível em sistemas com acesso de leitura apenas.

    
por RoVo 19.07.2018 / 16:46

4 respostas

3

Uma maneira muito confortável é a seguinte :

Basta digitar o seguinte no seu terminal:

( paste-your-multiline-script-here ) digite

Descrição longa :

  1. No terminal, você começa com (

    Opcional: Pressione enter (apenas por razões de formatação)

  2. Agora você pode colar várias linhas

    por exemplo: echo hello e echo world

    Alternativa: Você digita / cola linha por linha (terminando cada um com a tecla enter ).

  3. Por fim, digite a% finalizando) e pressione enter novamente, o que executará todas as linhas coladas / inseridas.

Pouco exemplo de trabalho (para colar linha por linha com enter ) :

anderson@tp ~ % (
\'subsh> echo hello
\'subsh> echo world
\'subsh> )
hello
world
anderson@tp ~ % 

Pouco exemplo de trabalho (para colar todo o script) :

anderson@tp ~ % (
\'subsh> echo hello
echo world
\'subsh> )
hello
world
anderson@tp ~ %

Pouco exemplo de trabalho negligenciando a formatação (para colar todo o script) :

anderson@tp ~ % (echo hello                                                
echo world)
hello
world
anderson@tp ~ % 
    
por 19.07.2018 / 17:13
3

Quando você cola os dois comandos a seguir em um shell:

read VAR
echo $VAR

... o primeiro diz ao shell para ler uma linha de texto na variável chamada VAR . Você fornece esse valor na próxima linha; só acontece de ser um comando que você pensou que seria executado.

Imprima o valor da variável VAR e você verá:

$ printf '%s\n' "$VAR"
echo $VAR

O mesmo acontece com o menu select .

Gostaria de sugerir que, se sua documentação / comandos espera que o usuário insira um valor, você insere comentários para esse efeito:

read VAR

(o usuário insere um valor)

echo $VAR
    
por 19.07.2018 / 16:52
2

Isso pode ser feito colocando \ no final de cada linha antes de copiá-lo.

    
por 19.07.2018 / 16:48
1

Você pode conseguir esse trabalho exatamente como você queria. Eu faço isso o tempo todo.

Se você estivesse usando o zsh e um terminal que delimita suas pastas com seqüências de escape especiais como o urxvt, ele já teria funcionado como você queria por padrão. Se você estiver usando bash, você só precisa ativar sua interpretação de colchetes de colar fazendo bind 'set enable-bracketed-paste on' . Então, você esperará que você pressione Enter antes de executar o que você colou. A esse respeito, a diferença entre bash e zsh é que o bash separará os comandos que você colou no histórico, de modo que para duas linhas você precisaria clicar em Acima, Acima, Enter, Cima, Cima, Enter enquanto zsh mantém os comandos. colado agrupado como um na história, não importa quantas linhas, Acima, Entre.

Há mais disso escrito nas respostas a seguir. A mina do segundo e inclui uma tabela de terminais que suportam pasta colada. Se você acabar usando o urxvt, recomendo instalar a extensão incluída na resposta para evitar a vulnerabilidade da pergunta:

link

link

EDIT: By the way, só para ser mais explícito no caso de você perdeu, se você não estiver fazendo isso (usando colchão colado), você está aberto para injeção de código shell quando você está colando de sites. Os sites podem, afinal de contas, ocultar o código de várias maneiras e copiá-lo sem o seu conhecimento.

Verifique este site para ver se você está vulnerável:

link

Parece que você estaria executando:

git clone git://git.kernel.org/pub/scm/utils/kup/kup.git

quando, na verdade, você estaria executando algo assim (eu removi um byte de escape não imprimível):

git clone [201~/dev/null; clear; echo -n "Hello ";whoami|tr -d '\n';echo -e '!\nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!
Here'"'"'s the first line of your /etc/passwd: ';head -n1 /etc/passwd
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git 
    
por 20.07.2018 / 00:20