¿Hay alguna manera de hacer que pegar en la Terminal sea seguro?


15

Pego nombres de archivo / etc en Terminal todo el tiempo, y ocasionalmente el contenido del portapapeles no es lo que esperaba.

A menudo, el resultado es varios cientos de líneas de texto (por ejemplo, código fuente) pegadas en el símbolo del sistema, lo que provoca que Dios solo sepa qué maldad.

¿Hay alguna manera de evitar que bash ejecute ciegamente lo que sea que pegue? Desearía que solo pegue el texto, y déjame decidir si quiero ejecutarlo.

Respuestas:


9

Suponiendo que está utilizando bash: si activa los accesos directos de emacs set -o emacstambién puede usar Emacs para editar la línea de comando:

  • Escriba Ctrl-XCtrl-Een el indicador para iniciar Emacs
  • Pegue y edite el contenido de su portapapeles en el búfer de Emacs
  • Use Ctrl-XCtrl-Cpara salir de Emacs y ejecutar automáticamente los comandos.

Supongo que quieres decir en Ctrllugar de Cmd. Además, sin hacerlo set -o emacsparece usar $EDITOR. ¡Gracias! esto es perfecto.
Abhi Beckert

5

La solución más simple es probablemente usar un editor de texto como un búfer en el que pueda verificar el contenido y luego copiarlo desde el editor de texto a la Terminal. Si usa TextEdit para esto, probablemente querrá asegurarse de que esté en modo de texto sin formato ( menú FormatoCrear texto sin formato; ⇧⌘T) para evitar problemas como enlaces pegados como enlaces, no URL.

La otra cosa a tener en cuenta es que Bash intentará ejecutar todo lo que precede a un carácter de nueva línea, por lo que si está copiando un bloque de texto, es posible que desee asegurarse de que su selección se detenga después del último carácter, en lugar de incluir el final del línea.

Tu quieres esto: selección sin nueva línea

No esta: selección con nueva línea

Por supuesto, si está copiando cosas con líneas nuevas dentro del texto ( es decir, varios párrafos), deberá editar manualmente la selección.


El problema es que pego cosas en la terminal varios cientos de veces al día. usar un editor de texto en el medio sería un fastidio
Abhi Beckert

Un atacante puede incrustar retornos de carro en el texto sin que sean visibles en la pantalla, por lo que su ejemplo de cómo seleccionar texto no necesariamente ofrece ninguna protección.
sh1

1

¡También entiendo esto!

Mi solución es pegar usando el administrador de portapapeles de Launchbar , con la tecla de acceso rápido Cmd+\. Esto muestra una lista de recortes recientes, lo que me permite obtener una vista previa del resultado antes de pegar: si no veo el contenido que espero, presiono escapar antes de lanzar Cmd. También puedo usar una tecla de flecha para 'ingresar' un recorte de texto, lo que me permite ver el contenido línea por línea.

Creo que la mayoría de los lanzadores hacen esto: Alfred (complemento de paquete de energía) y Quicksilver (gratis), por ejemplo.


1

Es posible que desee buscar en un administrador de portapapeles. Yo uso uno gratuito y ligero llamado Jumpcut . Me permite mantener varios portapapeles y ver lo que está almacenado en ellos antes de pegar realmente el contenido, todo desde el teclado.

Hay muchos administradores de portapapeles, por lo que si Jumpcut no flota su bote, tal vez otro se ajuste mejor a sus necesidades


1

Use pasta entre corchetes .

La pasta entre corchetes es una característica en la que el terminal le dice al shell que pegó algo en lugar de simplemente escribirlo, por lo que el shell no puede ejecutar el comando hasta que presione Intro.

Terminal.app admite esto, pero no todos los terminales lo hacen.

Del mismo modo, tampoco todos los proyectiles lo admiten. La versión de bash que viene con OS X no admite pegado entre corchetes (en el momento de la escritura, es v3.2.57).

Sin embargo, zsh admite pegar entre corchetes:

zsh-bracketed-paste

Zsh es principalmente compatible con bash (incluso los scripts probablemente funcionarán, a menos que use algún tipo de característica realmente oscura), y mejor en muchos aspectos, por ejemplo, ¡incluso tiene edición de comandos de varias líneas!

comando zsh-multiline


¿Cómo se activa la pasta entre corchetes?
Abhi Beckert el

1
Está activado por defecto si usa zsh. ¡Intenta pegar en una sola línea! Debería resaltarse en reversa como en mi primera captura de pantalla, y si presiona Eliminar una vez, debería eliminar todo.
SilverWolf - Restablece a Mónica el

En realidad lo encontré por accidente, luego me pregunté por qué no estaba en fiesta. Resulta que el bash predeterminado es realmente viejo. (:
SilverWolf - Restablecer Monica

0

Puedes poner este pequeño script de Bash en algún lugar de tu PATH:

#!/bin/bash

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

Si pongo estos contenidos, /usr/local/pbexecutepor ejemplo, y los hago ejecutables, podría ejecutarlos con seguridad pbexecutedesde la línea de comandos, lo que solicitaría mi confirmación antes de ejecutar los contenidos del portapapeles.

Un enfoque alternativo es iniciar un editor de texto con el contenido del portapapeles desde el shell y ejecutar automáticamente los contenidos editados al salir. Por ejemplo:

#!/bin/bash

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

¿Por qué escaparon las garrapatas? Usar '' también debería funcionar.
nohillside

@patrix Si no escapo de los backticks, bash ya lo ejecutará mientras se le solicite.
Gerry

Entonces, ¿no debería omitir los backticks hacer el truco?
nohillside

@patrix Oh, sí, por supuesto, eso es solo una cuestión de preferencia sobre cómo desea formatear el mensaje. Elegí backticks porque son el operador de sustitución de comandos y se usan comúnmente para marcar visualmente los comandos (vea la edición de StackExchange).
Gerry

Estoy de acuerdo con esto :-) Parece un poco complicado
nohillside
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.