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 FormatarCriar 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.