У меня установлен SSH без пароля, однако он печатает 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, чтобы новые домашние каталоги пользователей создавались вместе с файлом.
Без дополнительной информации о задании резервного копирования cron я могу предложить только одно: перенаправить вывод команды в файл (или позволить cron перехватить его в электронной почте) и вывод сеанса ssh в/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
может быть настроено так, чтобы не использовать пользователя .hushlogin
; чек об оплате /etc/login.defs
за HUSHLOGIN_FILE
. Может быть настроено, чтобы все пользователи были перечислены в /etc/hushlogins
или похожие.
@note Все примеры предполагают, что вы установили переменную connectionString
с чем-то вроде [email protected]
.
Как я дошел до решения
С помощью ssh -T
должно работать для простых команд. Например, это не выводит дополнительную информацию:
ssh -T $connectionString "echo 'blah'"
Проблема в том, что вы пытаетесь использовать здесь-документ для запуска многих команд. Например - ниже не будет работать - он будет отображать сообщение дня (MoTD), а также может показать вам "stdin: не является tty".
somethingLocal='something local'
ssh -T $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
Чтобы обойти проблему, необходимо сначала сохранить команды в локальной переменной и отправить их на удаленный сервер.
somethingLocal='something local'
read -r -d '' commands <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"
Но это грязно ...
Окончательное решение
Сделайте универсальную функцию (обратите внимание, что она может принимать строку или 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
Как насчет этого взломать? ;-П
ssh -t [email protected] '/bin/bash'
Следующее не действительно:
Проходя -T
в ssh, чтобы отключить распределение tty:
ssh -T machineName 'echo foo'
Что это за операционная система? В некоторых системах (например, в Ubuntu) motd печатается не сервером ssh (PrintMotd в/etc/ssh/sshd_config), а pam с помощью pam_motd. Если это так, то вы, вероятно, не можете контролировать это с клиента.
Не выполняйте команду ssh напрямую cron.
создайте вспомогательный скрипт bash вместо этого, выполняя задание ssh и извлекая выходные данные, ошибки и код ошибки, если необходимо; в конечном итоге проанализируйте их, чтобы удалить ненужные строки из сообщений об ошибках (MoTD в вашем случае), а затем повторно распечатайте выходные данные скрипта bash и потоки ошибок, которые вы получили таким образом.
Чем положить этот скрипт в Cron и жить счастливым :)
Примечание: Это общее решение, и оно должно работать независимо от того, какую работу вы должны выполнять через ssh. Только клиентская сторона должна отвечать вашим потребностям ... единственная зависимость клиента от конфигурации сервера - это знание точного сообщения, которое вы хотите вырезать из std err или из ssh клиента
Вы должны сделать это на сервере:
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
Либо вы не пробовали то, что описали, либо ваши серверы настроены неправильно!
Вот что я только что попробовал на RHEL5:
workstation ~ $ ssh [email protected]
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh [email protected]
MOTD
server ~ # ^D
workstation ~ $ ssh [email protected] echo notice the lack of motd
notice the lack of motd
workstation ~ $
Я не думаю, что вам нужно, чтобы заявление об отказе было отправлено в неинтерактивные оболочки, не так ли? (Если кто-то заявляет, что вы это делаете, сделайте мне одолжение, пните их до безумия.) Потому что именно поэтому существует различие между интерактивными оболочками и неинтерактивными.
Но в любом случае вот что я делаю, потому что мне не нравится почта от cron: я передаю вывод в logger. Просто протяните его через tail, чтобы удалить первые несколько (скажем, 3) строк вашего бессмысленного отказа от ответственности как такового (непроверенный код, у меня нет доступа к моим сценариям):
( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
РЕШЕНИЕ ЗДЕСЬ:
Если вы не отвечаете за сервер и не можете изменить конфигурацию motd или sshd, используйте команду, подобную следующей:
Перенаправьте STDERR в STDOUT для удаленной команды, чтобы вы ее увидели. А затем перенаправить STDERR из ssh в/dev/null. MOTD переходит в STERR и заканчивается в/dev/null. Любое стандартное сообщение об ошибке И от удаленной команды будет показано (как оно идет к 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 "не смогли_remote_command 2> & 1 "2>/dev/null || echo SSH-соединение не выполнено или удаленная команда вернула ненулевой код выхода bash: failed_remote_command: команда не найдена Соединение SSH или удаленная команда не выполнены - любой из них возвратил ненулевой код выхода 127
Пример 2:
ssh remotehost "не смогли_remote_command 2> & 1; правда"2>/dev/null || echo SSH соединение не удалось bash: failed_remote_command: команда не найдена
Пример 3а:
ssh remotehost "не смогли_remote_command 2> & 1; true "2>/dev/null || echo SSH соединение не удалось # сообщение не отображается
Пример 3б:
SSH nonexistinghost "не смогли_remote_command 2> & 1; true "2>/dev/null || echo SSH соединение не удалось Сбой соединения SSH
Если я вас понимаю, вам нужен motd по другим причинам, но не нужен motd для резервного копирования. В конфиге sshd нельзя настроить его только на глобальном уровне. Поэтому вам необходимо решить проблему подавления MOTD на стороне клиента. Но нет разницы между текстом motd и сообщениями об ошибках программы резервного копирования. Оба текста в терминале. Единственное решение, которое я вижу, чтобы сделать различие между этими двумя сообщениями, а затем отфильтровать сообщение motd. Поскольку сообщения программного обеспечения трудно изменить, я предлагаю изменить текст MOTD. Например, поместите рамку вокруг:
*** BEGIN message from the machine room ***
motd message
*** END message from the machine room ***
Затем вы должны отфильтровать текст между рамкой и опустить его.
Вы пытались удалить текст в файле MOTD? Просто мысль.
Hint: /etc/motd
Что вы пытаетесь сделать и почему МТД беспокоит вас? Я предполагаю выполнение удаленной команды и анализ выходных данных? Если это так, это можно сделать различными способами, не вызывая интерактивную оболочку (что приводит к отображению motd).
Вы пробовали использовать конфигурацию подсистемы ssh? Вы можете найти пример по адресу http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm , который даже включает резервное копирование файлов.