openssh SendEnv/AcceptEnv 可以传递多少个环境变量

openssh SendEnv/AcceptEnv 可以传递多少个环境变量

SendEnv whatever_*我在本地主机上添加了~/.ssh/config,并AcceptEnv LANG LC_* whatever_*在远程主机上添加了 /etc/ssh/sshd_config。

现在,我正尝试使用环境whatever_*环境变量在远程机器上运行一些东西,但似乎存在一个问题:它只导出 128 个变量。

起初我以为某些变量的格式有问题,所以我开始寻找不寻常的变量(值中的空格、奇怪的字符等),以为是解析问题或其他问题,但事实并非如此。

在多台 ubuntu 远程机器上运行下面的脚本得到了同样的结果:128 个导出的变量。env_size_remote值将根据远程机器而变化(例如 ~5300、~4700、~4300 字节),所以我猜这不是大小问题。

for i in {0..150}; do export LC_custom_var_${i}=lc_custom_value_${i}; done

var_num_host=$(printenv | grep LC_ | wc -l)
env_size_host=$(printenv | wc --bytes)

var_num_remote=$(ssh -vvv {user}@{remote_machine} printenv 2> debug.log | grep -c LC_)
env_size_remote=$(ssh {user}@{remote_machine} printenv | wc --bytes)

sent_vars=$(grep -c LC_custom_var debug.log)

echo "Host var num: ${var_num_host}"
echo "Env size host: ${env_size_host}"
echo "Sent vars num: ${sent_vars}"
echo "Remote var num: ${var_num_remote}"
echo "Env size remote: ${env_size_remote}"

脚本输出:

主机变量编号:151
主机环境大小:7994
发送变量编号:151
远程变量编号:128
远程环境大小:5281

可以为 openssh 或类似的东西配置的导出环境变量的最大数量是否有限制?

主机和远程机器都是 Ubuntu Linux(18.04 和 20.04)。尝试从 18 发送到 18,从 18 发送到 20,从 20 发送到 18,每次导出的变量数量都是 128。

编辑:使用详细模式,openssh 报告发送所有自定义变量。我已编辑脚本以显示这一点。

答案1

OpenSSH是最广泛使用的 SSH 软件。OpenSSHsshd程序负责处理 ssh 连接的服务器部分,它对客户端打开的会话设置了 128 个环境变量的硬编码限制。该限制在session_env_req()名为会话.c

/* Don't set too many environment variables */
if (s->num_env > 128) {
    debug2("Ignoring env request %s: too many env vars", name);
    goto fail;
}

绕过该限制的最简单方法是sshd从源代码构建自己的副本(如果您知道如何做的话)。OpenSSH 是开源(或者 (这里))。

您可以通过将环境变量作为执行命令的一部分传递来解决此限制。尝试运行以下命令:

ssh -vvv {user}@{remote_machine} 'FOO=foo BAR=bar ... printenv'

大多数 shell 会将其解释为在命令运行期间设置 FOO 和 BAR 环境变量。您应该能够通过这种方式设置相当多的变量。

相关内容