【发布时间】:2016-03-17 16:17:57
【问题描述】:
我有一个在每次 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 服务未在调试模式下运行,我已从 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,我能够禁用紧接在变量之前出现的“上次登录”信息,并且我还将 PrintMotd 设置为 no。我从不打印变量的服务器上尝试了另一个 sshd 二进制文件,并且该二进制文件也打印了变量。所以我知道这不是 sshd 二进制文件本身,而是服务器上的一些配置。我只是不知道还有什么可以打印这些变量。
如果它有帮助,当我直接从另一个节点的 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 $1 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)
$0 stop
$0 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: $0 [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。我不知道这两个程序如何使用相同的变量/地址空间,但我使用 gdb 单步执行了代码,发现 apparmor 和 sshd 对它们的 debug_flags 使用了相同的地址。也许这个问题已经在更高版本的 apparmor 或 sshd 中得到解决。
【问题讨论】:
-
请,如果您认为这个问题已解决,请选择我的答案,这样它就不会出现未回答的问题。
-
Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?。
标签: variables ssh environment suse sshd