it-swarm-ru.tech

Прекратить ssh логин от печати MOTD с клиента?

У меня установлен SSH без пароля, однако он печатает MoTD при входе в систему. Есть ли способ остановить это на стороне клиента?

Я пробовал ssh -q но это не работает. Я не хочу использовать ~/.hushlogin и ​​я не хочу изменять настройки сервера. Единственное, что может работать, это успокоить весь вывод с помощью >/dev/null 2>&1. Однако я не хочу игнорировать ошибки в случае, если на самом деле есть проблема. Даже делая >/dev/null не работает, поскольку ssh, кажется, печатает motd на stderr.

Обновление и рассуждения Я запускаю резервное копирование в cron. Я не хочу получать электронную почту cron, если не произошла ошибка. Однако, если MOTD напечатан, я буду получать электронную почту все время.

Я хочу сохранить печать MOTD, потому что это имеет юридические последствия. Мотд говорит "неавторизованный доступ запрещен". Вы должны иметь такого рода заявление, чтобы юридически запретить людям доступ к нему (как знак "не входить"). Следовательно, я не хочу все время отключать его.

45
Rory

Я не уверен, почему у вас есть отвращение к тому, чтобы делать это правильно - либо на сервере а-ля

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

Мне нужно немного поиграться с командами, но это должно помочь вам начать.

58
jtimberman

Если вы хотите это для каждого пользователя, просто сделайте touch ~/.hushlogin и ​​все готово с OpenSSH.

Обновление: Как указано в другом месте, pam_motd может быть настроено так, чтобы не использовать пользователя .hushlogin; чек об оплате /etc/login.defs за HUSHLOGIN_FILE. Может быть настроено, чтобы все пользователи были перечислены в /etc/hushlogins или похожие.

16
towo

@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
11
Nux

Как насчет этого взломать? ;-П

ssh -t [email protected] '/bin/bash'

Следующее не действительно:

Проходя -T в ssh, чтобы отключить распределение tty:

ssh -T machineName 'echo foo'
10
Kyle Brandt

Что это за операционная система? В некоторых системах (например, в Ubuntu) motd печатается не сервером ssh (PrintMotd в/etc/ssh/sshd_config), а pam с помощью pam_motd. Если это так, то вы, вероятно, не можете контролировать это с клиента.

3
theotherreceive

Не выполняйте команду ssh напрямую cron.

создайте вспомогательный скрипт bash вместо этого, выполняя задание ssh и извлекая выходные данные, ошибки и код ошибки, если необходимо; в конечном итоге проанализируйте их, чтобы удалить ненужные строки из сообщений об ошибках (MoTD в вашем случае), а затем повторно распечатайте выходные данные скрипта bash и потоки ошибок, которые вы получили таким образом.

Чем положить этот скрипт в Cron и жить счастливым :)

Примечание: Это общее решение, и оно должно работать независимо от того, какую работу вы должны выполнять через ssh. Только клиентская сторона должна отвечать вашим потребностям ... единственная зависимость клиента от конфигурации сервера - это знание точного сообщения, которое вы хотите вырезать из std err или из ssh клиента

2
drAlberT

Вы должны сделать это на сервере:

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
2
ThorstenS

Либо вы не пробовали то, что описали, либо ваши серверы настроены неправильно!

Вот что я только что попробовал на 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
2
niXar

РЕШЕНИЕ ЗДЕСЬ:

Если вы не отвечаете за сервер и не можете изменить конфигурацию 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
1
Chris

Если я вас понимаю, вам нужен motd по другим причинам, но не нужен motd для резервного копирования. В конфиге sshd нельзя настроить его только на глобальном уровне. Поэтому вам необходимо решить проблему подавления MOTD на стороне клиента. Но нет разницы между текстом motd и сообщениями об ошибках программы резервного копирования. Оба текста в терминале. Единственное решение, которое я вижу, чтобы сделать различие между этими двумя сообщениями, а затем отфильтровать сообщение motd. Поскольку сообщения программного обеспечения трудно изменить, я предлагаю изменить текст MOTD. Например, поместите рамку вокруг:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

Затем вы должны отфильтровать текст между рамкой и опустить его.

1
Saabi

Вы пытались удалить текст в файле MOTD? Просто мысль.

Hint: /etc/motd
0
Joseph Kern

Что вы пытаетесь сделать и почему МТД беспокоит вас? Я предполагаю выполнение удаленной команды и анализ выходных данных? Если это так, это можно сделать различными способами, не вызывая интерактивную оболочку (что приводит к отображению motd).

0
Marie Fischer

Вы пробовали использовать конфигурацию подсистемы ssh? Вы можете найти пример по адресу http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm , который даже включает резервное копирование файлов.

0
David