Existe uma maneira de tornar a colagem no Terminal segura?


15

Eu colo nomes de arquivos / etc no Terminal o tempo todo e, ocasionalmente, o conteúdo da área de transferência não é o que eu espero.

Muitas vezes, o resultado são várias centenas de linhas de texto (por exemplo, código-fonte) coladas no prompt de comando, provocando que Deus saiba apenas que maldade.

Existe alguma maneira de impedir que o bash execute cegamente o que eu colar? Eu gostaria que ele colasse o texto e deixe-me decidir depois se eu quero executá-lo.

Respostas:


9

Supondo que você esteja usando o bash: se você ativar os atalhos do emacs, set -o emacstambém poderá usar o Emacs para editar a linha de comando:

  • Digite Ctrl-XCtrl-Eno prompt para iniciar o Emacs
  • Cole e edite o conteúdo da área de transferência no buffer Emacs
  • Use Ctrl-XCtrl-Cpara sair do Emacs e executar automaticamente o (s) comando (s).

Eu suponho que você quer dizer em Ctrlvez de Cmd. Além disso, sem fazer set -o emacsisso parece usar $EDITOR. Obrigado! isto é perfeito.
— Abhi Beckert

5

A solução mais simples é provavelmente usar um editor de texto como um buffer, onde você pode verificar novamente o conteúdo e copiar do editor de texto para o Terminal. Se você usar o TextEdit para isso, provavelmente desejará ter certeza de que está no modo de texto sem formatação ( menu Formatar → Criar texto sem formatação ; ⇧⌘T) para evitar problemas como links colados como links, não URLs.

A outra coisa a observar é que o Bash tentará executar tudo que precede um caractere de nova linha; portanto, se você estiver copiando um bloco de texto, convém garantir que sua seleção seja interrompida após o último caractere, em vez de incluir o final do linha.

Você quer isso: seleção sem nova linha

Isso não: seleção com nova linha

Claro, se você está copiando coisas com novas linhas no texto ( ou seja, vários parágrafos), então você precisa editar manualmente a seleção.


o problema é que colo as coisas no terminal várias centenas de vezes todos os dias. usando um editor de texto no meio seria um pé no saco
— Abhi Beckert

Um invasor pode incorporar retornos de carro no texto sem que eles fiquem visíveis na tela; portanto, seu exemplo de como selecionar texto não oferece necessariamente nenhuma proteção.
— sh1 21/11

1

Eu também entendi!

Minha solução é colar usando Launchbar 's gerente da prancheta, com a tecla de atalho Cmd+\. Isso traz uma lista de recortes recentes, permitindo que eu visualize o resultado antes de colar: se não vejo o conteúdo que esperava, pressione escape antes de liberar o Cmd. Também posso usar uma tecla de seta para 'inserir' um recorte de texto, permitindo que eu veja o conteúdo linha por linha.

Acredito que a maioria dos lançadores faça isso - Alfred (addon powerpack) e Quicksilver (grátis), por exemplo.


1

Você pode procurar em um gerente da área de transferência. Eu uso um grátis, leve chamado Jumpcut . Isso me permite manter várias pranchetas e ver o que está armazenado nelas antes de realmente colar o conteúdo, tudo pelo teclado.

Existem muitos gerentes de área de transferência por aí, portanto, se o Jumpcut não flutuar no seu barco, talvez outro atenda melhor às suas necessidades


1

Use pasta entre colchetes .

Colar entre colchetes é um recurso em que o terminal informa ao shell que você colou algo em vez de apenas digitá-lo, para que o shell não possa executar o comando até pressionar Enter.

O Terminal.app suporta isso, mas nem todos os terminais.

Da mesma forma, nem todas as conchas também o suportam. A versão do bash que acompanha o OS X não oferece suporte à pasta entre colchetes (no momento da escrita, é v3.2.57).

No entanto, o zsh suporta pasta entre colchetes:

zsh-bracketed-paste

O Zsh é compatível principalmente com o bash (até os scripts provavelmente funcionarão, a menos que você use algum tipo de recurso realmente obscuro), e melhor de várias maneiras - por exemplo, ele ainda possui edição de comandos em várias linhas!

Comando zsh-multiline


Como você ativa a pasta entre colchetes?
— Abhi Beckert

1
Está ativado por padrão se você usar o zsh. Tente colar em uma linha! Deve ser destacado como na minha primeira captura de tela, e se você clicar em Excluir uma vez, deve excluir a coisa toda.
— SilverWolf - Restabelece Monica

Na verdade, eu a encontrei por acidente, depois me perguntei por que não estava na festa. Acontece que o bash padrão é realmente antigo. (:
— SilverWolf - Restabelece Monica

0

Você pode colocar esse pequeno script Bash em algum lugar do seu PATH:

#!/bin/bash

read -p "Are you sure you wish to execute \`$(pbpaste)\`? (Y/n) "    
[[ $REPLY =~ ^[Yy]?$  ]] && pbpaste | bash

Se eu colocar esse conteúdo /usr/local/pbexecutepor exemplo e torná-lo executável, eu poderia executar com segurança pbexecutena linha de comando, o que solicitaria minha confirmação antes de executar o conteúdo da área de transferência.

Uma abordagem alternativa é iniciar um editor de texto com o conteúdo da área de transferência de dentro do shell e executar automaticamente o conteúdo editado ao sair. Por exemplo:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP

Por que as costas escaparam? Usar '' também deve funcionar.
— nohillside

@patrix Se eu não escapar dos backticks, o bash já o executará enquanto solicita.
— Gerry

A omissão das reticências não deveria fazer o truque também?
— nohillside

@ Patrix Oh, sim, é claro, isso é apenas uma questão de preferência sobre como você deseja formatar o prompt. Eu escolhi backticks porque eles são o operador de substituição de comando e são comumente usados ​​para marcar visualmente comandos (consulte Edição do StackExchange).
— Gerry

Estou bem com isso :-) Parece meio complicado
— nohillside
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.