Ich schreibe ein Shell-Skript, um automatisch einen neuen Benutzer hinzuzufügen und sein Kennwort zu aktualisieren. Ich weiß nicht, wie ich passwd vom Shell-Skript lesen kann, anstatt mich interaktiv nach dem neuen Passwort zu fragen. Mein Code ist unten.
adduser $ 1 passwd $ 1 $ 2 $ 2
von "man 1 passwd
":
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
Also in deinem Fall
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Update] In den Kommentaren wurden einige Probleme angesprochen:
Ihr passwd
-Befehl hat möglicherweise keine --stdin
-Option: Verwenden Sie stattdessen das Dienstprogramm chpasswd
, Wie von ashawley vorgeschlagen.
Wenn Sie eine andere Shell als bash verwenden, ist "echo" möglicherweise kein eingebauter Befehl, Und die Shell ruft /bin/echo
auf. Dies ist nicht sicher, da das Kennwort In der Prozesstabelle angezeigt wird und mit Tools wie ps
angezeigt wird.
In diesem Fall sollten Sie eine andere Skriptsprache verwenden. Hier ist ein Beispiel in Perl:
#!/usr/bin/Perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
Die einzige Lösung funktioniert auf Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Die zweite Option funktioniert jedoch nur bei einem Wechsel von:
echo "password:name" | chpasswd
Zu:
echo "user:password" | chpasswd
Siehe Erklärungen im ursprünglichen Beitrag: Ändern des Passworts über ein Skript
Lies die weisen Worte von:
Ich zitiere:
Nichts, was Sie in Bash tun können, kann möglicherweise funktionieren. passwd (1) liest nicht von der Standardeingabe. Das ist beabsichtigt. Es ist zu Ihrem Schutz. Passwörter sollten niemals in Programme eingegeben oder von Programmen generiert werden. Sie sollten nur von den Fingern eines tatsächlichen Menschen mit einem funktionierenden Gehirn betreten werden und wurden niemals irgendwo aufgeschrieben.
Trotzdem werden wir von vielen Benutzern gefragt, wie sie 35 Jahre Unix-Sicherheit umgehen können.
Es wird erklärt, wie Sie Ihr shadow(5)
-Passwort richtig einstellen können, und es wird Ihnen das GNU - angezeigt, für das ich mich nur um die Sicherheit kümmere, wenn es nicht funktioniert -me-think-too-much - Art, passwd(1)
zu missbrauchen.
Wenn Sie die alberne GNU passwd (1) -Erweiterung --stdin
verwenden möchten, übergeben Sie das Kennwort nicht und setzen Sie es in die Befehlszeile.
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
Das Letzte ist das Beste, was Sie mit GNU passwd
tun können. Obwohl ich es immer noch nicht empfehlen würde.
Wenn Sie das Kennwort in die Befehlszeile eingeben, kann jeder, der auch nur den geringsten Hinweis auf den Zugriff auf die Box hat, ps
oder ein solches überwachen und das Kennwort stehlen. Selbst wenn Sie denken, dass Ihre Box sicher ist; Es ist etwas, das Sie wirklich zur Gewohnheit machen sollten, um jeden Preis zu vermeiden (ja, sogar die Kosten für ein bisschen mehr Mühe, die Arbeit zu erledigen).
Heutzutage:
echo "user:pass" | chpasswd
Sie könnten chpasswd verwenden
echo $1:$2 | chpasswd
Für diejenigen, die per Fernzugriff ein Skript ausführen müssen, das sich bei einem Benutzerkonto in der sudoers-Datei anmeldet, fand ich einen bösen, schrecklichen Hack, der zweifellos sehr unsicher ist:
sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH
Sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
Ich bin auf das gleiche Problem gestoßen und aus irgendeinem Grund war die Option "--stdin" nicht in der Version von passwd
verfügbar, die ich verwendete (auf Ubuntu 14.04 ausgeliefert).
Wenn einer von Ihnen dasselbe experimentiert, können Sie es wie ich umgehen: Verwenden Sie den Befehl chpasswd
wie folgt:
echo "<user>:<password>" | chpasswd
Manchmal ist es nützlich, ein Passwort festzulegen, das niemand kennt. Das scheint zu funktionieren:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
Haben Sie sich die -p
-Option von adduser
angesehen (wobei AFAIK nur ein anderer Name für useradd
ist)? Vielleicht möchten Sie auch die -P
-Option von luseradd
betrachten, die ein Klartextkennwort verwendet, aber ich weiß nicht, ob luseradd
ein Standardbefehl ist (es kann Teil von SE Linux sein oder vielleicht nur eine Eigenart von Fedora).
Dies ist die endgültige Antwort für einen Teradata-Knotenadministrator.
Gehen Sie zu Ihrer /etc/hosts
-Datei und erstellen Sie eine Liste mit IP- oder Knotennamen in einer Textdatei.
SMP007-1
SMP007-2
SMP007-3
Fügen Sie das folgende Skript in eine Datei ein.
#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS
while read -r i; do
echo changing password on "$i"
ssh [email protected]"$i" Sudo echo "$MYUSERID":"$MYPASS" | chpasswd
echo password changed on "$i"
done< /usr/bin/setpwd.srvrs
Okay, ich weiß, ich habe mit ssh und root eine Kardinalsicherheitsregel gebrochen, aber ich lasse Sie die Sicherheitsleute dazu bringen, damit umzugehen.
Fügen Sie dies nun zusammen mit Ihrer /usr/bin
-Konfigurationsdatei in Ihr setpwd.srvrs
-Unterverzeichnis ein.
Wenn Sie den Befehl ausführen, werden Sie einmal zur Eingabe der Benutzer-ID und anschließend zur Eingabe des Kennworts aufgefordert. Dann durchläuft das Skript alle Knoten in der Datei setpwd.srvrs
und führt für jeden Knoten eine kennwortlose SSH aus Legt dann das Kennwort ohne Benutzerinteraktion oder sekundäre __.-Kennwortüberprüfung fest.
Getestet dies auf einem CentOS VMWare-Image, das ich für so etwas aufbewahre. Beachten Sie, dass Sie wahrscheinlich vermeiden möchten, Kennwörter als Befehlszeilenargumente zu verwenden, da jeder Benutzer der gesamten Maschine diese aus 'ps -ef' lesen kann.
Das heißt, das wird funktionieren:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user