Geben Sie eine EOF ohne Zeilenumbruch ein

2013
Sammitch

Ich habe einen kleinen Befehl, den ich zum Kopieren / Einfügen von Dateien verwende, um das base64-encoded tar-Archiv in stdin einzufügen. Das base64-Dienstprogramm gibt mir jedoch eine Fehlermeldung über meine Eingabe, da ich vor dem Ausgeben einen Zeilenumbruch eingeben muss EOF, um die Eingabe zu stoppen.

z.B:

[root@box ~]echo hello | base64 aGVsbG8K [root@box ~]base64 -d aGVsbG8K[enter][ctrl+d] hello base64: invalid input 

Im Gegensatz zu den klunkeren:

[root@box ~]echo -n 'aGVsbG8K' | base64 -d hello 

Was im Zusammenhang mit dem Befehl, den ich geschrieben habe, nicht wirklich gut funktioniert.

Gibt es eine Möglichkeit, eine EOF ohne diesen zusätzlichen Zeilenumbruch einzusetzen? Ich meine, das nach wie vor technisch funktioniert, aber ich will keine Fehler angezeigt, wenn es keine tatsächliche Fehler ist, und ich will nicht, stderr falls zu unterdrücken es ist ein tatsächlicher Fehler.

1
Warum müssen Sie vor der Strg-D-Taste die Eingabetaste drücken? In meinem Test funktionierte es mit zweimaligem Drücken von `Ctrl-D`. Daniel Beck vor 11 Jahren 4
Sie können auch `base64 -d <<< aGVsbG8K` verwenden choroba vor 11 Jahren 0
@ DanielBeck Ich fühle mich so dumm, das nicht zu wissen. Sammitch vor 11 Jahren 0
@choroba Ich habe immer noch "ungültige Eingabe" davon erhalten Sammitch vor 11 Jahren 0
Welches Betriebssystem, welche base64 - Version? choroba vor 11 Jahren 0
Welches `base64`-Dienstprogramm verwenden Sie? Die GNU one ignoriert Zeilenumbrüche und kann aufgefordert werden, andere Nicht-Base64-Zeichen zu ignorieren. rici vor 11 Jahren 0
@choroba: Ich glaube, dass bash am Ende des Wortes, das von `<<<` an stdin gesendet wird, eine neue Zeile hinzufügt rici vor 11 Jahren 0

1 Antwort auf die Frage

0
rici

Ich denke, Sie sollten ein anderes base64Dienstprogramm finden, beispielsweise die GNU-Version, die Zeilenumbrüche toleriert.

Wenn dies nicht der Fall ist, vorausgesetzt, dass die Eingabe genau eine Zeile lang ist (da andernfalls ein ungültiger Zeilenumbruch vorhanden wäre), könnten Sie Folgendes tun:

echo -n "$(head -n1)" | base64 -d 

oder wenn Sie nicht mögen echo -n(obwohl es auf Ihrem System zu funktionieren scheint, ist das nicht garantiert):

printf %s "$(head -n1)" | base64 -d 

Es gibt einige Unklarheiten darüber, ob Zeilenumbrüche bei der base64-Codierung zulässig sind. Das relevante RFC gibt an, dass sie nur dann legal sind, wenn die Anwendung, die die base64-Kodierung verwendet, als zulässig dokumentiert ist. Dies ist keine große Hilfe für einen allgemeinen Base64-Codec.

AFAIK, praktisch alle Anwendungen, die base64 verwenden, erlauben explizit Zeilenumbrüche (und einige erfordern sie, indem sie eine maximale Zeilenlänge festlegen), daher erscheint es mir merkwürdig, dass das base64Dienstprogramm keinen Mechanismus hat, der sie zulässt.