Puis-je changer un mot de passe utilisateur sous Linux à partir de la ligne de commande sans aucune interactivité?

15

J'ai un cas d'utilisation spécifique où je voudrais vraiment pouvoir changer le mot de passe d'un utilisateur avec une seule commande sans interactivité. Cela se fait de manière sécurisée (via SSH et sur un système avec un seul utilisateur pouvant être connecté), il est donc correct d'exposer le nouveau mot de passe (et même l'ancien, si nécessaire) sur la ligne de commande. FWIW, c'est un système Ubuntu.

Je veux juste éviter d'avoir à ajouter quelque chose de semblable à Expect à ce système pour cette seule tâche.

Paul Hoffman
la source
3
Pour ceux qui veulent le faire sur FreeBSD:echo "newpassword" | pw usermod theusername -h 0
Paul Hoffman

Réponses:

25

Vous pouvez utiliser chpasswd .

echo user:pass | /usr/sbin/chpasswd
xofer
la source
5

Vous pouvez utiliser usermodavec l' -poption pour fournir un hachage de mot de passe (pas le mot de passe réel). Vous pouvez générer le hachage de mot de passe en utilisant quelque chose comme mkpasswd -m sha-256oumkpasswd -m md5

Ragoût
la source
1
... Mais mon système AIX n'a ​​pas usermod: '(- Je vais corriger les balises sur la question.
voretaq7
3

Sûr.

  1. Hachez le mot de passe sur votre système local.
  2. Connectez-vous à la machine distante (où vous souhaitez modifier le mot de passe)
  3. Nourrir le mot de passe et le nom d' utilisateur haché à une création de sedscript qui met à jour le fichier de mot de passe de votre système ( /etc/shadow, /etc/master.passwd, quoi qu'il arrive à être).
voretaq7
la source
1

L' passwdutilitaire a une option --stdin qui indique:

Cette option est utilisée pour indiquer que passwd doit lire le nouveau mot de passe à partir de l'entrée standard, qui peut être un canal.

Syntaxe:

echo "newpass" | passwd --stdin user1

Même si vous avez mentionné que vous ne vous souciez pas, vous pouvez mettre le mot de passe dans un fichier texte, puis le faire à la cat pass.txtplace de la commande echo, de cette façon, il n'apparaît pas dans l'historique bash.

Safado
la source
C'est celui-là. echo VerySecret | passwd --stdin username
MadHatter
5
Mon système Ubuntu n'a pas --stdind'option pour passwd.
Jeff Ferland
Vous avez raison, ce n'est pas le cas. J'ai vérifié à la fois sur un système CentOS et sur un Mac et ils ont l'option --stdin, donc la suppression de celui-ci doit être une chose Ubuntu.
Safado
1
@RyanM. FreeBSD (et AFAIK NetBSD et OpenBSD, AIX, HP-UX et Solaris pour la dernière fois) ne prennent pas en charge non --stdinplus - principalement parce que c'est un gros trou de sécurité géant qui attend de se produire :-)
voretaq7
1
@quanta: Ou commencez la echo "newpass" | passwd --stdin user1ligne par un espace; De cette façon, cela n'ira pas du tout à l'histoire.
Janne Pikkarainen
1

Si l' --stdinoption ne fonctionne pas, nous pouvons essentiellement utiliser deux options:

  1. Soit utilisez un autre utilitaire appelé chpaswddans votre script.
  2. Ou utiliser echo "current_password\nnew_password\nnew_password" | passwd user_name
Sanjay s.
la source