Systems Administrators know all too well the importance of being able to monitor and administer numerous machines in a short time, and preferably, with as little running around as possible. Whether it is a small cloud environment, or an enormous server cluster, the ability to centrally manage computers is essential.
To partly accomplish this, I am going to show you how to use a nifty little tool called DSH that allows a user to run commands over multiple machines.
Read Also: Pssh – Execute Commands on Multiple Remote Linux Servers
What is DSH?
DSH is short for “Distributed Shell” or “Dancer’s Shell” it is freely available on most major distributions of Linux, but can easily be built from source if your distribution does not offer it in its package repository. You can obtain the source at.
Install DSH (Distributed Shell) in Linux
We are going to assume a Debian / Ubuntu environment for the scope of this tutorial. If you are using another distribution, please substitute the appropriate commands for your package manager.
On Debian / Ubuntu
First, let’s install the package via apt:
$ sudo apt-get install dsh
On RHEL / CentOS / Fedora
This method is for those who are not using Debian, and want to compile it from source tar balls. First you need to compile “libdshconfig” and install.
# wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz # tar xfz libdshconfig*.tar.gz # cd libdshconfig-* # ./configure ; make # make install
Then compile dsh and install.
# wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz # tar xfz dsh-0.22.0.tar.gz # cd dsh-* # ./configure ; make # make install
The main configuration file “/etc/dsh/dsh.conf” (For Debian) and “/usr/local/etc/dsh.conf” (for Red Hat) is pretty straightforward, but since rsh is an unencrypted protocol, we are going to use SSH as the remote shell. Using the text editor of your choice, find this line:
And change it to:
There are other options you can pass in here, if you choose to do so, and there are plenty of them to find on the dsh man page. For now, we are going to accept the defaults and have a look at the next file, /etc/dsh/machines.list (for Debian).
For Red Hat based systems you need to create a file called “machines.list” in “/usr/local/etc/” directory.
The syntax here is pretty easy. All one has to do is to enter in a machine’s credentials (Hostname, IP Address, or FQDN) one per line.
Note: When accessing more than one machine simultaneously, it would behove you to set up key-based password-less SSH on all of your machines. Not only does this provide ease of access, but security wise, it hardens your machine as well.
My “/etc/dsh/machines.list” or “/usr/local/etc/machines.list” file says:
Once you have entered in the credentials of the machines you wish to access, let’s run a simple command like `uptime` to all of the machines.
$ dsh –aM –c uptime
172.16.25.125: 05:11:58 up 40 days, 51 min, 0 users, load average: 0.00, 0.01, 0.05 172.16.25.126: 05:11:47 up 13 days, 38 min, 0 users, load average: 0.00, 0.01, 0.05
So what did this command do?
Pretty simple. First, we ran dsh and passed the “–a” option to it, which says to send the “uptime” command to “ALL” of the machines listed in “/etc/dsh/machines.list“.
Next, we specified the “–M” option, which says to return the “machine name” (specified in “/etc/dsh/machines.list“) along with the output of the uptime command. (Very useful for sorting when running a command on a number of machines.)
The “–c” option stands for “command to be executed” in this case, “uptime“.
DSH can also be configured with groups of machines in the “/etc/dsh/groups/” file, where is a file with a list of machines in the same format as the “/etc/dsh/machines.list” file. When running dsh on a group, specify the groupname after the “-g” option.
For Red Hat based systems you need to create a folder called “groups” in “/usr/local/etc/” directory. In that “groups” directory you create a file called “cluster“.
For example, run the “w” command on all machines listed in the “cluster” group file “/etc/dsh/groups/cluster” or “/usr/local/etc/groups/cluster“.
$ dsh –M –g cluster –c w
DSH provides much more flexibility, and this tutorial only scratches the surface. Aside from executing commands, DSH can be used to transfer files, install software, add routes, and much more.
To a Systems Administrator tasked with the responsibility of a large network, it is invaluable.
30 thoughts on “Using DSH (Distributed Shell) to Run Linux Commands Across Multiple Machines”
The -c command does not mean “command to be executed”. According to the manual, it means “concurrent shell”.
–concurrent-shell | -c
Executes shell concurrently.
If you have 1000 servers, It will ask 1000 times to put yes/no to known hosts and for first time to add ssh-key again it will ask 1000 times for password, then what is the use of this???
Then you should go for Pscp tool to achieve the same
Well if you set config for ssh to auto accept new known_hosts and establish pre-shared ssh keys then there’s no prompting at all!
echo “StrictHostKeyChecking no” >> ~/.ssh/config
and then connect to your thousand servers.
They’ll end up in known hosts
and then remove that line from ~/.ssh/config
you can use “StrictHostKeyChecking=no” in your /etc/ssh/sshd.config and restart the sshd and run the dsh command.