AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 457235
Accepted
pLumo
pLumo
Asked: 2018-07-20 06:46:22 +0800 CST2018-07-20 06:46:22 +0800 CST 2018-07-20 06:46:22 +0800 CST

Colar vários comandos no terminal para na entrada do usuário

  • 772

Colar 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 $VARnão está sendo colado/executado.

Ter todos os comandos em uma única linha funciona:

read VAR; echo $VAR

Mas isso não é preferível quando há mais comandos a seguir.


Por que esse é o caso e como contornar isso?

Meu caso de uso é ter alguns comandos recorrentes em uma documentação de serviço.
É claro que eu poderia escrever um script, mas não é isso que pretendo fazer e pode não ser possível em sistemas com acesso somente de leitura.

shell terminal
  • 4 4 respostas
  • 8701 Views

4 respostas

  • Voted
  1. Best Answer
    Anderson
    2018-07-20T07:13:15+08:002018-07-20T07:13:15+08:00

    Uma maneira muito confortável é a seguinte :

    Basta digitar o seguinte no seu terminal:

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

    Descrição longa :

    1. No terminal você começa com(

      Opcional: Pressione enter(somente por motivos de formatação)

    2. Agora você pode colar várias linhas

      por exemplo:
      echo hello
      echo world

      Alternativa: Você digita/cola linha por linha (finalizando cada uma com a entertecla).

    3. Por fim, digite a finalização )e aperte enternovamente, que executará todas as linhas coladas/inseridas.

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

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

    Pequeno exemplo de trabalho (para colar o script inteiro) :

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

    Pequeno exemplo de trabalho negligenciando a formatação (para colar o script inteiro) :

    anderson@tp ~ % (echo hello                                                
    echo world)
    hello
    world
    anderson@tp ~ % 
    
    • 8
  2. Jeff Schaller
    2018-07-20T06:52:01+08:002018-07-20T06:52:01+08:00

    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; acontece de ser um comando que você pensou que seria executado.

    Imprima o valor da VARvariável e você verá:

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

    A mesma coisa acontece com o selectcardápio.

    Eu sugiro que, se sua documentação/comandos esperam que o usuário insira um valor, você insira comentários para esse efeito:

    read VAR
    

    (O usuário insere um valor)

    echo $VAR
    
    • 5
  3. Anderson
    2018-07-20T06:48:43+08:002018-07-20T06:48:43+08:00

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

    • 3
  4. JoL
    2018-07-20T14:20:26+08:002018-07-20T14:20:26+08:00

    Você pode obter este trabalho como você quer exatamente como você estava fazendo. Eu faço isso toda hora.

    Se você estivesse usando zsh e um terminal que colocasse suas pastas entre colchetes com sequências de escape especiais como urxvt, ele já teria funcionado como você queria por padrão. Se você estiver usando o bash, você só precisa ativar sua interpretação de colchetes fazendo bind 'set enable-bracketed-paste on'. Ele aguardará 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 por 2 linhas você precisaria pressionar Up, Up, Enter, Up, Up, Enter, enquanto o zsh mantém os comandos colado agrupado como um no histórico, não importa quantas linhas, Up, Enter.

    Há mais disso escrito nas respostas a seguir. O segundo é meu e inclui uma tabela de terminais que suportam colchetes. Se você acabar usando o urxvt, recomendo instalar a extensão que incluí na resposta para evitar a vulnerabilidade sobre a qual a pergunta era:

    https://security.stackexchange.com/a/52655/132634

    https://security.stackexchange.com/a/184112/132634

    EDIT: A propósito, apenas para ser mais explícito caso você tenha perdido, se você não estiver fazendo isso (usando colchetes), você está aberto à injeção de código shell quando estiver colando de sites. Afinal, os sites podem ocultar o código de várias maneiras e fazer com que você o copie sem o seu conhecimento.

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

    http://thejh.net/misc/website-terminal-copy-paste

    Parece que você estaria executando:

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

    quando, na realidade, você estaria executando algo assim (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 
    
    • 1

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve