У меня настроен SSH без пароля, однако он распечатывает MoTD при входе в систему. Есть ли способ предотвратить это со стороны клиента?
я пробовал ssh -q
но это не работает. Я не хочу использовать ~/.hushlogin
я также не хочу менять настройку сервера. Единственное, что может сработать, - это заглушить весь вывод с помощью >/dev/null 2>&1
. Однако я не хочу игнорировать ошибки, если действительно есть проблема. Даже делая >/dev/null
не работает, так как ssh
кажется, печатает motd на stderr.
Обновление и рассуждения Бекап запускаю в cron. Я не хочу получать электронное письмо cron, если только не произошла ошибка. Однако, если motd напечатан, я все время буду получать электронное письмо.
Я хочу оставить 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
с чем-то вроде connectionString=user@server
.
Как я пришел к решению
С помощью ssh -T
должен работать для простых команд. Например, это не выводит никакой дополнительной информации:
ssh -T $connectionString "echo 'blah'"
Проблема в том, что вы пытаетесь использовать here-doc для выполнения множества команд. Например - ниже НЕ будет работать - он будет отображать сообщение дня (MoTD), а также может показать вам «stdin: is not a 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 user@machineName '/bin/bash'
Следующее не действительный:
Проходящий -T
в ssh, чтобы отключить выделение tty:
ssh -T machineName 'echo foo'
Что это за операционная система? В некоторых системах (например, ubuntu) motd распечатывается не ssh-сервером (PrintMotd в / etc / ssh / sshd_config), а 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
Не выполняйте команду ssh напрямую с помощью cron.
Создайте вспомогательный сценарий bash вместо этого, выполнение задания ssh и получение вывода, ошибок и кода ошибки, если необходимо; в конечном итоге проанализируйте их, чтобы удалить ненужные строки из сообщений об ошибках (MoTD в вашем случае), а затем повторно распечатайте выходные данные сценария bash и потоки ошибок, которые вы получили таким образом.
Затем поместите этот bash-скрипт в cron и живите счастливо :)
Примечание: Это общее решение, и оно должно работать независимо от того, какую работу вы должны выполнять через ssh. Это тоже только клиентская сторона, которая должна удовлетворить ваши потребности ... единственная зависимость клиента от конфигурации сервера - это знание точного сообщения, которое вы хотите вырезать из std err или из клиента ssh
Просто примечание (было бы комментарием, если бы я мог опубликовать это): отображается содержимое motd после Успешный вход в систему. Если я хочу юридически запретить людям доступ к ящику, я бы предпочел сделать это с помощью «Баннера» в sshd_config. Содержимое отображается после ввода имени пользователя, но до аутентификации.
Либо вы не пробовали то, что описываете, либо ваши серверы настроены неправильно!
Вот что я только что попробовал на 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: я перенаправляю вывод в регистратор. Просто пропустите его через tail, чтобы удалить первые несколько (скажем, 3) строки вашего бессмысленного отказа от ответственности как такового (непроверенный код, у меня нет доступа к моим скриптам):
( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
Если я вас понимаю, вам нужен 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; правда) 2>&1" 2>/dev/null || echo SSH connection failed
Примеры сообщений об ошибках:
Пример 1:
ssh remotehost "не смогли_remote_command 2>&1" 2>/dev/null || echo SSH connection failed or remote command returned non-zero exit code bash: failed_remote_command: команда не найдена SSH-соединение или удаленная команда не удалась - любой из них вернул ненулевой код выхода 127
Пример 2:
ssh remotehost "не смогли_remote_command 2>&1; правда" 2>/dev/null || echo SSH connection failed bash: failed_remote_command: команда не найдена
Пример 3а:
ssh remotehost "не смогли_remote_command 2>&1; true" 2>/dev/null || echo SSH connection failed # сообщение не отображается
Пример 3b:
ssh несуществующий "не смогли_remote_command 2>&1; true" 2>/dev/null || echo SSH connection failed Соединение SSH не удалось
Вы пробовали удалить текст в файле motd? Просто мысль.
Hint: /etc/motd
Что вы пытаетесь сделать и почему вас беспокоит Минтранс? Я предполагаю выполнить удаленную команду и проанализировать вывод? Если так, это можно сделать разными способами, не вызывая интерактивную оболочку (которая вызывает отображение motd).
Вы пробовали использовать конфигурацию подсистемы ssh? Вы можете найти пример на http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm это даже включает резервное копирование файлов.
Я наткнулся на эту ветку в поисках решения для подавления MOTD при использовании sftp
в неинтерактивном режиме, но у меня не было доступа к серверу. Итак, решение, которое сработало для меня при прохождении -q
flag для sftp, что делает его тихим.