sshd 在每个 ssh 会话开始时打印环境变量

sshd prints environment variables at start of every ssh session

我有一个服务器在每次 ssh 登录后打印几个环境变量,我需要禁用该打印。例如

server2:~ # ssh root@server1
This is the banner.  It resides in /etc/banner
Password:
Environment:
  USER=root
  LOGNAME=root
  HOME=/root
  PATH=/usr/bin:/bin:/usr/sbin:/sbin
  MAIL=/var/mail/root
  SHELL=/bin/bash
  SSH_CLIENT=192.168.0.3 57287 22
  SSH_CONNECTION=192.168.0.3 57287 192.168.0.1 22
  SSH_TTY=/dev/pts/3
  TERM=xterm
server1:~ #

变量的打印不是由横幅完成的。我添加了一个横幅,看到它的打印输出发生在输入密码之前,而变量是在输入密码之后打印的。 sshd 服务未在调试模式下 运行ning,我已从 ps -aux | 确认了这一点。 grep sshd.

server1:~ # ps aux | grep sshd
root       647  0.0  0.0   3844   340 ?        Ss   16:33   0:00 monitord: sshd
root       648  0.0  0.0  53996  2568 ?        S    16:33   0:01 /usr/sbin/sshd -D
root       650  0.0  0.0   3844   336 ?        Ss   16:33   0:00 monitord: sshd_internal                                                    
root       651  0.0  0.0  53996  2544 ?        S    16:33   0:00 /usr/sbin/sshd -D -f /etc/ssh/sshd_config_internal

没有可以执行此操作的 /root/.ssh/ 文件:

server1:~ # ls -a /root/.ssh
.  ..  authorized_keys  id_rsa  id_rsa.pub  known_hosts

而且我在 /etc/ssh/sshd_config 文件中没有发现任何我认为会影响它的内容。通过将 PrintLastLog 设置为 no,我能够禁用紧接在变量之前出现的 "Last login" 信息,并且我还将 PrintMotd 设置为 no。我已经从不打印变量的服务器尝试了另一个 sshd 二进制文件,并且该二进制文件也打印了变量。所以我知道这不是 sshd 二进制文件本身,而是服务器上的一些配置。我只是不知道还有什么可以打印这些变量。

如果它是 helps,当我从另一个节点直接从 ssh 运行 命令时,命令的打印输出发生在变量之后。例如

server2:~ # ssh server1 ls
This is a test.  I reside in /root/testBanner
Password:
Environment:
  USER=root
  LOGNAME=root
  HOME=/root
  PATH=/usr/bin:/bin:/usr/sbin:/sbin
  MAIL=/var/mail/root
  SHELL=/bin/bash
  SSH_CLIENT=192.168.0.3 57335 8022
  SSH_CONNECTION=192.168.0.3 57335 192.168.0.1 8022
file1
file2    <---- output of ssh command "ls" occurs after variables
file3
server2:~ #

我什至尝试创建一个新用户,没有 ~/.bashrc ~/.profile 等配置文件,当以该用户身份进行 ssh 时,它也会显示变量。

此外,我 运行正在使用 SUSE 11

server1:~ # cat /etc/SuSE-release
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1

SSHD 版本:

OpenSSH_5.1p1, OpenSSL 0.9.8j-fips 07 Jan 2009

这是初始化脚本

# cat /etc/init.d/sshd
#!/bin/bash
#
# /etc/init.d/lde-sshd: start/stop ssh daemon
#

### BEGIN INIT INFO
# Provides:       sshd
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Should-Start: lde
# Default-Start:  3
# Default-Stop:
# Description:    Secure shell deamon
### END INIT INFO

. /usr/lib/lde/lde.functions

check_node_type control payload detached standalone

lde_init_status_init lde-sshd

ADDITIONAL=$(
cd /etc/ssh/
shopt -s nullglob
for i in sshd_config_*; do
        echo ${i#sshd_config_};
done
)

case  in
        start)
                echo -n "Starting SSH daemon "
                if ! /usr/bin/monitord -n sshd -c "/usr/sbin/sshd -D"; then
                        panic "Failed to start SSH daemon"
                fi
                lde_init_status_start $?
                for i in $ADDITIONAL; do
                        echo -n "Starting $i SSH daemon "
                        if ! /usr/bin/monitord -n sshd_$i -c "/usr/sbin/sshd -D -f /etc/ssh/sshd_config_$i"; then
                                panic "Failed to start $i SSH daemon"
                        fi
                        lde_init_status_start $?
                done
                ;;
        stop)
                echo -n "Stopping SSH daemon "
                /usr/bin/monitord -n sshd -k
                lde_init_status_stop $?
                for i in $ADDITIONAL; do
                        echo -n "Stopping $i SSH daemon "
                        /usr/bin/monitord -n sshd_$i -k
                        lde_init_status_stop $?
                done
                ;;
        restart)
                [=16=] stop
                [=16=] start
                lde_init_status_silent $?
                ;;
        status)
                echo -n "Checking SSH daemon "
                lde_init_srv_status_check /usr/bin/monitord -n sshd -s
                for i in $ADDITIONAL; do
                        echo -n "Checking $i SSH daemon "
                        lde_init_srv_status_check /usr/bin/monitord -n sshd_$i -s
                done
                ;;
        *)
                echo "usage: [=16=] [start|stop|restart|status]"
                lde_init_error_unknown_option
                ;;
esac

lde_init_status_report

# End of file

正如下面所评论的,我发现问题出在 apparmor 使用相同的变量 (debug_flag) 并将 sshd 的 debug_flag 设置为 1 时,它将自己的 debug_flag 设置为 1。我不知道这两个程序如何使用相同的 variable/address space,但我使用 gdb 逐步查看了代码,发现 apparmor 和 sshd 为它们的 [=40= 使用了相同的地址]s。 Perhaps这个问题已经在更高版本的 apparmor 或 sshd 中得到解决。

这意味着服务器 运行 处于调试模式。查看初始化脚本或 systemd 单元或您的 Suse 使用的任何内容并删除 -d 选项。

服务应该从这些选项开始(来自 Fedora):

/usr/sbin/sshd -D $OPTIONS

还要确保您的 $OPTIONS 或附加到命令行的其他环境变量是如何定义的。