Ich versuche, einige Benutzerkontokennwörter unter Verwendung der Masse einzustellen chpasswd
. Die Passwörter sollten zufällig generiert und gedruckt werden stdout
(ich muss sie aufschreiben oder in einen Passwortspeicher stellen) und auch an übergeben werden chpasswd
.
Naiv würde ich das so machen
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
Ich mache mir jedoch Sorgen, das neue Kennwort als Befehlszeilenargument an zu übergeben echo
, da Argumente normalerweise für andere Benutzer in sichtbar sind ps -aux
(obwohl ich in nie eine echo
Zeile gesehen habe ps
).
Gibt es eine alternative Möglichkeit, meinem zurückgegebenen Kennwort einen Wert voran zu stellen und diesen dann weiterzugeben chpasswd
?
echo
ist eine Shell eingebaut. Es würde nicht in der Prozesstabelle auftauchen.Antworten:
Ihr Code sollte sicher sein, da er
echo
nicht in der Prozesstabelle angezeigt wird, da er in eine Shell integriert ist.Hier ist eine alternative Lösung:
Dadurch werden die Namen und Kennwörter Ihrer Schüler erstellt
n
, ohne dass Kennwörter in einer Befehlszeile eines Befehls übergeben werden müssen.Das
paste
Dienstprogramm fügt mehrere Dateien als Spalten zusammen und fügt ein Trennzeichen dazwischen ein. Hier verwenden wir:
als Begrenzer und geben ihm zwei "Dateien" (Prozessersetzungen). Der ersteseq
Befehl enthält die Ausgabe eines Befehls, der 20 Benutzernamen für Schüler erstellt, und der zweite Befehl enthält die Ausgabe einer Pipeline, die 20 zufällige Zeichenfolgen der Länge 13 erstellt.Wenn Sie bereits eine Datei mit Benutzernamen erstellt haben:
Diese speichern die Passwörter und Benutzernamen in der Datei,
secret.txt
anstatt die generierten Passwörter im Terminal anzuzeigen.quelle
echo
oderprintf
der Code ist ein bisschen umständlich zu entziffernecho
, eine eingebaute Shell zu sein. Bei den meisten Muscheln ist dies der Fall, es besteht jedoch keinerlei Anforderung, dass dies der Fall ist.tee secret.txt > >(chpasswd)
undtee secret.txt | chpasswd
? Letzteres scheint weitaus üblicher zu sein, und ich frage mich, warum Sie die Prozessersetzung anstelle eines einfachen Rohrs gewählt habentee
). Nachdem Sie darauf hingewiesen haben, denke ich, dass ich es tatsächlich ändern werde (es sieht besser aus). Vielen Dank.echo
ist sehr wahrscheinlich in die Shell integriert, sodass sie nichtps
als separater Prozess angezeigt wird.Sie müssen die Befehlssubstitution jedoch nicht verwenden, sondern können die Ausgabe der Pipeline direkt an
chpasswd
folgende Adresse senden :Wenn Sie mehrere Passwörter in einem Durchgang ändern möchten
chpasswd
, sollte es einfach sein, die wesentlichen Teile wiederholen zu lassen. Oder mache daraus eine Funktion:Nebenbei: das
head /dev/urandom
fühlt sich etwas merkwürdig an, daurandom
es nicht zeilenorientiert ist. Möglicherweise werden übermäßig viele Bytes daraus gelesen, was sich auf die Vorstellung des Kernels von der verfügbaren Entropie auswirkt, was wiederum zum/dev/random
Blockieren führen kann. Es könnte sauberer sein, nur eine feste Datenmenge zu lesen undbase64
die zufälligen Bytes in druckbare Zeichen umzuwandeln (anstatt nur etwa 3/4 der erhaltenen Bytes wegzuwerfen).So etwas würde Ihnen ca. 16 Zeichen und Zahlen:
(das heißt, 16 abzüglich der Anzahl
+
und der/
Zeichen in der Ausgabe vonbase64
. Die Chance von entweder 1/32 pro Zeichen, also wenn ich meine Kombinatorik richtig verstanden habe, ergibt das eine 99% ige Chance, mindestens 14 Zeichen zu lassen, und eine 99,99% ige Chance, mindestens 12 zu verlassen.)quelle
printf
Lösung funktioniert nicht wie mein ursprünglicher Code: Geben Sie mehrere Zeilen für mehrere Benutzernamen zurück, aber ich freue mich über Ihre Anmerkungen zuhead urandom
head -c 10 | base64
Pipeline oder Nils mithead | tr
? 10 "Zeilen" von zufälligen Bytes sind sehr wahrscheinlich Hunderte von Bytes (vorausgesetzt, nur 1 von 256 wäre ein Zeilenumbruch), obwohl es theoretisch genau 10 Bytes sein könnten, aber die Chancen dafür sind völlig vernachlässigbar. Ähnlich ist es bei Verwendung von base64base64
, wenn zufällige Bytes einfach gesagt\xff
werden, nur eine Folge von Schrägstrichen, aber das ist auch ziemlich unwahrscheinlich. Wenn es Sie interessiert, können Sie mehr als 10 Bytes lesen, die Wahrscheinlichkeit dafür verringern und dann die Länge der resultierenden Ausgabe verringern./dev/urandom
, aber das Risiko beträgt nicht 0%.