1

This is kind of related to What defines the maximum size for a command single argument?. But it is about the shell itself.

I want to know what defines the maximum size or string length of an command used via ssh. Example would be $ ssh user@remote "echo very big command".

I found some scripts simply testing it via trail and error. But I assume there is a better way. But first I would like to understand what defines that maximum length of the string.

Here is an example on how I trigger errors about the max length:

Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen
>>> Popen(['ssh', 'user@localhost', 'echo', '{}'.format('T' * 500000)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 7] Argument list too long: 'ssh'

The limit on my system (Debian 11 on ARM64hf) starts round about 131067 characters (excluding the starting ssh, echo, etc). But getconf ARG_MAX is much higher 2097152.

buhtz
  • 777
  • 1
  • 10
  • 22
  • 1
    There is nothing special about your local `ssh` command. It, too, must be executed by an `exec()` function and adhere to the same restrictions as any other command. The answers to the question that you link to seems to answer your question here. – Kusalananda Nov 14 '22 at 11:59
  • You are right. I can reproduce the problem when using `echo` local without `ssh`. But then what is `ARG_MAX` about which is much higher? – buhtz Nov 14 '22 at 12:02
  • 1
    I did a google search for "`getconf ARG_MAX`" and this blog post was the 3rd listing: https://mina86.com/2021/the-real-arg-max-part-1/ I don't know how correct it is, but it seems to answer your question about the difference between the size of the shell's limit on an individual command-line argument and the size of exec() that's governed by ARG_MAX. – Sotto Voce Nov 14 '22 at 16:29

0 Answers0