Прекратить 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

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


3
Мне нравится "делать правильно".
— Бенуа

14
Я не хочу удалять его с сервера, так как мне нужно хранить уведомление «Запрещен авторизованный доступ» по юридическим причинам.
— Рори

3
Между прочим, уведомление не предотвращает несанкционированный доступ, оно просто уведомляет людей о том, что вы можете (и будете) предпринимать соответствующие юридические действия, и может контролировать их использование, как уведомление о записи телефонного разговора.
— Jtimberman

Кроме того, это очень помогло бы, если бы вы вставили работу cron, которую вы используете.
— Jtimberman

3
.hushloginэто хорошо
— andrewtweber

16

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

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


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

Я хотел бы иметь больше голосов за это. Очень полезно для выяснения некоторых сценариев 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. Если это так, то вы, вероятно, не можете контролировать это с клиента.


вы не можете управлять им в 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

Нет, ты не Смотрите ответ Кайла Брандта ниже.
— Stobor

-1 - Ответ не отражает отредактированный вопрос. Больше не актуально.
— romandas

2

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

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

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

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


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

Если вы посмотрите в 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 ***

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


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 думал ..
— Рори

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.