Warum stoppt der Befehl "Strings" nicht?

30

Der stringsBefehl verhält sich merkwürdig, anscheinend hört er nicht auf, in eine Datei zu schreiben, selbst wenn auf dem Laufwerk nicht mehr genügend Speicherplatz vorhanden ist. Oder fehlt mir vielleicht etwas?

Ich führe Folgendes aus:

# strings /dev/urandom > random.txt

dies lief weiter und hörte auch nach dem füllen der festplatte nicht auf (ein normaler usb flash).

Um schneller zu sein, habe ich eine Ramdisk erstellt und den gleichen Befehl erneut versucht. es hörte auch nicht auf.

Ich verstehe, dass dies urandomkeine reguläre Datei ist und auch stringsdie Ausgabe umgeleitet wird. In beiden oben genannten Fällen hat der catBefehl den Fehler gemeldet, als kein Speicherplatz mehr vorhanden war.

# cat /dev/urandom > random.txt
cat: write error: No space left on device
  1. Ist das normales Verhalten von Strings? Wenn ja warum?
  2. Wo werden die Daten geschrieben, nachdem kein Platz mehr vorhanden ist?
user174174
quelle
1
Was war der Hinweis darauf, dass Ihr erster Befehl die Festplatte tatsächlich gefüllt hatte?
Kusalananda
1
@ Kusalananda Es wurde von df gemeldet. Ich habe es von einem anderen virtuellen Terminal aus mit watch df -h
user174174
2
@ Kusalananda: Sie können dies einfach testen mitstrace strings /dev/urandom > /dev/full
Peter Cordes
2
@mosvy OpenBSD verwendet dieselbe stringsImplementierung aus GNU-Binutils. Ich bezog mich auf den straceBefehl.
Kusalananda
2
@Kusalananda OK, weil die „BSD - Toolchain“ Austausch von Zeichenketten (1) überprüft nicht für den Rückgabewert von putchar () entweder
mosvy

Antworten:

63

Wenn GNU catnicht ausschreiben kann, was es liest, wird es mit einem Fehler beendet :

/* Write this block out.  */

{
  /* The following is ok, since we know that 0 < n_read.  */
  size_t n = n_read;
  if (full_write (STDOUT_FILENO, buf, n) != n)
    die (EXIT_FAILURE, errno, _("write error"));
}

GNU stringshingegen ist es egal, ob es es geschafft hat, erfolgreich zu schreiben:

while (1)
  {
    c = get_char (stream, &address, &magiccount, &magic);
    if (c == EOF)
      break;
    if (! STRING_ISGRAPHIC (c))
      {
        unget_part_char (c, &address, &magiccount, &magic);
        break;
      }
    putchar (c);
  }

Also scheitern all diese Schreibvorgänge, gehen aber stringsfröhlich weiter, bis das Ende der Eingabe erreicht ist, was niemals der Fall sein wird.

$ strace -e write strings /dev/urandom > foo/bar
write(1, "7[\\Z\n]juKw\nl [1\nTc9g\n0&}x(x\n/y^7"..., 4096) = 4096
write(1, "\nXaki%\ndHB0\n?5:Q\n6bX-\np!E[\n'&=7\n"..., 4096) = 4096
write(1, "%M6s\n=4C.%\n&7)n\nQ_%J\ncT+\";\nK*<%\n"..., 4096) = 4096
write(1, "&d<\nj~g0\nm]=o\na=^0\n%s]2W\nM7C%\nUK"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "~\nd3qQ\n^^u1#\na#5\\\n^=\t\"b\n*91_\n ]o"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "L\n6QO1x\na,yE\nk>\",@Z\nyM.ur\n~z\tF\nr"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\n61]R\nyg9C\nfLVu\n<Ez:\n.tV-c\nw_'>e"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nCj)a\nT]X:uA\n_KH\"B\nRfQ4G\n3re\t\n&s"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "j\nk7@%\n9E?^N\nJ#8V\n*]i,\nXDxh?\nr_1"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "ia\tI\nQ)Zw\nnV0J\nE3-W \n@0-N2v\nK{15"..., 4096) = -1 ENOSPC (No space left on device)
write(1, "\nZ~*g\n)FQn\nUY:G\ndRbN\nn..F\nvF{,\n+"..., 4096) = -1 ENOSPC (No space left on device)
...
Olorin
quelle
19
Gute Analyse. Ich würde sagen, das sollte als Bug in angesehen werden strings.
Kasperd
3
Hat jemand vor, den Fehler zu melden?
Nate Eldredge