Назад | Перейти на главную страницу

Остановить вход ssh для печати motd с клиента?

У меня настроен 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, что делает его тихим.