psh — run a command on or copy a file to multiple nodes.


psh [ OPTIONS ] [ command [ args ] ]

psh [ OPTIONS ] [ -s ] [ files | directories ]


psh runs a command on all or a group of nodes. The output of each command is parsed and common parts are only shown once.

With the option -s or -sync, one or more file(s) and/or entire directories (including subdirectories) are synchronized (copied) to the selected nodes.

Global options

-c, -configfile file

Define a group and a configuration file to use. The file is looked up in the current directory.

-g, -group group

Use nodes and other parameters in group group, defined in the configuration file ~/.psh.d/group. This is short for of -c ~/.psh.d/group.

-n, -node nodelist

Add nodes nodelist to the list of nodes.

-x, -xnode nodelist

Exclude nodes nodelist from the list of nodes.

-rcmd command

Use command command to start up a remote command. Command could be pssh (default), rsh or ssh.

-diff command

Use command command to parse and compare the command output. Default is diff -q.

-autocd path

Change to directory path on each node before running the command or copying the file. Default is ${PWD/${HOME}/~}. Use an empty path ("") to disable changing to a directory first.


Be verbose.


Show a help message.

Without option -g or option -c, a default file named like the current hostname, the current hostname without trailing numerical characters ([0-9]*), or default (in this order) within ~/.psh.d/ is used. If none of this files is found, an empty template file ~/.psh.d/default is created. This file may be modified to fit your needs!

Nodelist is a comma separated list of node names. The list can be abbreviated to node-[from-to], e.g. node-[003-115,001] will be expanded to node-001, node-003, node-004, ..., node-115.


This example shows a configuration file ~/.psh.d/rack1 defining nodes node-01 up to node-16 within rack number 1:

  ## psh defaults for rack 1
  ## uncomment all options you need...

  ## default nodelist:
  # node nodename[01-16]
  node node-[01-16]

  ## default remote command:
  # rcmd ssh -x

  ## don't start more than 1 remote shell at the same time?
  # max 1

  ## be always verbose ?
  # verbose 

To see the uptime of all nodes in rack 1, execute

  # psh -g rack1 uptime

In order to compare the current date on all nodes, run date on all nodes:

  # psh date
  === node-[01-04,06-16]
  Mon Jul 18 12:45:17 CEST 2005
  === node-05
  Mon Jul 18 12:45:18 CEST 2005

To calculate and compare the md5sum of all Linux kernels on all but node node-03, execute:

  # psh -x node-03 md5sum /boot/vmlinux
  === node-[01,02,04,06-16]
  c9c0728c41ca03a9ee9982869e28216e  /boot/vmlinuz
  === node-05
  ff62b57a078f1f8244796c5609a053e8  /boot/vmlinuz

To copy the file /etc/hosts to all nodes, execute:

  # psh -sync /etc/hosts
  Prepare files for distribution:
  /tmp/pshout.1235 /etc/hosts
  Continue (y/n)?[n] 

(Presuming a suitable configuration file within ~/.psh.d is found.)


The local file /etc/hosts is also replaced by a copy of this file.

To copy the file /etc/hosts to all but the local node, execute:

  # psh -s -x `hostname` /etc/hosts
  Prepare files for distribution:
  /tmp/pshout.1236 /etc/hosts
  Continue (y/n)?[n] 



Configuration files for different groups.

See also

pssh(8) and psmstart(8).