Stop ssh login from printing motd from the client?
Solution 1:
I'm not sure why you have an aversion to doing this correctly - either on the server a la
PrintMotd no
PrintLastLog no
and
#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session optional pam_motd.so
Or adding ~/.hushlogin for each user.
Hint, for ~/.hushlogin, add it to /etc/skel so new user home directories are created with the file.
Update:
Without more information about your backup cron job, my only other suggestion is to redirect the output of the command to a file (or let cron capture it in email) and the output of the ssh session to /dev/null. Something like:
0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null
Or
0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null
I'd have to play around with the commands a bit, but that should get you started.
Solution 2:
If you want this on a per-user basis, just do a touch ~/.hushlogin
and you're all set with OpenSSH.
Update: As pointed out elsewhere, pam_motd
may be configured to not use a per-user .hushlogin
; check /etc/login.defs
for HUSHLOGIN_FILE
. It may be configured to have all users listed in /etc/hushlogins
or similar.
Solution 3:
@note All examples assume you've set a variable connectionString
with something like connectionString=user@server
.
How I got to the solution
Using ssh -T
should work for simple commands. For example this doesn't print any extra information:
ssh -T $connectionString "echo 'blah'"
The problem is when you try to use here-doc to run many commands. For example - bellow will NOT work - it will echo message of the day (MoTD) and also might show you "stdin: is not a tty".
somethingLocal='something local'
ssh -T $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
To workaround the issue you need first save commands to local variable and the send them to remote server.
somethingLocal='something local'
read -r -d '' commands <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"
But that's messy...
Final solution
Make a universal function (note that it can take a string or HEREDOC as commands).
function silentSsh {
local connectionString="$1"
local commands="$2"
if [ -z "$commands" ]; then
commands=`cat`
fi
ssh -T $connectionString "$commands"
}
Examples
Use this like so:
somethingLocal='something local'
silentSsh $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
Or like so:
silentSsh $connectionString "echo 'blah'"
Or like so:
silentSsh $connectionString <<'EOC'
echo 'blah'
somethingRemote=`echo 'whatever'`
echo "blah $somethingRemote"
EOC
Or even like so:
silentSsh $connectionString < getlines.sh
Solution 4:
How about this hack? ;-P
ssh -t user@machineName '/bin/bash'
The following is not valid:
Passing -T
to ssh to disable tty allocation:
ssh -T machineName 'echo foo'
Solution 5:
What operating system is this? On some systems (like ubuntu) the motd isn't printed by the ssh server (PrintMotd in /etc/ssh/sshd_config), but by pam with pam_motd. If this is the case then you probably can't control it from the client.