Existe-t-il un moyen de sécuriser le collage dans Terminal?

16

Je colle des noms de fichiers / etc dans Terminal tout le temps, et parfois le contenu du presse-papiers n'est pas ce que j'attends.

Souvent, le résultat est plusieurs centaines de lignes de texte (par exemple, le code source) collées dans l'invite de commande, déclenchant que dieu ne sait que la méchanceté.

Existe-t-il un moyen d'empêcher bash d'exécuter aveuglément tout ce que je colle? Je souhaite qu'il collerait simplement le texte et me laisse décider après si je veux l'exécuter.

Abhi Beckert
la source

Réponses:

10

En supposant que vous utilisez bash: si vous activez les raccourcis emacs avec, set -o emacsvous pouvez également utiliser Emacs pour modifier la ligne de commande:

  • Tapez Ctrl-XCtrl-Eà l'invite pour démarrer Emacs
  • Collez et modifiez le contenu de votre presse-papiers dans le tampon Emacs
  • Permet Ctrl-XCtrl-Cde quitter Emacs et d'exécuter automatiquement la ou les commandes.
nohillside
la source
Je suppose que tu veux dire Ctrlau lieu de Cmd. En outre, sans le faire, set -o emacsil semble utiliser $EDITOR. Merci! c'est parfait.
Abhi Beckert
5

La solution la plus simple est probablement d'utiliser un éditeur de texte comme tampon où vous pouvez revérifier le contenu, puis copier de l'éditeur de texte vers Terminal. Si vous utilisez TextEdit pour cela, vous voudrez probablement vous assurer qu'il est en mode texte brut ( menu FormatCréer du texte brut; ⇧⌘T) pour éviter des problèmes tels que les liens collés en tant que liens, pas les URL.

L'autre chose à noter est que Bash tentera d'exécuter tout ce qui précède un caractère de nouvelle ligne, donc si vous copiez un bloc de texte, vous voudrez peut-être vous assurer que votre sélection s'arrête après le dernier caractère, plutôt que d'inclure la fin du caractère ligne.

Tu veux ça: sélection sans nouvelle ligne

Pas ça: sélection avec newline

Bien sûr, si vous copiez des éléments avec des sauts de ligne dans le texte ( c'est -à- dire plusieurs paragraphes), vous devrez modifier manuellement la sélection.

robmathers
la source
le problème est que je colle des choses dans le terminal plusieurs centaines de fois par jour. utiliser un éditeur de texte au milieu serait une douleur dans le cul
Abhi Beckert
Un attaquant peut intégrer des retours chariot dans le texte sans qu'ils soient visibles à l'écran, votre exemple de sélection de texte n'offre donc pas nécessairement de protection.
sh1
1

Je comprends ça aussi!

Ma solution est de coller à l' aide Launchbar gestionnaire de presse - papiers », avec le raccourci clavierCmd+\ . Cela fait apparaître une liste de coupures récentes, ce qui me permet de prévisualiser le résultat avant de le coller: si je ne vois pas le contenu que j'attends, je clique sur Échap avant de publier Cmd. Je peux également utiliser une touche fléchée pour «saisir» un extrait de texte, ce qui me permet de voir le contenu ligne par ligne.

Je crois que la plupart des lanceurs le font - Alfred (addon powerpack) & Quicksilver (gratuit), par exemple.

ptim
la source
1

Vous voudrez peut-être examiner un gestionnaire de presse-papiers. J'utilise un logiciel gratuit et léger appelé Jumpcut . Cela me permet de conserver plusieurs presse-papiers et de voir ce qui y est stocké avant de coller le contenu, le tout depuis le clavier.

Il existe de nombreux gestionnaires de presse-papiers, donc si Jumpcut ne fait pas flotter votre bateau, peut-être qu'un autre répondra mieux à vos besoins

Sigsegv
la source
1

Utilisez de la pâte entre crochets .

La pâte entre crochets est une fonctionnalité où le terminal indique au shell que vous avez collé quelque chose au lieu de simplement le taper, de sorte que le shell ne peut pas exécuter la commande tant que vous n'appuyez pas sur Entrée.

Terminal.app prend en charge cela, mais pas tous les terminaux.

De même, tous les obus ne le supportent pas non plus. La version de bash fournie avec OS X ne prend pas en charge le collage entre crochets (au moment de la rédaction, c'est la v3.2.57).

Cependant, zsh prend en charge la pâte entre crochets:

zsh-bracket

Zsh est principalement compatible avec bash (même les scripts fonctionneront probablement, à moins que vous n'utilisiez une sorte de fonctionnalité vraiment obscure), et mieux à bien des égards - par exemple, il a même une édition de commande sur plusieurs lignes!

zsh-multiline-command

SilverWolf - Rétablir Monica
la source
Comment activer la pâte entre crochets?
Abhi Beckert
1
Il est activé par défaut si vous utilisez zsh. Essayez de coller dans une doublure! Il devrait être mis en surbrillance inverse comme dans ma première capture d'écran, et si vous appuyez sur Supprimer une fois, il devrait supprimer le tout.
SilverWolf
En fait, je l'ai trouvé par accident, puis je me suis demandé pourquoi ce n'était pas dans bash. Il s'avère que le bash par défaut est vraiment ancien. (:
SilverWolf
0

Vous pouvez mettre ce petit script Bash quelque part dans votre PATH:

#!/bin/bash

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

Si je mets ce contenu /usr/local/pbexecutepar exemple et le rend exécutable, je pourrais exécuter en toute sécurité à pbexecutepartir de la ligne de commande, ce qui demanderait ma confirmation avant d'exécuter le contenu du presse-papiers.

Une autre approche consiste à lancer un éditeur de texte avec le contenu du presse-papiers à partir du shell et à exécuter automatiquement le contenu modifié à la sortie. Par exemple:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP
Gerry
la source
Pourquoi les tiques de retour échappées? L'utilisation de '' devrait également fonctionner.
nohillside
@patrix Si je n'échappe pas aux backticks, bash l'exécutera déjà lors de l'invite.
Gerry
L'omission des contre-coups ne devrait-elle pas faire l'affaire aussi?
nohillside
@patrix Oh, oui bien sûr, c'est juste une question de préférence sur la façon dont vous souhaitez formater l'invite. J'ai choisi des backticks car ils sont l'opérateur de substitution de commandes et sont couramment utilisés pour baliser visuellement les commandes (voir l'édition StackExchange).
Gerry
Je suis d'accord avec ça :-) Cela semble juste un peu compliqué
nohillside
0

Sous Preferences -> Profiles -> Basic -> Advanced, cochez la case "Coller les sauts de ligne au retour du chariot". (De base est le nom d'un profil. Si vous utilisez un autre profil, vous devez choisir celui-ci à la place.)

Dans certains shells (zsh et bash fonctionnent pour moi, tcsh ne fonctionne pas), cela vous permettra d'éditer ou d'interrompre (via Ctrl-C) ce qui est collé avant qu'une partie ne soit passée au shell.

Vous devrez peut-être créer une nouvelle fenêtre de terminal pour que la préférence commence à fonctionner.

J'utilise cette fonctionnalité tout le temps, non seulement pour coller et éditer des commandes complexes, mais aussi pour afficher du texte en colonnes et parfois pour sélectionner et copier des sous-rectangles en les faisant glisser avec la touche d'option.

Joshua Goldberg
la source
Je viens d'apprendre que TextEdit fait également la sélection rectangulaire.
Joshua Goldberg