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 环境变量。您应该能够通过这种方式设置相当多的变量。