diff --git a/src/color_ssh/color_ssh.py b/src/color_ssh/color_ssh.py
index 20f7651..f8d82d8 100644
--- a/src/color_ssh/color_ssh.py
+++ b/src/color_ssh/color_ssh.py
@@ -5,8 +5,8 @@ import io
 import shlex
 import subprocess
 from optparse import OptionParser
-from color_ssh.util.util import *
 from multiprocessing.pool import Pool
+from color_ssh.util.util import *
 
 __all__ = []
 
@@ -52,6 +52,10 @@ class Setting(object):
             '-p', '--par', dest='parallelism', default=self.DEFAULT_PARALLELISM, type='int', metavar='PAR',
             help='max number of parallel threads (default: %d)' % self.DEFAULT_PARALLELISM
         )
+        parser.add_option(
+            '--distribute', dest='distribute', default=None, type='string', metavar='PREFIX',
+            help='split and distribute command-line arguments to each host'
+        )
 
         option, args = parser.parse_args(argv[1:])
         hosts = self._load_hosts(option.host_file) + (option.host_string.split() if option.host_string else [])
@@ -64,11 +68,16 @@ class Setting(object):
 
         if not hosts:
             hosts = args[:1]
-            command = args[1:]
+            del args[0]
+
+        # distribute args
+        if option.distribute:
+            dist_prefix = shlex.split(option.distribute)
+            d = distribute(len(hosts), args)
+            tasks = [(option.label or self._extract_label(host),
+                      prefix + [host] + dist_prefix + d[i]) for i, host in enumerate(hosts) if d[i]]
         else:
-            command = args
-
-        tasks = [(option.label or self._extract_label(host), prefix + [host] + command) for host in hosts]
+            tasks = [(option.label or self._extract_label(host), prefix + [host] + args) for host in hosts]
 
         self.parallelism = option.parallelism
         self.tasks = tasks
diff --git a/src/color_ssh/util/util.py b/src/color_ssh/util/util.py
index 9273954..e1cdb8a 100644
--- a/src/color_ssh/util/util.py
+++ b/src/color_ssh/util/util.py
@@ -3,7 +3,7 @@ from __future__ import division, print_function, absolute_import, unicode_litera
 import sys
 import os
 
-__all__ = ['PY3', 'arg2bytes', 'io2bytes']
+__all__ = ['PY3', 'arg2bytes', 'io2bytes', 'distribute']
 
 PY3 = sys.version_info >= (3,)
 
@@ -14,3 +14,26 @@ def arg2bytes(arg):
 
 def io2bytes(fd):
     return fd.buffer if hasattr(fd, 'buffer') else fd
+
+
+def distribute(num_workers, tasks):
+    """
+    Split tasks and distribute to each worker.
+
+    :param num_workers: int
+    :param tasks: list
+    :return: [[task]] (list of the list of tasks)
+    """
+    assert 0 <= num_workers, 'num_workers must be non-negative integer.'
+
+    ret = []
+    if num_workers == 0:
+        return ret
+
+    quotient, extra = divmod(len(tasks), num_workers)
+    j = 0
+    for i in range(num_workers):
+        k = quotient + (1 if i < extra else 0)
+        ret.append(tasks[j:j + k])
+        j += k
+    return ret

distribute option
diff --git a/tests/color_ssh/test_color_ssh.py b/tests/color_ssh/test_color_ssh.py
index b5c4ba7..67684f8 100644
--- a/tests/color_ssh/test_color_ssh.py
+++ b/tests/color_ssh/test_color_ssh.py
@@ -88,6 +88,13 @@ class TestSetting(TestCase):
 
         # parallelism
         self.assertEqual(self._parse(['-H', 'server-11 root@server-12', '-p3', 'pwd']).parallelism, 3)
+        self.assertEqual(self._parse(['-H', 'server-11 root@server-12', '--par', '15', 'pwd']).parallelism, 15)
+
+        # distribute
+        self._check(self._parse(['-H', 'server-11 root@server-12', '--distribute', 'echo "foo bar"', 'x', 'y', 'z']), [
+            ('server-11', ['ssh', 'server-11', 'echo', 'foo bar', 'x', 'y']),
+            ('server-12', ['ssh', 'root@server-12', 'echo', 'foo bar', 'z']),
+        ])
 
     def test_parse_args_error(self):
         with self.withBytesOutput() as (out, err):
@@ -139,8 +146,10 @@ class TestMain(TestCase):
             out.seek(0)
             err.seek(0)
 
-            self.assertEqual(out.read(), (f(b'abc') + f(b'foo') + f('あいうえお'.encode('utf-8')) + f(b'\xff\xfe')) * 2)
-            self.assertEqual(err.read(), (g(b'def') + g(b'bar') + g('かきくけこ'.encode('utf-8')) + g(b'\xfd\xfc')) * 2)
+            self.assertEqual(sorted(out.read()),
+                             sorted((f(b'abc') + f(b'foo') + f('あいうえお'.encode('utf-8')) + f(b'\xff\xfe')) * 2))
+            self.assertEqual(sorted(err.read()),
+                             sorted((g(b'def') + g(b'bar') + g('かきくけこ'.encode('utf-8')) + g(b'\xfd\xfc')) * 2))
 
     def test_main_load_error(self):
         with self.__with_temp_output() as (out, err):
diff --git a/tests/util/__init__.py b/tests/util/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/util/test_util.py b/tests/util/test_util.py
new file mode 100644
index 0000000..291a4a7
--- /dev/null
+++ b/tests/util/test_util.py
@@ -0,0 +1,28 @@
+from __future__ import division, print_function, absolute_import, unicode_literals
+
+from mog_commons.unittest import TestCase
+from color_ssh.util.util import distribute
+
+
+class TestUtil(TestCase):
+    def test_distribute(self):
+        self.assertEqual(distribute(0, []), [])
+        self.assertEqual(distribute(0, ['a']), [])
+        self.assertEqual(distribute(1, []), [[]])
+        self.assertEqual(distribute(1, ['a']), [['a']])
+        self.assertEqual(distribute(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']),
+                         [['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']])
+        self.assertEqual(distribute(2, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']),
+                         [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h']])
+        self.assertEqual(distribute(3, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']),
+                         [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']])
+        self.assertEqual(distribute(5, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']),
+                         [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g'], ['h']])
+        self.assertEqual(distribute(5, ['a', 'b', 'c', 'd']),
+                         [['a'], ['b'], ['c'], ['d'], []])
+
+        xs = distribute(12345, range(200000))
+        self.assertEqual(sum(map(sum, xs)), 200000 * (200000 - 1) / 2)
+
+    def test_distribute_error(self):
+        self.assertRaises(AssertionError, distribute, -1, [])

pip install -e .
parse_log_pytest
pytest
six mog-commons pytest
apt-get update apt-get install -y gcc
3.5
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
-e git+https://github.com/mogproject/color-ssh.git@cdcbb8980f7a4e49797192dc089915d702322460#egg=color_ssh
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.0.3
MarkupSafe==2.0.1
mog-commons==0.2.3
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: color-ssh
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mog-commons==0.2.3
      - six==1.17.0
prefix: /opt/conda/envs/color-ssh

tests/color_ssh/test_color_ssh.py::TestSetting::test_parse_args tests/color_ssh/test_color_ssh.py::TestSetting::test_parse_args_error tests/color_ssh/test_color_ssh.py::TestMain::test_main_load_error tests/color_ssh/test_color_ssh.py::TestMain::test_main_multi_proc tests/color_ssh/test_color_ssh.py::TestMain::test_main_single_proc tests/color_ssh/test_color_ssh.py::TestMain::test_main_task_error tests/util/test_util.py::TestUtil::test_distribute tests/util/test_util.py::TestUtil::test_distribute_error
src/color_ssh/color_ssh.py src/color_ssh/util/util.py
src/color_ssh/color_ssh.py src/color_ssh/util/util.py