it-swarm.com.de

Verwenden des Befehls passwd innerhalb eines Shell-Skripts

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
54
Jared

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
79
8jean

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

46
Fernando Kosh

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).

25
lhunath

Heutzutage: 

echo "user:pass" | chpasswd

22
BlackNoxis

Sie könnten chpasswd verwenden

echo $1:$2 | chpasswd

1
bsmoo

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
1
Raydude

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

0
Mariano Anaya

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
0
user3811862

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).

0
rmeador

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. 

0
JohnS

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
0
Don Werve