Gibt es eine Möglichkeit, das Einfügen in das Terminal sicher zu machen?

15

Ich füge die ganze Zeit Dateinamen / etc in Terminal ein und gelegentlich entspricht der Inhalt der Zwischenablage nicht meinen Erwartungen.

Häufig werden mehrere hundert Textzeilen (z. B. Quellcode) in die Eingabeaufforderung eingefügt, sodass nur Gott weiß, was für eine Gemeinheit das ist.

Gibt es eine Möglichkeit zu verhindern, dass Bash blind alles ausführt, was ich einfüge? Ich wünschte, es würde nur den Text einfügen und mich entscheiden lassen, ob ich ihn ausführen möchte.

Abhi Beckert
quelle

Antworten:

9

Angenommen, Sie verwenden bash: Wenn Sie mit emacs Verknüpfungen aktivieren set -o emacs, können Sie auch Emacs verwenden, um die Befehlszeile zu bearbeiten:

  • Geben Sie Ctrl-XCtrl-Ean der Eingabeaufforderung ein, um Emacs zu starten
  • Fügen Sie den Inhalt Ihrer Zwischenablage in den Emacs-Puffer ein und bearbeiten Sie ihn
  • Verwenden Sie Ctrl-XCtrl-Cdiese Option, um Emacs zu beenden und die Befehle automatisch auszuführen.
Nohillside
quelle
Ich nehme an du meinst Ctrlstatt Cmd. Auch ohne set -o emacses zu tun scheint zu verwenden $EDITOR. Vielen Dank! Dies ist perfekt.
Abhi Beckert
5

Die einfachste Lösung besteht wahrscheinlich darin, einen Texteditor als Puffer zu verwenden, in dem Sie den Inhalt überprüfen und dann vom Texteditor zum Terminal kopieren können. Wenn Sie hierfür TextEdit verwenden, möchten Sie wahrscheinlich sicherstellen, dass es sich im Nur- Text-Modus befindet ( Menü Format → Nur Text erstellen; ⇧⌘T), um Probleme wie das Einfügen von Links als Links und nicht als URLs zu vermeiden.

Die andere zu beachtende Sache ist, dass Bash versucht, alles auszuführen, was einem Zeilenumbruch vorausgeht. Wenn Sie also einen Textblock kopieren, möchten Sie möglicherweise sicherstellen, dass Ihre Auswahl nach dem letzten Zeichen endet, anstatt das Ende des Zeichens einzufügen Linie.

Du willst das: Auswahl ohne Zeilenumbruch

Nicht das: Auswahl mit Zeilenvorschub

Wenn Sie Text mit Zeilenumbrüchen ( dh mehreren Absätzen) kopieren , müssen Sie die Auswahl natürlich manuell bearbeiten.

Robmathers
quelle
Das Problem ist, ich füge Dinge jeden Tag mehrere hundert Mal in das Terminal ein. die Verwendung eines Texteditors in der Mitte wäre eine Qual
Abhi Beckert
Ein Angreifer kann Zeilenumbrüche in den Text einbetten, ohne dass sie auf dem Bildschirm angezeigt werden. Daher bietet Ihr Beispiel für die Auswahl von Text nicht unbedingt Schutz.
sh1
1

Ich verstehe das auch!

Meine Lösung ist das Einfügen mithilfe des Launchbar -Zwischenablage-Managers mit dem Hotkey Cmd+\. Daraufhin wird eine Liste der zuletzt verwendeten Zeitungsausschnitte angezeigt, sodass ich vor dem Einfügen eine Vorschau des Ergebnisses anzeigen kann. Wenn der erwartete Inhalt nicht angezeigt wird, drücke ich die Escape-Taste, bevor ich Cmd freigebe. Ich kann auch eine Pfeiltaste verwenden, um einen Textausschnitt einzugeben, sodass ich den Inhalt zeilenweise sehen kann.

Ich glaube, die meisten Trägerraketen tun dies - Alfred (Powerpack-Addon) und Quicksilver (kostenlos) zum Beispiel.

ptim
quelle
1

Vielleicht möchten Sie sich einen Zwischenablage-Manager ansehen. Ich benutze eine kostenlose, leichte Variante namens Jumpcut . Es ermöglicht mir, mehrere Zwischenablagen zu behalten und zu sehen, was in ihnen gespeichert ist, bevor der Inhalt tatsächlich über die Tastatur eingefügt wird.

Es gibt viele Manager für die Zwischenablage. Wenn Jumpcut Ihr Boot also nicht schwimmt, passt vielleicht ein anderer besser zu Ihren Anforderungen

Sigsegv
quelle
1

Verwenden Sie eine Paste in Klammern .

Das Einfügen in Klammern ist eine Funktion, bei der das Terminal der Shell mitteilt, dass Sie etwas eingefügt haben, anstatt es nur einzugeben, sodass die Shell den Befehl erst ausführen kann, wenn Sie die Eingabetaste drücken.

Terminal.app unterstützt dies, aber nicht alle Terminals.

Ebenso unterstützen es nicht alle Shells. Die mit OS X gelieferte Version von bash unterstützt das Einfügen in eckigen Klammern nicht (zum Zeitpunkt des Schreibens ist es v3.2.57).

Allerdings zsh hat Unterstützung klammert Paste:

zsh-Klammer-Paste

Zsh ist größtenteils mit Bash kompatibel (sogar Skripte funktionieren wahrscheinlich, wenn Sie keine wirklich obskure Funktion verwenden) und in vielerlei Hinsicht besser - zum Beispiel verfügt es sogar über eine mehrzeilige Befehlsbearbeitung!

zsh-multiline-command

SilverWolf - Setzen Sie Monica wieder ein
quelle
Wie aktiviere ich die eingeklammerte Paste?
Abhi Beckert
1
Es ist standardmäßig aktiviert, wenn Sie zsh verwenden. Versuchen Sie es mit einem Einzeiler! Es sollte wie in meinem ersten Screenshot rückwärts hervorgehoben sein, und wenn Sie einmal auf Löschen klicken, sollte das Ganze gelöscht werden.
SilverWolf - Setzen Sie Monica am
Ich habe es tatsächlich zufällig gefunden und mich dann gefragt, warum es nicht in der Bash war. Es stellt sich heraus, dass die Standard-Bash wirklich alt ist. (:
SilverWolf - Wiedereinsetzung von Monica am
0

Sie könnten dieses kleine Bash-Skript irgendwo in Ihrem PATH:

#!/bin/bash

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

Wenn ich diese Inhalte /usr/local/pbexecutezum Beispiel einfüge und ausführbar mache, kann ich sie ohne Bedenken pbexecuteüber die Befehlszeile ausführen , wodurch ich vor dem Ausführen der Inhalte der Zwischenablage zur Bestätigung aufgefordert werde.

Ein alternativer Ansatz besteht darin, einen Texteditor mit dem Inhalt der Zwischenablage aus der Shell heraus zu starten und den bearbeiteten Inhalt beim Beenden automatisch auszuführen. Beispielsweise:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP
Gerry
quelle
Warum tickt der entkommene Rücken? Die Verwendung von '' sollte ebenfalls funktionieren.
Nohillside
@patrix Wenn ich den Backticks nicht entkomme, führt bash sie bereits aus, während Sie dazu aufgefordert werden.
Gerry
Sollte das Weglassen der Backticks dann nicht auch den Trick machen?
Nohillside
@patrix Oh ja, natürlich ist es nur eine Frage der Präferenz, wie Sie die Eingabeaufforderung formatieren möchten. Ich habe mich für Backticks entschieden, weil sie der Operator für die Befehlsersetzung sind und häufig zum visuellen Markieren von Befehlen verwendet werden (siehe StackExchange-Bearbeitung).
Gerry
Ich bin damit
einverstanden