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
或附加到命令行的其他环境变量是如何定义的。
我有一个服务器在每次 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
或附加到命令行的其他环境变量是如何定义的。