Linux: Umlenkung von Ausgaben
Mir ist noch unklar, was die Befehle

**echo "abc" 1> a.log**

und

**echo "abc" 2> a.log**

genau bedeuten. Ich kenne lediglich die Bedeutung von > (fügt die angegebene Zeichenfolge "abc" der Datei a.log hinzu, leert aber vorher den Inhalt) und >> (fügt die angegebene Zeichenfolge "abc" zu a.log lediglich hinzu, also ohne vorher die Datei zu leeren).

Zu 2> hätte ich zumindest eine Vermutung: Die angegebene Zeichenfolge wird im Terminal ausgegeben und die Datei, die hinter 2> steht, wird geleert. Das ist das, was ich im Terminal beobachten konnte (habe mit cat auf den Dateiinhalt geprüft).

Aber was 1> bedeuten soll, da habe ich leider gar keine Idee.

Im Internet konnte ich nichts Aufschlussreiches dazu finden.

Danke im Voraus! :)
Eine geöffnete Datei wird durch einen sogenannten *file descriptor* repräsentiert.  


Mit 


```
[anweisung] n> [datei]
```
 wird [anweisung] ausgeführt und das, was der dadurch erzeugte Prozess in die Datei mit file descriptor n schreibt, wird stattdessen in die Datei [datei] gerschrieben.   
Beim Programmstart werden üblicherweise automatisch drei Dateien geöffnet:

    0: stdin Die Standardeingabe  


    1: stdout Die Standardausgabe

    2: stderr Die Fehlerausgabe

**Beispiele.**


```
ls 1> files.txt  

```
schreibt den Inhalt des aktuellen Ordners in die Datei files.txt und zeigt Fehlermeldungen am Bildschirm an. Die 1 hätte hier weggelassen werden können.  

```
ls 2> ls.err  

```
Zeigt den Inhalt des aktuellen Ordners am Bildschirm an und schreibt Fehlermeldungen in die Datei ls.err.
```
ls 2>ls.err 1> files.txt  

```
Schreibt Inhalt des aktuellen Ordners in die Datei files.txt und Fehlermeldungen in die Datei ls.err.
```
ls 2>&1 | cat > output  

```
Schreibt Inhalt des aktuellen Ordners und Fehlermeldungen in die Datei output.
<pre class="lang-none prettyprint-override"><code>echo -e "first line" | tee ~/output.log echo -e "second line" | tee -a ~/output.log ^^ </code></pre><p>von <a href="http://man7.org/linux/man-pages/man1/tee.1.html">mann tee</a> :</p><pre class="lang-none prettyprint-override"><code> copy standard input to each file, and also to standard output. -a, --append append to the given files, do not overwrite </code></pre><p>hinweis: mit <code>-a</code> wird immer noch die erwähnte datei erstellt.</p> <p>fügen sie ihrem <code>~/.bashrc</code> die folgende zeile hinzu:</p><pre><code>alias sudo='sudo ' </code></pre><p>aus dem <a href="http://www.gnu.org/software/bash/manual/bashref.html#aliases">bash manual</a> :</p><blockquote> <p>aliase ermöglichen das ersetzen eines worts durch eine zeichenfolge, wenn es als erstes wort eines einfachen befehls verwendet wird. die shell verwaltet eine liste von aliasen, die mit den integrierten befehlen alias und unalias festgelegt und deaktiviert werden können.</p> <p><strong> das erste wort jedes einfachen befehls wird, wenn es nicht in anführungszeichen gesetzt ist, überprüft, um festzustellen, ob es einen alias ​​</strong> enthält. in diesem fall wird dieses wort durch den text des alias ​​ersetzt. die zeichen "/", "$", "` "," = "und alle oben aufgeführten shell-metazeichen oder anführungszeichen erscheinen möglicherweise nicht in einem aliasnamen. der ersetzungstext kann eine gültige shell-eingabe enthalten, einschließlich shell-metazeichen. das erste wort des ersetzungstextes wird auf aliase geprüft, ein wort, das mit einem zu erweiternden alias ​​identisch ist, wird jedoch nicht ein zweites mal erweitert. dies bedeutet, dass beispielsweise ein alias ​​"ls" für "ls -f" verwendet werden kann und bash nicht versucht, den ersetzungstext rekursiv zu erweitern. <strong> wenn das letzte zeichen des alias-werts ein leerzeichen oder ein tabulatorzeichen ist, wird das nächste auf den alias ​​folgende befehlswort ebenfalls auf alias-erweiterung überprüft </strong>.</p> </blockquote><p><sup>(hervorhebung von mir).</sup><br> bash überprüft nur das erste wort eines befehls auf einen alias, alle wörter danach werden nicht überprüft. das heißt, in einem befehl wie <code>sudo ll</code> wird nur das erste wort (<code>sudo</code>) von der bash auf einen alias ​​überprüft, <code>ll</code> wird ignoriert. wir können bash anweisen, das nächste wort nach dem alias ​​(d. h. <code>sudo</code>) zu überprüfen, indem sie am ende des alias ​​ein leerzeichen einfügen.</p> <p>laut bash-manpage:</p><blockquote> <p>bash durchsucht jedes wort nach den zeichen *,? und [. wenn eines dieser zeichen angezeigt wird, wird das wort als muster angesehen und durch eine alphabetisch sortierte liste von dateinamen ersetzt, die mit dem muster übereinstimmen</p> </blockquote><p>und vom infoknoten für <strong>ls</strong></p><blockquote> <p>das ls-programm listet informationen zu dateien (jeglichen typs, einschließlich verzeichnissen) auf. optionen und dateiargumente können wie gewohnt beliebig gemischt werden.</p> <p>bei nicht-optionsbefehlszeilenargumenten, die verzeichnisse sind, listet 'ls' standardmäßig den inhalt von verzeichnissen auf, nicht rekursiv, und lässt dateien weg, deren namen mit '.' beginnen. bei anderen nichtoptionsargumenten wird standardmäßig nur der dateiname mit "ls" aufgelistet. wenn keine nichtoptionsargumente angegeben werden, listet 'ls' den inhalt des aktuellen verzeichnisses auf.</p> </blockquote><p>wenn sie also <code>ls d*</code> eingeben, wird <strong>d *</strong> zu einer sortierten liste aller datei-/verzeichnisnamen erweitert, die mit d beginnen. so wird dein befehl</p><pre><code>ls dump </code></pre><p>und da dump ein verzeichnisname ist, erhalten sie die auflistung aller dateien im verzeichnis "dump", aber wenn sie <code>ls d*</code> angeben, wird <strong>d *</strong> zu "<strong>desktop documents)" erweitert downloads dropbox</strong> ", so wird der befehl</p><pre><code>ls desktop documents downloads dropbox </code></pre><p>und da dies alles verzeichnisse sind, erhalten sie die auflistung der dateien in einzelnen verzeichnissen. wenn eine datei im aktuellen verzeichnis mit <strong>d</strong> begonnen hätte, wäre sie separat aufgeführt worden.</p> <p>es ist nicht erforderlich, <code>$?</code> explizit zu überprüfen. mach einfach:</p><pre><code>ps aux | grep some\_proces[s] &gt; /tmp/test.txt &amp;&amp; echo 1 || echo 0 </code></pre><p>beachten sie, dass dies darauf beruht, dass das echo nicht ausfällt, was sicherlich nicht garantiert ist. ein zuverlässigerer weg, dies zu schreiben, ist:</p><pre><code>if ps aux | grep some\_proces[s] &gt; /tmp/test.txt; then echo 1; else echo 0; fi </code></pre> <p>möchten sie, dass es funktioniert, ohne einen zusätzlichen befehl einzugeben, z.</p><pre><code>$ rm file </code></pre><p>oder nur, wenn der benutzer so etwas eingibt</p><pre><code>$ confirm rm file </code></pre><p>oder nur, wenn der benutzer versucht, bestimmte befehle auszuführen, z.</p><pre><code>$ rm file </code></pre><p>aber nicht für</p><pre><code>$ echo "hello" </code></pre><p>bei option 1 kann dies mit dem preexec-hook in zsh oder der debug-trap in bash erfolgen.</p><p>fügen sie bei option 2 so etwas in <code>/etc/bash.bashrc</code> oder eine andere shell-startdatei ein.</p><pre><code>confirm() { echo -n "do you want to run $*? [n/y] " read -n 1 reply echo if test "$reply" = "y" -o "$reply" = "y"; then "$@" else echo "cancelled by user" fi } </code></pre><p>bei option 3 können sie das <code>confirm</code> -skript oben ändern, oder einige befehle haben eine option, die sie fragen können, bevor sie etwas tun, z. <code>rm -i</code>. sie könnten <code>alias rm='rm -i'</code> in <code>/etc/bash.bashrc</code> einfügen.</p> <p>das macht <code>echo</code>:</p><pre><code>echo "some text here." &gt; myfile.txt </code></pre> <p>es bedeutet <strong> viel mehr </strong> als nur neue zertifikate (oder vielmehr neue schlüsselpaare) für jeden betroffenen server. es bedeutet auch:</p><ul> <li>patchen betroffener systeme auf openssl 1.0.1g</li> <li>widerruf der alten schlüsselpaare, die gerade abgelöst wurden</li> <li>alle passwörter ändern</li> <li>ungültigmachen aller sitzungsschlüssel und cookies</li> <li>auswertung des tatsächlichen inhalts, der von den anfälligen servern verarbeitet wird, die möglicherweise durchgesickert sind, und entsprechende reaktion.</li> <li>auswertung aller anderen informationen, die aufgedeckt werden könnten, wie speicheradressen und sicherheitsmaßnahmen</li> </ul><p>zusammengefasst aus <a href="http://heartbleed.com/">heartbleed.com</a> (hervorhebung von mir):</p><blockquote> <p><strong> was ist durchgesickertes primärschlüsselmaterial und wie kann es wiederhergestellt werden? </strong></p> <p>dies sind die kronjuwelen <strong> die verschlüsselungsschlüssel selbst </strong>. durchgesickerte geheime schlüssel ermöglichen es dem angreifer, den vergangenen und zukünftigen datenverkehr zu den geschützten diensten zu entschlüsseln und sich nach belieben als dienst auszugeben. jeder durch die verschlüsselung und die signaturen in den x.509-zertifikaten gewährte schutz kann umgangen werden. die wiederherstellung nach diesem leck erfordert das patchen der sicherheitsanfälligkeit, das widerrufen der gefährdeten schlüssel sowie das erneute ausgeben und verteilen neuer schlüssel. selbst wenn sie dies alles tun, bleibt der vom angreifer in der vergangenheit abgefangene datenverkehr immer noch anfällig für entschlüsselung. all dies muss von den eigentümern der dienste durchgeführt werden.</p> <p><strong> was ist durchgesickertes sekundärschlüsselmaterial und wie kann es wiederhergestellt werden? </strong></p> <p>dies sind beispielsweise <strong> die benutzeranmeldeinformationen (benutzernamen und kennwörter) </strong>, die in den anfälligen diensten verwendet werden. für die wiederherstellung nach diesen lecks müssen die eigentümer des dienstes zuerst das vertrauen in den dienst gemäß den oben beschriebenen schritten wiederherstellen. danach können benutzer beginnen, ihre passwörter und möglichen verschlüsselungsschlüssel gemäß den anweisungen der eigentümer der dienste zu ändern, die kompromittiert wurden. alle sitzungsschlüssel und sitzungscookies sollten ungültig sein und als gefährdet gelten.</p> <p><strong> was ist durchgesickerter geschützter inhalt und wie kann er wiederhergestellt werden? </strong></p> <p>dies ist <strong> der tatsächliche inhalt, der von den anfälligen diensten verarbeitet wird </strong>. es kann sich um persönliche oder finanzielle details, private kommunikation wie e-mails oder sofortnachrichten, dokumente oder alles handeln, was durch verschlüsselung geschützt werden sollte. nur eigentümer der dienste können die wahrscheinlichkeit des durchsickerns abschätzen und sollten ihre benutzer entsprechend benachrichtigen. das wichtigste ist, das vertrauen in das primär- und sekundärschlüsselmaterial wie oben beschrieben wiederherzustellen. nur so können die gefährdeten dienste in zukunft sicher genutzt werden.</p> <p><strong> was sind durchgesickerte sicherheiten und wie kann sie wiederhergestellt werden? </strong></p> <p>durchgesickerte sicherheiten sind <strong> andere details, die dem angreifer im durchgesickerten speicherinhalt ausgesetzt wurden </strong>. diese können technische details wie speicheradressen und sicherheitsmaßnahmen wie kanarienvögel zum schutz vor überlaufangriffen enthalten. diese haben nur einen zeitgemäßen wert und verlieren ihren wert für den angreifer, wenn openssl auf eine feste version aktualisiert wurde.</p> </blockquote> <p>sie können das meiste davon tun, indem sie eine login.sql verwenden. login.sql wird während der - überraschenden - anmeldung ausgeführt und aus ihrem sqlpath oder dem aktuellen verzeichnis geladen. für die beispiele, die sie gegeben haben, haben sie wirklich den schlimmsten fall gewählt.</p><p>problem ist der sqlterminator. was auch immer sie dort eingeben, der schrägstrich wird als kostenloser sql-minator beibehalten. daneben sucht sqlplus zuerst nach dem sqlterminator und führt dies vor dem scannen zum string-terminator durch. ein fehler, wenn sie mich fragen. der schrägstrich kann in einer zeichenfolge verwendet werden, solange er nicht allein in einer separaten zeile steht. sobald sqlplus das als sqlterminator angegebene zeichen findet, ignoriert es alles andere und hört auf zu lesen.</p><p>der schrägstrich kann behandelt werden, solange er nicht alleine in einer zeile steht.</p><p>login.sql enthält:</p><pre><code>prompt run login.sql show sqlterminator show sqlblanklines set sqlblanklines on set sqlterminator ';' show sqlterminator show sqlblanklines prompt ready login.sql set echo on </code></pre><p>leigh.sql enthält:</p><pre><code>insert into t1 values ('fail bc semicolon a;a / '); insert into t1 values ('fail bc solo / aa / '); insert into t1 values ('ok / not solo aa /a '); delete from t1 where a = 'c a/ '; </code></pre><p>führen sie das skript aus:</p><pre><code>sqlplus leigh/leigh@orcl @leigh sql*plus: release 10.2.0.4.0 - production on thu aug 9 22:36:20 2012 copyright (c) 1982, 2007, oracle. all rights reserved. connected to: oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production with the partitioning, real application clusters, automatic storage management, olap, data mining and real application testing options run login.sql sqlterminator ";" (hex 3b) sqlblanklines off sqlterminator ";" (hex 3b) sqlblanklines on ready login.sql sql&gt; insert into t1 values ('fail bc semicolon 2 a;a 3 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('fail bc solo / 2 3 4 aa 5 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('ok / not solo 2 3 4 aa 5 /a 6 '); 1 row created. sql&gt; sql&gt; delete from t1 where a = 'c 2 3 4 a/ 5 '; 0 rows deleted. </code></pre><p>sie müssen nicht mit start-/endblöcken herumspielen. der befehl sqlterminator innerhalb des befehls kann nicht verarbeitet werden, unabhängig davon, wo er sich in einer zeichenfolge befindet oder nicht. er kann keine zeilen mit schrägstrich allein in einer zeile in einer zeichenfolge verarbeiten.</p> <p><code>more</code> ist ein grundlegender pager, mit dem sie seitenweise nach unten scrollen können. nur abwärts.</p><p><code>less</code> ist ebenfalls ein pager, verfügt jedoch über zusätzliche funktionen zum scrollen durch die eingabe nach oben und unten sowie über mehrere andere erweiterungen.</p><p>also ja. <code>less</code> ist mehr und <code>more</code> ist weniger. eine andere gebräuchliche redewendung (gemäß dem <a href="http://en.wikipedia.org/wiki/less\_(unix)">wiki-eintrag</a> ) ist "<code>less</code> ist <code>more</code>, mehr oder weniger". der name kommt von der tatsache, dass der autor (mark nudelman) im wesentlichen ein programm wollte, das "rückwärts mehr" war - das gegenteil von mehr ist <code>less</code>.</p> <p>wenn sie es im standardmodus ausführen, befindet es sich im menü: optionen&gt; einblenden/ausblenden&gt; zeilennummern. dann optionen&gt; optionen speichern, um es für zukünftige sitzungen zu speichern.</p><p>wenn sie es in einem terminal ausführen (<code>emacs -nw</code>), ist es <code>m-x line-number-mode</code>. <code>m-</code> ist normalerweise die windows-taste, kann aber sein <kbd>alt</kbd>, oder sie können drücken <kbd>esc</kbd> gefolgt von <kbd>x</kbd>.</p><p>(bearbeiten: das obige wirkt sich nur auf die moduszeile aus. für zeilennummern am rand möchten sie <code>m-x linum-mode</code> oder wahrscheinlicher <code>(setq global-linum-mode t)</code> in ihrem <code>~/.emacs</code>.)</p>