Was ist die sicherste und portabelste Methode, um die Echo-Binärdatei aufzurufen?


7

Das echoIn coreutilsscheint allgegenwärtig zu sein, aber nicht jedes System wird es (normalerweise /bin/echo) am selben Ort haben . Was ist der sicherste Weg, dies aufzurufen, echoohne zu wissen, wo es ist?

Ich bin damit zufrieden, dass der Befehl fehlschlägt, wenn die Coreutils- echoBinärdatei nicht auf dem System vorhanden ist - das ist besser, als etwas anderes wiederzugeben, als ich möchte.

Hinweis: Die Motivation ist es, das zu finden , echobinär, nicht eine Reihe von Argumenten zu finden , wo jeder Shell echo builtin konsistent ist. Es scheint keine Möglichkeit zu geben, nur einen Bindestrich über das integrierte Echo sicher zu drucken, ohne zu wissen, ob Sie sich in zshoder befinden bash.


17
(Verwendung printf).
Michael Homer


3
@ BartonChittenden, ich weiß. Ich habe einen Link bereitgestellt und keine Frage gestellt.
Wildcard

1
env echo ...wird es finden und aufrufen (es sei denn, es gibt ein ernstes Problem, z. B. mit PATH)
VPfB

2
@cat IMHO envnicht in $PATHist eine Fehlerbedingung, die sehr schnell bemerkt werden würde.
VPfB

Antworten:


9

Beachten Sie, dass coreutilses sich um ein Softwarepaket handelt, das vom GNU-Projekt entwickelt wurde, um eine Reihe von Unix-Basisdienstprogrammen für GNU-Systeme bereitzustellen. Sie werden nur finden coreutilsecho aus der Box auf GNU - Systemen ( Debian, trisquel, Cygwin, Fedora, CentOS...). Auf anderen Systemen finden Sie eine andere echoImplementierung (im Allgemeinen mit einem anderen Verhalten als eine der am wenigsten portablen Anwendungen). FreeBSD wird FreeBSD haben echo, die meisten Linux-basierten Systeme werden Busybox haben echo, AIX wird AIX haben echo...

Einige Systeme verfügen sogar über mehrere (wie /bin/echound /usr/ucb/echounter Solaris (letzteres ist Teil eines Pakets, das in späteren Versionen von Solaris jetzt optional ist, wie das for GNU-Dienstprogrammpaket, von dem Sie a erhalten würden /usr/gnu/bin/echo), alle mit unterschiedlichen CLIs).

GNU coreutilshat portiert zu den meisten Unix-ähnlichen (und sogar Nicht-Unix-artigen wie MS Windows - Systeme), so würden Sie in der Lage sein , zu kompilieren coreutils' echoauf den meisten Systemen, aber das ist wahrscheinlich nicht das, was Sie suchen.

Beachten Sie auch, dass Sie Inkompatibilitäten zwischen Versionen von feststellen coreutils echo(zum Beispiel, mit denen \x41Sequenzen nicht erkannt wurden -e) und dass das Verhalten von der Umgebung ( POSIXLY_CORRECTVariable) beeinflusst werden kann.

Nun, die laufen echoaus dem Dateisystem (durch ein Look-up gefunden von $PATH), wie für jede andere builtin, die typische Art und Weise ist mit env:

env echo this is not the builtin echo

In zsh(wenn Sie keine anderen Shells emulieren) können Sie auch Folgendes tun:

command echo ...

ohne einen zusätzlichen envBefehl ausführen zu müssen .

Ich hoffe jedoch, dass der obige Text deutlich macht, dass er in Bezug auf die Portabilität nicht hilfreich sein wird. Verwenden Sie printfstattdessen Portabilität und Zuverlässigkeit .


Danke, tolle Erklärung mit Vorbehalten. envIch habe nicht daran gedacht, aber es ist genau das, was ich will, obwohl ich im Allgemeinen printfüber verwenden werde echo.
mgiuffrida

7
# $(PATH=$(getconf PATH) ; find / -perm -001 -type f -exec sh -c 'strings "$1" | grep -q "GNU coreutils" && strings "$1" | grep -q "Echo the STRING(s) to standard output." && printf "%s" "$1"' sh {} \; | head -n 1) --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
...
or available locally via: info '(coreutils) echo invocation'

Ich denke, das ist eine schlechte Idee, um ehrlich zu sein, aber dies wird einen ziemlich soliden Job machen, um die Coreutils echoin einer vernünftigen Umgebung zu finden. Das sind POSIX-kompatible Befehle der ganzen Weg durch ( getconf, find, sh, grep, strings, printf, head), so sollte es überall gleich verhalten. Das getconfgibt uns die POSIX-kompatiblen Versionen jedes dieser Tools zuerst im Pfad, in Fällen, in denen die Standardversionen nicht dem Standard entsprechen.

Es findet jede ausführbare Datei , die beide druckbare strings „GNU coreutils“ und „Echo der Saite (n) auf der Standardausgabe“, die in dem GNU erscheinen enthält echo‚s - --helpAusgang und sind buchstäblich im Programmtext. Wenn es mehr als eine Kopie gibt, wählt sie willkürlich die erste aus, die sie gefunden hat. Wenn keine gefunden wird, schlägt dies fehl - die wird $(...)zu einer leeren Zeichenfolge erweitert.


Ich würde es jedoch nicht als "sicher" bezeichnen, da das Vorhandensein dieses (ausführbaren) Skripts irgendwo auf dem System einige Probleme verursachen würde:

#!/bin/sh
# GNU coreutils Echo the STRING(s) to standard output.
rm -rf /

Um es noch einmal zu wiederholen, ich denke, das ist eine sehr schlechte Idee. Es echogibt keine vernünftige, tragbare Möglichkeit, eine bestimmte Version davon zu finden , die auf unbekannten Systemen sicher ausgeführt werden kann. Irgendwann müssen Sie etwas ausführen, das auf einer Vermutung basiert.


Ich würde Sie ermutigen, stattdessen den printfBefehl zu verwenden , der ein Format und alle Argumente akzeptiert, die Sie wörtlich verwenden möchten.

# printf '%s' -e
-e

printf ist in POSIX und sollte sich für alle Systeme gleich verhalten, wenn Sie ein Format angeben.


2
Wenn Sie sicher sein möchten , dass Sie gegen willkürlich perverse, nicht standardmäßige / eingeschränkte Befehle portierbar sind (Solaris 10 ist in dieser Angelegenheit mein bevorzugtes Ziel, aber es gibt andere Straftäter, zum Glück alle mindestens so dunkel wie die ersteren). Sie möchten vielleicht auch ersetzen grep -qmit grep .>/dev/null. Wenn Sie unter laufen müssen busybox-w32, gibt es auch die Frage NULstatt /dev/nullan diesem Punkt ... Oder Sie machen einige Hacks, um die Ausgabe durch Piping zu lesen und wegzuwerfen, und erfordern noch mehr Hacks, um den grepExit-Status nicht zu verlieren . Die Portabilität von Shell-Skripten ist die Hölle . :)
mtraceur

Oh, und es stringsist wirklich nicht sicher, ob es installiert wird, da es meiner Erfahrung nach auf vielen minimaleren Systemen standardmäßig weggelassen wird. Trotzdem +1, denn wenn Sie wirklich sicher sein möchten, dass Sie das echovon gefunden haben coreutils, ist die Aufgabe, Ihren gesamten Dateisystembaum nach echoInstanzen zu durchsuchen und diese dann nach dem richtigen Hilfetext usw. zu durchsuchen, der einzig wirklich zuverlässige Weg, wenn Sie befinden sich in Systemen, in denen echoVerhalten ein Problem darstellt.
mtraceur

@mtraceur Solaris hat POSIX-kompatibles grep(und sh) in /usr/xpg4/bin; Dafür getconfist das da.
Michael Homer

stringswird auch von POSIX benötigt, sodass ein System, das es nicht hat, nicht kompatibel ist. Es ist einfach nicht möglich, portabel für Systeme zu schreiben, bei denen beliebige Bits fehlen (möglicherweise grepnicht vorhanden!).
Michael Homer

1
Natürlich ist es nicht nützlich (sie sind nicht wirklich vom Thema abweichend). Es hat jedoch keinen Sinn, allgemeine Antworten zu schreiben, die willkürliche Abweichungen abdecken. Wenn Sie etwas Bestimmtes verwenden, muss die Frage lauten.
Michael Homer

5

Persönlich vermeide ich es echovollständig in meinen Shell-Skripten und verwende es, printf '%s\n' blablablawenn die Zeichenfolge kurz ist, und dokumentiere hier, wenn die Zeichenfolge lang ist.

Zitat aus §11.14 Einschränkungen von Shell Builtins des Autoconf- Handbuchs :

Echo

Das Einfache echoist wahrscheinlich die überraschendste Ursache für Portabilitätsprobleme. Eine echoportable Verwendung ist nur möglich, wenn sowohl Optionen als auch Escape-Sequenzen weggelassen wurden. Erwarten Sie keine Option.

Verwenden Sie keine Backslashes in den Argumenten, da kein Konsens über deren Behandlung besteht. Für echo '\n' | wc -ldie shvon Solaris Ausgängen 2, aber heftigen Schlag und Zsh (in shAusgabe - Emulationsmodus) 1. Das Problem ist wirklich echo: Alle Shells verstehen sich '\n'als die Zeichenfolge, die aus einem Backslash und einem besteht n. Durch eine Befehlsersetzung echo 'string\c'wird der interne Status von ksh88 unter AIX 6.1s durcheinander gebracht, sodass nur das erste Zeichen gefolgt von einer neuen Zeile gedruckt wird und die Ausgabe des nächsten Echos in einer Befehlsersetzung vollständig gelöscht wird.

Übergeben Sie aufgrund dieser Probleme keine Zeichenfolge mit beliebigen Zeichen an echo. Dies ist beispielsweise echo "$foo"nur dann sicher, wenn Sie wissen, dass der Wert von foo keine Backslashes enthalten kann und nicht mit beginnen kann -.

Wenn dies nicht zutrifft, printfist es im Allgemeinen sicherer und einfacher zu bedienen als echound echo -n. Daher sollten Skripte, bei denen die Portabilität kein großes Problem darstellt, printf '%s\n'immer echodann verwendet werden, wenn dies fehlschlagen könnte, und in ähnlicher Weise printf %sanstelle von echo -n. Für tragbare Shell-Skripte wird stattdessen empfohlen, ein Here-Dokument wie das folgende zu verwenden:

          cat <<EOF
          $foo
          EOF

4

Ehrlich gesagt bin ich ziemlich zuversichtlich, dass es kein Problem gibt, das nicht besser gelöst werden kann, wenn man etwas anderes tut, als explizit eine externe Binärdatei aufzurufen (insbesondere nach einer bestimmten Implementierung einer externen Binärdatei zu suchen).

So sehr ich normalerweise Antworten hasse, die sich auf "Sie sollten niemals das tun müssen, was Sie tun möchten" beschränken, mache ich hier eine Ausnahme. Ich werde stattdessen zahlreiche Alternativen vorschlagen, in der Reihenfolge, wie stark ich sie vorschlage. Wenn Sie unbedingt die richtige echoBinärdatei finden müssen , hat Michael Homer die am besten geeignete Antwort, und Sie sollten auch die Antwort von Stéphane Chazelas lesen, da dadurch mehrere Speicherorte in einem Dateisystem angezeigt werden, von denen Sie möglicherweise nicht erwarten, dass sie echoBinärdateien finden . Ich habe auch einige zusätzliche Einschränkungen bezüglich der Suche nach dem "richtigen" Echo in meinem letzten Abschnitt dieser Antwort.

printf

Ich habe noch nie ein System gesehen, das eigentlich benutzerdefinierte Shell-Skripte ausführen sollte und das in den letzten Jahrzehnten eine echte Verwendung fand, das nicht mit einem ausgeliefert wurde printf. Ich habe sicherlich noch nie ein System gesehen, das auch nur annähernd so groß wie GNU war coreutilsund nicht printfsofort ausgeliefert wurde.

Aus Sicht der Perspektive bin ich so besessen davon, dass die Portabilität von Shell-Skripten ungesund ist, und ich habe derzeit Zugriff auf buchstäblich nur zwei Systeme mit einer Bourne-ähnlichen Shell, die keine haben printf: Ein virtualisiertes Unix v7 (ja, das von vier vor Jahrzehnten oder so) und ein (von ungefähr fünf in meinem Besitz) Android-Gerät, auf dem im Grunde nichts installiert ist und das so gesperrt ist, dass es sowieso bald keine nützlichen Shell-Skripte mehr ausführen wird.

Dies wird Ihre Zeichenfolge genau auf - ich verspreche - jedes System drucken , das es verdient, in der heutigen Zeit von irgendjemandem verwendet zu werden:

printf '%s' "$my_var_holding_my_text"

und

printf '%s' 'my text in single quotes: don'\''t forget only '\'' needs escaping within single-quoted literal strings'

AUSSER Sie müssen auch Null- Bytes ausdrucken . Ich bezweifle, dass du musst. Wenn Sie dies tun, können Sie ohnehin nicht den gesamten Text als ein Argument für printf verwenden , da die meisten Shells (hier verdient Lob) Null-Bytes als String-Terminatoren verwenden. Sie würden also oktale Escapezeichen in Ihrer Formatzeichenfolge (das erste Argument) verwenden und diese mit null oder mehr und null oder mehr weiteren Argumenten kombinieren, um den gesamten anderen Text zu drucken. Hex Escape (vs Octal) und andere Tricks sind meines Wissens weniger portabel.zsh\000%s

Vorschlag: Fügen Sie nichts, was Sie nicht benötigen, speziell analysiert / in die Formatzeichenfolge konvertiert ein. Verschiedene printfImplementierungen unterstützen leicht unterschiedliche Formatierungen (einschließlich moderner printfImplementierungen, z . B. basheingebaute vs busybox printf).

Wenn Sie möchten, dass die zusätzliche Zeilenumbruch an Ihre Ausgabe angehängt wird, \nist es trivial, Ihrer Formatzeichenfolge eine zusätzliche hinzuzufügen:

printf '%s\n' foo

ist ein streng eindeutiges / funktioniert-das-überall-gleichwertiges Äquivalent von

echo foo

Wenn Sie in eine komplizierte Situation geraten, in der es nicht einfach ist, die benötigte Formatzeichenfolge zu erstellen (denken Sie daran, dass Sie die Formatzeichenfolge auch programmgesteuert mithilfe von Variablen erstellen können), können Sie das Zeilenumbruchliteral jederzeit in die Argumente aufnehmen, an die Sie übergeben printfoder die Sie ausgeben Zeilenumbruchzeichen für sich mit einem bloßen echoohne Argumente separat.

Here-Dateien oder: cat <<DELIMITER

cat <<DELIMITER
$my_variable_containing_my_text
DELIMITER

oder

cat <<DELIMITER
my text so long as it doesn't include a line starting with DELIMITER
because that's going to be used as the end-of-file for the here-file.
$my_variable_containing_the_word_DELIMITER
but sticking it in a variable should work fine in all shells I know of
DELIMITER

Die einzige Einschränkung ist , dass Sie nicht kontrollieren können , wenn Sie eine neue Zeile am Ende bekommen oder nicht: Sie immer wird eine neue Zeile am Ende bekommen. Meistens ist dies wahrscheinlich das, was Sie wollten, oder es spielt keine Rolle. Außerdem verwenden viele (alle?) Shells temporäre Dateien auf der Festplatte, um Here-Dateien zu implementieren, sodass es möglich ist, dass ein sehr eingeschränktes System dies nicht zulässt (dieselbe obszön verkrüppelte Android-Instanz, ohne die printfich auch SELinux habe Richtlinien oder andere Berechtigungsbeschränkungen (ich erinnere mich nicht genau), die verhindern, dass die Shell temporäre Dateien erstellt).

Aus diesem Grund kann eine Here-Datei in einem Computer-Sicherheitshinweis, wenn Sie vertrauliche Informationen drucken müssen echo, je nach genauem System entweder schlechter oder besser sein als eine (ist echoextern oder eine integrierte? Is / proc / $ PID) Welt oder Benutzer lesbar? Sind hier Dateien Benutzer oder Welt lesbar?) und Ihr genaues Bedrohungsmodell (ist es wahrscheinlicher, dass Ihre Bedrohung Ihre Festplatte forensisch durchsucht als Ihre laufenden Prozessinformationen?)

expr

Ein wenig bekanntes Merkmal von exprist, dass es Teilzeichenfolgen aus einem Argument mit einer Regex-Übereinstimmung extrahieren und drucken kann. Dies ist im Grunde eine portablere Version des ursprünglichen echoVerhaltens (wörtliche Druckinhalte und ein Zeilenumbruchzeichen) und eine noch portablere Methode zum Drucken von einfachem Text als printf:

expr X"$my_var_holding_my_text" : 'X\(.*\)'

und

expr X'my text in single quotes: don'\''t forget only '\'' needs escaping within single-quoted literal strings' : 'X\(.*\)'

Dies funktioniert zurück zu Unix v7. Die XVorderseite sowohl der zu druckenden Zeichenfolge / Variablen als auch die Vorderseite des regulären Ausdrucks außerhalb der \( \)Untermusterübereinstimmung / -auswahl ist wichtig: Ersteres verhindert, dass der Wert, den Sie drucken, vom exprBefehl als falsch interpretiert wird exprSchlüsselwort, und letzteres stellt dann sicher, dass das X nicht tatsächlich gedruckt wird.

awk

Hier ist ein kompakter awkEinzeiler, der die meisten einzeiligen Argumente druckt, die er eindeutig erhält (Sie haben immer noch ein Problem mit Backslashes in der neueren Version von awk- danke an Stephan, dass Sie mich in den Kommentaren daran erinnert haben):

: | awk 'BEGIN { ORS="" } END { print v }' v="$my_var_with_my_string"

Dies funktioniert zurück zu Unix v7. Wenn Sie keine Backslashes haben, ist dies extrem portabel und möglicherweise gut genug für den Text, den Sie ausgeben müssen. Möglicherweise finden Sie auch das Schreiben von Feature-Tests für verschiedene awkImplementierungen in Ihren Skripten einfacher / einfacher / sauberer als das echoArbeiten für Sie, da es zwar definitiv viele Abweichungen zwischen awks gibt, es jedoch weniger Variationen gibt, auf die getestet werden muss, als echowenn Ihr Kernziel nur das Schreiben einiger ist genaue Ausgabe.

Verwenden Sie natürlich die Zeichenfolgentechnik in einfachen Anführungszeichen, wenn Sie ein Literal anstelle einer Variablen verwenden möchten. echoFühren Sie ein Argument ohne Argumente aus, wenn Sie danach eine neue Zeile wünschen (oder nehmen Sie sich die Zeit, um eine bestimmte Methode genau zu überprüfen, um sicherzustellen, dass eine neue Zeile vom awkBefehl gedruckt wird. Ich empfehle, den :Befehl no-op links in der Pipe durch echoArgumente ohne Argumente zu ersetzen. Aber ich habe diese Idee nicht sorgfältig auf ihre allgemeine Portabilität geprüft.

echodurchgeleitet sedoder ähnlich

Wenn Sie wissen, dass Ihre Eingaben nichts Besonderes sind (es werden keine Oktal-Escapezeichen mit Backslashes wie \000in der Eingabe ausgegeben, die Sie buchstäblich drucken möchten, und Sie müssen nur vermeiden, ein -Zeichen speziell zu analysieren , z. B. das Sie drucken möchten -e, können Sie dennoch beliebige echoArbeiten ausführen Wenn Sie etwas anderes haben, können Sie die echoAusgabe vorverarbeiten :

echo X-e | sed '1 s/^X//'

Bei begrenzten, genau definierten Eingaben können Sie möglicherweise mit einfachen sedErsetzungen wie diesen davonkommen . Je nachdem, was genau Sie benötigen, wird es möglicherweise zunehmend schwieriger. Ab einem bestimmten Punkt ist es besser, mit der nächsten Alternative fortzufahren:

Funktionstest echo

Die Idee, dass Sie nicht zuverlässig echogenau das drucken können, was Sie wollen, wenn Sie bereit sind, sich Mühe zu geben, um dies zu tun, ist nicht unbedingt wahr, insbesondere wenn Sie über eine bekannte Reihe von Ausgaben verfügen, die Sie benötigen. Und glauben Sie mir, es wird weniger schmerzhaft sein, als echoirgendwo im Dateisystem nach der richtigen Binärdatei zu suchen .

Sie haben insbesondere Bedenken geäußert, ein -Zeichen zuverlässig zu drucken . Leider habe ich noch kein gründliches echoShell-Skript-Snippet zum Testen von Funktionen geschrieben, aber hier sind einige grundlegende Snippets, die mir auf den Kopf gefallen sind:

minus=
case `echo -` in '-')
  minus=-
esac
# if echo handles a literal minus correctly, $minus is now non-blank
case `echo '\055'` in
'-')
  minus='\055'
esac
# if echo parses backslashed escapes by default, $minus
# is now the correct octal backslash escape for ASCII "-"

Sie können ähnliche Tests für bestimmte Dinge echo -e '\055'erstellen : (sollte entweder ausgegeben werden -e \055oder -), echo -E '\055'(wenn Backslash standardmäßig analysiert wird und Sie versuchen möchten, sie auszuschalten) usw.

Viele moderne Echo-Instanzen analysieren andere Backslash-Escapezeichen als Oktalzahlen, aber Sie können entweder einen Feature-Test speziell für diese ( echo '\x2d'oder was auch immer) durchführen - aber ich denke, in den meisten Fällen möchten Sie wirklich nur die Argumente finden, die Sie übergeben können Echo, damit es Dinge druckt, ohne spezielle Ersetzungen am Inhalt vorzunehmen, und dann die gewünschte Ausgabe wörtlich eingeben.

Abhängig von Ihren Anforderungen echo -nlohnt es sich möglicherweise auch, einen Test durchzuführen. Beachten Sie jedoch, dass beim Ersetzen von Befehlen immer die letzte neue Zeile entfernt wird (nur die letzte bei den meisten Shells, aber alle nachfolgenden Zeilenumbrüche bei einigen Shells). Daher sind dies Ihre beiden wahrscheinlichen Ausgabeoptionen das Literal -nund die leere Zeichenfolge.

Vielleicht möchten Sie auch konsultieren autoconfund m4Quellen, weil ich denke, dass diese Tools sich sehr bemühen, ein Echo zu finden, mit dem sie eindeutig drucken können, wenn sie kein printfoder etwas anderes finden, das funktioniert.

Im wahrsten Sinne des Wortes alles andere

Ich denke wirklich, dass fast alles, was nicht davon abhängt, dass Sie brutal nach genau dem richtigen suchen müssen, das echoBeste ist. Es ist sehr wahrscheinlich, dass bestimmte echonicht installiert werden oder nicht dort installiert werden, wo Sie suchen, oder dass eine automatische Bruteforce-Suche ab beginnt /das System eines armen Kerls zum Crawlen bringt.

Und obwohl dies sehr unwahrscheinlich ist, ist es möglich, dass eine Binärdatei Ihren Fingerabdruck als GNU weitergibt coreutils echo, aber einen Verhaltensunterschied aufweist: Selbst wenn GNU ihre Implementierung nie ändert, kann jemand seine eigene installierte Version von GNUs einpacken, echoum nicht das zu tun, was er in Betracht zieht Seien Sie ein dummes Verhalten (das transparente Durchlaufen aller Argumente, mit Ausnahme des stillschweigenden Löschens der speziellen Argumente beim Festlegen der gewünschten Argumente, ist in einem Shell-Skript trivial, sodass Sie leicht echo --helpden richtigen Text drucken können, echo -e '\055'aber das Falsche tun). Und nein, nicht einmal eine BinärdateiDas gründliche Fingerabdruckverfahren ist sicher: Ich habe zuvor rohe ELF-Binärdateien bearbeitet, um das Verhalten zu ändern, und ich werde es erneut tun. Manchmal geht es darum, sehr nützliche Funktionen zu aktivieren (Nachrichten, die keine ASCII-Bytes enthalten, wie Unicode-Smileys, in Closed-Source-Messaging-Software stillschweigend zu löschen) und manchmal um wirklich kleine Dinge wie das Ändern der fest codierten Standardeinstellung PS1in Shells \$\anstelle von \w \$). Ich persönlich habe nicht genug Gründe, dies zu tun, echoweil ich auf Systemen, die ich tatsächlich verwende, echobei fast allen ernsthaften Arbeiten einfach ignoriere , aber jemand anderes hat möglicherweise ein ebenso starkes Gefühl für das Standardverhalten echowie für Standardvariablenwerte PS1. Sie kehren also zum Testen von Funktionen zurück echo. An diesem Punkt finden Sie den obigen Abschnitt.

Beachten Sie außerdem, dass ich Systeme habe, auf denen GNU-Coreutils echoinstalliert sind gecho, sodass diese Systeme weder durch eine effiziente Suche nach den PATHund wahrscheinlich installierten Speicherorten noch durch eine Bruteforce-Suche nach nur genannten Dateien abgefangen echowerden.

Und ich würde tatsächlich wetten, dass auf mehr Systemen eine Skriptsprache wie perlinstalliert installiert ist, die das kann, was Sie wollen, als auf Systemen, die coreutils echospeziell über GNU verfügen : Einige Skriptsprachen sind allgegenwärtig und haben meistens eine Implementierung oder eine genau definierte Spezifikation, während echoImplementierungen dies sind unzählige und folgen Sie genau einer Spezifikation: "Machen Sie etwas anderes als so viele andere echoImplementierungen wie möglich".


Mit awkmüssen Sie ENVIRON(oder ARGV) verwenden, nicht mit dem V7 awk. Mit awk -v v="$v" ...oder awk ... v="$v"haben Sie Probleme mit Backslashes.
Stéphane Chazelas

Ah, ja, danke, dass Sie darauf hingewiesen haben. Ich muss eindeutig mehr Zeit damit verbringen, mich an die Nuancen der verschiedenen awks zu erinnern .
mtraceur

sedist eine nette Idee (obwohl ich hoffentlich nichts tun muss, was es wirklich erfordert). In Zukunft werde ich auf jeden Fall daran denken, dass "es kein Problem gibt, das nicht besser gelöst werden kann, wenn man etwas anderes tut als explizit ... eine bestimmte Implementierung einer externen Binärdatei aufzurufen".
mgiuffrida
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.