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

44

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

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

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

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

Рори
источник
1
Можете ли вы добавить некоторые подробности о работе cron ...
Кайл Брандт
1
Motd печатается только для интерактивных сессий. Я только что проверил это, и это так:> $ ssh host → MOTD print> $ ssh host ls → печатает только содержимое домашнего каталога. Другими словами, вы делаете что-то очень неправильно; ты вообще пробовал?
niXar
Стоит также отметить наличие /etc/profile.dлюбых сценариев, которые могут там выполняться, и выводить некоторые данные на консоль при входе в систему.
Дейв
4
Действительно ли существует закон, который требует от вас сказать «запрещен несанкционированный доступ»? Я думал, что DMCA запрещает взламывать любые электронные системы ( независимо от того, насколько они защищены ), поэтому, если у вас есть какие-то требования к паролю / SSH-ключу, это похоже на чистое оформление витрин.
Ник Т

Ответы:

58

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

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

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

jtimberman
источник
3
Мне нравится "делать правильно".
Бенуа
14
Я не хочу удалять его с сервера, так как мне нужно хранить уведомление «Запрещен авторизованный доступ» по юридическим причинам.
Рори
3
Между прочим, уведомление не предотвращает несанкционированный доступ, оно просто уведомляет людей о том, что вы можете (и будете) предпринимать соответствующие юридические действия, и может контролировать их использование, как уведомление о записи телефонного разговора.
Jtimberman
Кроме того, это очень помогло бы, если бы вы вставили работу cron, которую вы используете.
Jtimberman
3
.hushloginэто хорошо
andrewtweber
16

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

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

towo
источник
2
Я попробовал это, но это не сработало. Как уже отмечали другие, MOTD может быть напечатан с Пэм
Рори
11

@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
Nux
источник
Я хотел бы иметь больше голосов за это. Очень полезно для выяснения некоторых сценариев over-ssh, которые нам нужно было сделать.
csexton
Фантастический ответ !! Большое спасибо!!
Скотти Х
10

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

ssh -t user@machineName '/bin/bash'

Следующее является не действительным:

Переход -Tк ssh для отключения tty:

ssh -T machineName 'echo foo'
Кайл Брандт
источник
3
ssh user @ machine 'ваша команда здесь' все равно не показывает motd (это не интерактивная оболочка).
Мари Фишер
О, хорошо, точка ....
Кайл Брандт
но что это значит «это не интерактивная оболочка», так как я пытался и могу запускать команды, чего бы мне не хватало с помощью-t
Ciasto piekarz
обратите внимание, что добавление «-t» меняет поведение (оно отображается в соответствии с вашими настройками TERM, добавляет управляющие символы при необходимости и т. д.). Он может изменить результат некоторых команд (например, он может привести к ошибкам в: ssh -t somehost "tar cf - some files"> local.tar # НЕ используйте здесь -t ... особенно если вы используете ssh хост unix из окна один, но многие другие проблемы могут возникнуть в других случаях). Посмотрите замечательный ответ @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Оливье Дюлак
3

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

theotherreceive
источник
вы не можете управлять им в ssh-клиенте, но вы наверняка можете на стороне клиента :) .. подробности смотрите в моем ответе
drAlberT
Нет, вы предложили довольно интересный / хитрый способ взлома печатаемого motd, а не решение, чтобы остановить его печать клиентом, и в этом был вопрос.
другой прием
2

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

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
ThorstenS
источник
Нет, ты не Смотрите ответ Кайла Брандта ниже.
Stobor
-1 - Ответ не отражает отредактированный вопрос. Больше не актуально.
romandas
2

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

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

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

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

drAlberT
источник
2
Это не решение, это обходной путь.
niXar
Я не могу согласиться с тобой извините. ИМХО, это то, как все должно быть сделано чисто ... Я бы согласился с вами, если бы был способ явно настроить ssh-клиент на игнорирование motd, но он не может существовать, просто потому, что он не находится под контролем sshd !
DrAlberT
2

Просто sidenote (был бы комментарий, если бы я мог опубликовать это): Содержимое motd отображается после успешного входа в систему. Если бы я хотел юридически запретить людям доступ к ящику, я бы предпочел сделать это с помощью «Banner» в sshd_config. Содержимое отображается после ввода имени пользователя, но до аутентификации.


источник
4
да, но вы можете отключить баннер, используя -q на клиенте ssh, поэтому я не могу согласиться с вашей запиской
drAlberT
1
О, мальчик, я могу полностью видеть это, "-q", побеждая всю защиту нелегкой юридической команды, работающей на Dynacorp Inc. Черт возьми! Они не ожидали этого. Стань настоящим. Если кто-то, кто должен видеть знамя, целенаправленно уклоняется от него ... знамя все еще имеет обязательную силу, так как вы должны были знать это, чтобы уклониться от него.
niXar
2

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

Вот что я только что попробовал на 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
niXar
источник
Если вы посмотрите в man sshd, вы увидите, что там написано: ПРОЦЕСС ВХОДА В систему. Когда пользователь успешно вошел в систему, sshd делает следующее: 1. Если для входа используется tty, а команда не указана, печатается время последнего входа. и / etc / motd (если это не запрещено в файле конфигурации или с помощью ~ / .hushlogin; см. раздел «ФАЙЛЫ»). 2. ... Обратите внимание, что если команда введена в каталог в логине ssh, MOTD не отображается
katriel
Я знаю, это то, что я демонстрировал. В чем ваша точка зрения?
niXar
1

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

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

motd message

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

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

Saabi
источник
1

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

Если вы не отвечаете за сервер и не можете изменить конфигурацию 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 || echo 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; истина" 2> / DEV / нуль || эхо SSH соединение не удалось
 SSH соединение не удалось
Крис
источник
0

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

Hint: /etc/motd
Джозеф Керн
источник
4
С клиентской стороны он сказал, что с серверной стороны установка PrintMotd в no в sshd_config, вероятно, будет лучше
Кайл Брандт,
0

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

Мари Фишер
источник
Ах, как? Я действительно предпочел бы использовать ssh думал ..
Рори