I have a group of users that have the same account on a few of my Linux systems. They seem to forget their passwords at least once every two months and like to blame my password complexity rules. I am tasked every so often with changing a users password on multiple systems which really is a pain. Here we will examine a nice way to change a users password with a one line command. We will also talk about how we can do this remotely on multiple servers.

First, let’s look at how we can change a users password in one line using echo and the pipe.

echo -e "'NEWPASS'\n'NEWPASS'" | passwd USERNAME

NOTE: There are doube quotes ( " ) surrounding the passwords, but each password is wrapped in a single quote ( ' ) to allow for special characters.

Here we use echo with the “-e” switch. This tell echo to read the “\n” as a newline. Then is is piped into the passwd “USERNAME” command.

We can also use this to change the password on a remote machine with ssh.

ssh root@server 'useradd newuser; echo -e "'NEWPASS'\n'NEWPASS'" | passwd USERNAME'

This assumes your allowing ssh from root or a user with elevated privileges, which is not recommended for security reasons.

You can also run this command (or any command) on multiple servers using a loop. So for this example we will say we have several servers named server1 through server8. What I would do is make a text file containing the server names, one per line like so:

server1
server2
server3
server4
server5
server6
server7
server8

Now we can use a for loop to loop through the lines in the file and connect to each machine.

for i in `cat filename.txt`; do ssh $i 'echo -e "'NEWPASS'\n'NEWPASS'" | passwd USERNAME'; done

There are easier ways to accomplish this if your servers are actually named server1 through server8. But in the real world I doubt your servers and named so conveniently.

Related Articles