停止从客户端打印motdloginsshlogin?

我有SSH无密码设置,但它login时打印MoTD。是否有任何阻止发生在客户端?

我已经尝试过ssh -q但是这不起作用。 我不想使用~/.hushlogin也不想更改服务器设置。 唯一可以工作的是使用>/dev/null 2>&1来清除所有的输出。 但是,如果实际存在问题,我不想忽略错误。 即使做>/dev/null也不行,因为ssh好像把motd打印到stderr。

更新和推理我在cron中运行备份。 除非发生错误,否则我不想收到cron电子邮件。 但是,如果motd打印,我会一直收到一封电子邮件。

我想保留这个动机,因为这有法律意义。 motd说“禁止访问禁止访问”。 你需要在那里有这样的声明来合法地阻止人们访问它(就像一个没有侵入的标志)。 因此,我不想总是禁用它。

我不知道为什么你厌恶这样做正确 – 无论是在服务器上

 PrintMotd no PrintLastLog no 

 #/etc/pam.d/ssh # Print the message of the day upon successful login. # session optional pam_motd.so 

或者为每个用户添加〜/ .hushlogin。

提示,对于〜/ .hushlogin,将其添加到/ etc / skel中,以便使用该文件创build新的用户主目录。

更新:

如果没有关于备份cron作业的更多信息,我唯一的build议是将命令的输出redirect到一个文件(或让cron在电子邮件中捕获它),并将ssh会话的输出redirect到/ dev / null。 就像是:

 0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null 

要么

 0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null 

我不得不稍微玩一下这些命令,但是这会让你开始。

如果你想在每个用户的基础上,只要touch ~/.hushlogin ,你都设置了OpenSSH。

更新 :正如别处指出的, pam_motd可能被configuration为不使用每个用户.hushlogin ; 检查HUSHLOGIN_FILE /etc/login.defs 。 它可能被configuration为在/etc/hushlogins或类似列表中列出所有用户。

玛丽评论后更新:

这个黑客怎么样? ;-P

 ssh -t user@machineName '/bin/bash' 

以下是无效的:传递-T到ssh禁用tty分配似乎是做的(但也许你需要的tty)。 ssh -T machineName'echo foo'

@note所有的例子都假设你已经设置了一个variablesconnectionString ,像connectionString=user@server

使用ssh -T应该适用于简单的命令。 例如,这不会打印任何额外的信息:

 ssh -T $connectionString "echo 'blah'" 

问题是,当你尝试使用here-doc来运行许多命令。 例如 – 波纹pipe将不起作用 – 它会回应当天的消息(MoTD),也可能会告诉你“stdin:不是一个tty”。

 somethingLocal='something local' ssh -T $connectionString <<EOC echo 'blah' echo "blah $somethingLocal" EOC 

要解决这个问题,您需要首先将命令保存到本地variables并将其发送到远程服务器。

 somethingLocal='something local' read -r -d '' commands <<EOC echo 'blah' echo "blah $somethingLocal" EOC ssh -T $connectionString "$commands" 

但是这很乱

最终解决scheme

创build一个通用函数(注意,它可以使用string或HEREDOC作为命令)。

 function silentSsh { local connectionString="$1" local commands="$2" if [ -z "$commands" ]; then commands=`cat` fi ssh -T $connectionString "$commands" } 

例子

像这样使用:

 somethingLocal='something local' silentSsh $connectionString <<EOC echo 'blah' echo "blah $somethingLocal" EOC 

或者像这样:

 silentSsh $connectionString "echo 'blah'" 

或者像这样:

 silentSsh $connectionString <<'EOC' echo 'blah' somethingRemote=`echo 'whatever'` echo "blah $somethingRemote" EOC 

甚至如此:

 silentSsh $connectionString < getlines.sh 

这是什么操作系统? 在某些系统(如Ubuntu)中,motd不是由ssh服务器(/ etc / ssh / sshd_config中的PrintMotd)打印的,而是由pam和pam_motd打印的。 如果是这种情况,那么你可能无法从客户端控制它。

您必须在服务器上执行此操作:

 PrintMotd no PrintLastLog no 

在debian / ubtuntu上也加上了pam_motd.so:

 #/etc/pam.d/ssh # Print the message of the day upon successful login. # session optional pam_motd.so 

不要直接用cron执行ssh命令。

build立一个帮助bash脚本 ,执行ssh作业并获取输出,错误和错误代码(如果需要的话); 最后parsing它们以从错误消息中删除不需要的string(在您的案例中为MoTD),然后在bash脚本输出和错误stream中重新打印您以这种方式获得的内容。

比把这个bash脚本放在cron中,活得快乐:)

注意:这是一个通用的解决scheme,必须通过ssh执行任何你需要执行的工作。 它也只是客户端,它应该满足您的需求…客户端在服务器configuration上的唯一依赖是您要从std err或ssh客户端中删除的确切消息的知识

只是一个旁注(如果我可以发表的话,将会是一个评论): 成功login到系统之后显示motd的内容。 如果我想从法律上阻止人们访问一个盒子,我宁愿用sshd_config中的“Banner”来做。 input用户名后,内容显示在validation之前。

要么你没有尝试你所描述的,或者你的服务器configuration错误!

以下是我在RHEL5上尝试的内容:

 workstation ~ $ ssh root@server server ~ # echo "MOTD" > /etc/motd server ~ # ^D workstation ~ $ ssh root@server MOTD server ~ # ^D workstation ~ $ ssh root@server echo notice the lack of motd notice the lack of motd workstation ~ $ 

我不认为你需要将免责声明发送给非交互式shell,是吗? (如果有人声称你这样做,请帮我一个忙,把它们踢出去。)因为这就是为什么交互式shell和非交互式shell有区别的原因。

但无论如何,这是我做的,因为我不喜欢从cron的邮件:我pipe输出到logging器。 只要通过尾巴pipe道删除你的毫无意义的免责声明(未经testing的代码,我没有访问我的脚本)的前几句话(比方说3):

 ( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 & exec 2>&6 cron_fsckin_job 

如果我了解你,你需要其他的理由,但不需要motd备份。 在sshd的configuration中,无法全局设置。 所以你需要在客户端解决motd压抑。 但motd的文本和备份软件的错误信息没有区别。 两者都是terminal中的文字。 我所看到的唯一的解决办法是在这两条消息之间做出区别,然后过滤motd的一个。 因为软件的信息很难修改,所以我build议修改motd的文本。 例如放一个框架:

 *** BEGIN message from the machine room *** motd message *** END message from the machine room *** 

那么你应该过滤出框架之间的文本,并放下它。

解决scheme在这里:

如果你不负责服务器,你不能改变motd或sshdconfiguration,请使用如下命令:

将STDERRredirect到STDOUT以获得远程命令,以便您可以看到它。 然后将ssh的STDERRredirect到/ dev / null。 MOTD进入STERR,并以/ dev / null结尾。 将显示远程命令的任何标准的AND错误消息(当它进入STDOUT)

变种1 – 如果您关心远程执行命令的退出状态:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

变种2 – 如果你想忽略远程命令的退出代码 – 只要执行最后的远程命令为true

ssh remotehost "(remote_command ; true ) 2>&1" 2>/dev/null || echo SSH connection failed

错误消息的示例:

例1:

 ssh remotehost“ failed_ remote_command 2>&1”2> / dev / null ||  echo SSH连接失败或远程命令返回非零退出代码
 bash:failed_remote_command:找不到命令 
  SSH连接或远程命令失败 - 其中任何一个都返回非零退出码127

例2:

 ssh remotehost“ failed_ remote_command 2>&1; true ”2> / dev / null ||  echo SSH连接失败
 bash:failed_remote_command:找不到命令

实例3a:

 ssh remotehost“ failed_ remote_command 2>&1; true”2> / dev / null ||  echo SSH连接失败
 #没有消息显示

例3b:

 ssh nonexistinghostfailed_ remote_command 2>&1; true”2> / dev / null ||  echo SSH连接失败
 SSH连接失败

你有没有尝试删除MOTD文件中的文字? 只是一个想法。

 Hint: /etc/motd 

你想做什么?为什么MoTD会打扰你? 我在猜测执行远程命令并parsing输出? 如果是这样,这可以通过多种方式完成,而不需要调用交互式shell(这会导致motd被显示)。