Security Advisories (1)
CVE-2026-94140 (2026-10-21)

Rex versions through 1.16.1 for Perl accept an unknown SSH host key for remote rsync transfers because sync hardcodes StrictHostKeyChecking=no. Every remote branch of sync builds its ssh command with that option, for password authentication, for private-key authentication and for the fallback. The ssh options a caller sets through set_openssh_opt reach the OpenSSH transport but not this command, so there is no configuration that restores host key checking for the transfer. An attacker who can redirect the connection before the real host key is known presents their own and the transfer proceeds: under password authentication sync sends the connection password to that server, an upload writes the selected local files to it, and a download writes what it returns to the local destination.

NAME

rex - execute tasks defined in a Rexfile

DESCRIPTION

The rex script can be used to execute tasks defined in a Rexfile from the command line.

SYNOPSIS

rex -h                      # Show usage
rex -T                      # List tasks
rex uname                   # Run the 'uname' task
rex -H server[01..10] uname # Run the 'uname' task on all the specified hosts
rex -G production uname     # Run 'uname' on hosts on the 'production' hostgroup
rex deploy --gracefully     # Pass '--gracefully' to the 'deploy' task

USAGE

rex [<options>] [-H <host>] [-G <group>] <task> [<task-options>]
rex -T[m|y|v] [<string>]

-b     Run batch
-e     Run the given code fragment
-E     Execute a task on the given environment
-G|-g  Execute a task on the given server groups
-H     Execute a task on the given hosts (space delimited)
-z     Execute a task on hosts from this command's output

-K     Public key file for the ssh connection
-P     Private key file for the ssh connection
-p     Password for the ssh connection
-u     Username for the ssh connection

-d     Show debug output
-ddd   Show more debug output (includes profiling output)
-m     Monochrome output: no colors
-o     Output format
-q     Quiet mode: no log output
-qw    Quiet mode: only output warnings and errors
-Q     Really quiet: output nothing

-T     List tasks
-Ta    List all tasks, including hidden
-Tm    List tasks in machine-readable format
-Tv    List tasks verbosely
-Ty    List tasks in YAML format

-c     Turn cache ON
-C     Turn cache OFF
-f     Use this file instead of Rexfile
-F     Force: disregard lock file
-h     Display this help message
-M     Load this module instead of Rexfile
-O     Pass additional options, like CMDB path
-s     Use sudo for every command
-S     Password for sudo
-t     Number of threads to use (aka 'parallelism' param)
-v     Display (R)?ex version

Rexfile

When you run rex it reads the file Rexfile in the current working directory. A Rexfile consists of 2 major parts: configuration and task definitions.

Configuration

See all the available commands in Rex::Commands.

Simple authentication

user 'bruce';
password 'batman';
pass_auth;

Key authentication

private_key '/path/to/your/private/key.file';
public_key '/path/to/your/public/key.file';
key_auth;

Define logging

logging to_file   => 'rex.log';
logging to_syslog => 'local0';

Group your servers

Rex gives you the ability to define groups of servers. Groups can be defined the Rexfile:

group 'frontends' => 'frontend01', 'frontend02', 'frontend[03..09]';

Groups can also be defined in separate files, like server.ini:

# server.ini
[frontends]
frontend[01..04]

# Rexfile
use Rex::Group::Lookup::INI;
groups_file 'file.ini'

See Rex::Group::Lookup::INI for more details, and check the Rex::Group::Lookup namespace for other formats.

Other configuration

timeout 10;    # ssh timeout
parallelism 2; # execute tasks in parallel

Defining tasks

A basic task looks like this:

# task description
desc 'This task tells you how long since the server was rebooted';

# task definition
task 'shortname', sub {
  say run 'uptime';
};

By default it will be targeted at the same host where `rex` is being executed.

You can also set a default server as the task's target:

desc 'This is a long description of a task';
task 'shortname',
  'frontend01',
  sub {
    say run 'uptime';
  };

or even a default server group:

desc 'This is a long description of a task';
task 'shortname',
  group => 'frontends',
  sub {
    say run 'uptime';
  };

The task options from the command line will be passed to the task as well:

# Rexfile
desc 'Get task options';
task 'get_task_options', sub {
  my $task_options = shift;
  my $option1 = $task_options->{option1};
};

# command line
rex get_task_options --option1=yes

TAB COMPLETION

Tab completion scripts are provided for Bash and Zsh in the share directory. They provide completions for the available CLI options, hosts, groups, environments and tasks.