Прекратить ssh логин от печати MOTD с клиента?
У меня настроен SSH без пароля, однако он печатает MoTD при входе в систему. Есть ли способ остановить это на стороне клиента?
я пробовал ssh -q
но это не работает Я не хочу использовать ~/.hushlogin
и при этом я не хочу изменять настройку сервера. Единственное, что может работать, это успокоить весь вывод, с >/dev/null 2>&1
, Однако я не хочу игнорировать ошибки в случае, если на самом деле есть проблема. Даже делать >/dev/null
не работает, так как ssh
кажется, чтобы распечатать MOTD к Stderr.
Обновление и рассуждения Я запускаю резервное копирование в cron. Я не хочу получать электронную почту cron, если не произошла ошибка. Однако, если MOTD напечатан, я буду получать электронную почту все время.
Я хочу сохранить печать MOTD, потому что это имеет юридические последствия. Мотд говорит "неавторизованный доступ запрещен". Вы должны иметь такого рода заявление, чтобы юридически запретить людям доступ к нему (например, знак "не входить"). Следовательно, я не хочу все время отключать его.
16 ответов
Я не уверен, почему у вас есть отвращение к тому, чтобы делать это правильно - либо на сервере а-ля
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
Мне нужно немного поиграться с командами, но это должно помочь вам начать.
@note Все примеры предполагают, что вы установили переменную connectionString
с чем-то вроде connectionString=user@server
,
Как я дошел до решения
С помощью 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
Если вы хотите это для каждого пользователя, просто сделайте touch ~/.hushlogin
и все готово с OpenSSH.
Обновление: как указано в другом месте, pam_motd
может быть настроен, чтобы не использовать для пользователя .hushlogin
; проверять /etc/login.defs
за HUSHLOGIN_FILE
, Может быть настроено, чтобы все пользователи были перечислены в /etc/hushlogins
или похожие.
Как насчет этого взломать?;-П
ssh -t user@machineName '/bin/bash'
Следующее недействительно:
Переходя -T
ssh для отключения tty:
ssh -T machineName 'echo foo'
Что это за операционная система? В некоторых системах (например, в Ubuntu) motd печатается не сервером ssh (PrintMotd в /etc/ssh/sshd_config), а pam с помощью pam_motd. Если это так, то вы, вероятно, не можете контролировать это с клиента.
Либо вы не пробовали то, что описывали, либо ваши серверы настроены неправильно!
Вот что я только что попробовал на 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 ~ $
Я не думаю, что вам нужно, чтобы заявление об отказе было отправлено в неинтерактивные оболочки, не так ли? (Если кто-то заявляет, что вы это делаете, сделайте мне одолжение, пните их в чок.) Потому что именно поэтому существует различие между интерактивными и неинтерактивными оболочками.
Но в любом случае вот что я делаю, потому что мне не нравится почта от cron: я передаю вывод в logger. Просто протяните его через tail, чтобы удалить первые несколько (скажем, 3) строк вашего бессмысленного отказа от ответственности как такового (непроверенный код, у меня нет доступа к моим сценариям):
( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
Вы должны сделать это на сервере:
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
Не выполняйте команду ssh напрямую cron.
Вместо этогосоздайте вспомогательный скрипт bash, выполняя задание ssh и извлекая выходные данные, ошибки и код ошибки, если это необходимо; в конечном итоге проанализируйте их, чтобы удалить ненужные строки из сообщений об ошибках (MoTD в вашем случае), а затем повторно распечатайте выходные данные скрипта bash и потоки ошибок, которые вы получили таким образом.
Чем поставить этот скрипт в Cron и жить счастливым:)
Примечание. Это общее решение, и оно должно работать независимо от того, какую работу вы должны выполнять через ssh. Только клиентская сторона должна отвечать вашим потребностям... единственная зависимость клиента от конфигурации сервера - это знание точного сообщения, которое вы хотите вырезать из std err или из ssh клиента
Просто sidenote (был бы комментарий, если бы я мог опубликовать это): Содержимое motd отображается после успешного входа в систему. Если бы я хотел юридически запретить людям доступ к ящику, я бы предпочел сделать это с помощью "Banner" в sshd_config. Содержимое отображается после ввода имени пользователя, но до аутентификации.
У меня была такая же проблема с FreeNAS, который, я думаю, основан на FreeBSD.
Единственное, что сработало, это сделать
ssh user@device "show run" | tee "file_$(date +"%y%m%d".cfg" 2>/dev/null.
Выкинуть ошибки для меня не проблема, так как я написал скрипт, который ищет каждый новый конфиг устройства. Если это не удастся, мой сценарий монитора меня встревожит.
Буду рад поделиться сценарием монитора. Он также ротирует файлы для устройств, которые передают свои конфигурации через TFTP. Эти устройства не могут сами по себе создавать собственные имена с датами и т. д., поэтому каждый день необходимо менять name.cfg на name_[todays date].cfg.
Если я вас понимаю, вам нужен motd по другим причинам, но не нужен motd для резервного копирования. В конфиге sshd нельзя настроить его только на глобальном уровне. Поэтому вам необходимо решить проблему подавления MOTD на стороне клиента. Но нет разницы между текстом MOTD и сообщениями об ошибках программного обеспечения для резервного копирования. Оба текста в терминале. Единственное решение, которое я вижу, чтобы сделать различие между этими двумя сообщениями, а затем отфильтровать сообщение motd. Поскольку сообщения программного обеспечения трудно изменить, я предлагаю изменить текст MOTD. Например, поместите рамку вокруг:
*** BEGIN message from the machine room ***
motd message
*** END message from the machine room ***
Затем вы должны отфильтровать текст между рамкой и опустить его.
РЕШЕНИЕ ЗДЕСЬ:
Если вы не отвечаете за сервер и не можете изменить конфигурацию 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 " 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 || эхо SSH соединение не удалось bash: failed_remote_command: команда не найдена
Пример 3а:
ssh remotehost " failed_ remote_command 2> & 1; true" 2> / dev / null || эхо SSH соединение не удалось # сообщение не отображается
Пример 3б:
ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || эхо SSH соединение не удалось Сбой соединения SSH
Я наткнулся на эту ветку в поисках решения для подавления MOTD при использовании
sftp
в неинтерактивном режиме, но у меня не было доступа к серверу. Итак, решение, которое сработало для меня при прохождении
-q
flag для sftp, что делает его тихим.
Вы пробовали использовать конфигурацию подсистемы ssh? Вы можете найти пример на http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm который даже включает резервное копирование файлов.
Вы пытались удалить текст в файле MOTD? Просто мысль.
Hint: /etc/motd
Что вы пытаетесь сделать и почему МТД беспокоит вас? Я предполагаю выполнение удаленной команды и анализ выходных данных? Если это так, это можно сделать разными способами, не вызывая интерактивную оболочку (что приводит к отображению motd).