Зупинити реєстрацію ssh від друку motd від клієнта?


44

У мене встановлено без паролів SSH, однак він друкує MoTD під час входу в систему. Чи все-таки можна зупинити це з боку клієнта?

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

Оновлення та міркування Я запускаю резервну копію в кроні. Я не хочу отримувати електронний лист, якщо не сталася помилка. Однак якщо motd надруковано, я постійно отримуватиму електронне повідомлення.

Я хочу, щоб мотодрук був надрукований, оскільки це має юридичні наслідки. Компанія каже, що "несанкціонований доступ заборонений". Потрібно мати такий вид заяв, щоб юридично не допустити до людей доступ до нього (наприклад, жодних знаків безперешкодної дії). Отже, я не хочу, щоб ковдра відключала його постійно.


1
Чи можете ви додати деякі подробиці про роботу з крон ...
Кайл Брандт

1
Мод друкується лише для інтерактивних сесій. Я щойно тестував це, і це так:> $ ssh хост → MOTD надруковано> $ ssh хост ls → друкує лише вміст домашнього каталогу Іншими словами, ви робите щось дуже неправильно; ви навіть пробували?
niXar

Також варто відзначити, чи /etc/profile.dнемає скриптів, які можуть там працювати, та надрукувати певний вихід на консоль при вході в систему.
Дейв

4
Чи дійсно існує закон, який вимагає, щоб ви сказали "несанкціонований доступ заборонений"? Я вважав, що DMCA забороняє зламати будь-яку електронну систему ( незалежно від того, наскільки погано захищена ), тож поки у вас є якась вимога пароля / ключового ключа SSH, це здається чистим оформленням вікон.
Нік Т

Відповіді:


58

Я не впевнений, чому у вас є неприязнь робити це правильно - або на сервері a la

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 захоплювати його електронною поштою) та вихід сесії 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
Fwiw, повідомлення не перешкоджає несанкціонованому доступу, воно просто сповіщає людей про те, що ви можете (і будете) вживати відповідних юридичних дій та може контролювати їх використання, як і повідомлення про запис телефонної розмови.
jtimberman

Крім того, це дуже допоможе, якби ви вставили роботу cron, яку ви використовуєте.
jtimberman

3
.hushloginприємно
andrewtweber

16

Якщо ви хочете цього робити на основі користувача, просто зробіть це, touch ~/.hushloginі ви все налаштовані на OpenSSH.

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


2
Я спробував це, але не вийшло. Як зазначають інші, мод може бути надруковано з пам’яті
Рорі

11

@note Усі приклади припускають, що ви встановили змінну connectionStringз чимось подібним connectionString=user@server.

Як я дійшов до рішення

Використання ssh -Tповинно працювати для простих команд. Наприклад, ця інформація не друкує додаткової інформації:

ssh -T $connectionString "echo 'blah'"

Проблема полягає в тому, що ви намагаєтеся використовувати тут-doc для запуску багатьох команд. Наприклад - нижче НЕ буде працювати - це буде відлунне повідомлення дня (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

Я б хотів, щоб у мене було більше грошей на це. Дуже корисно розібратися з деякими надмірними сценаріями, які нам потрібно було зробити.
csexton

Фантастична відповідь !! Дуже дякую!!
Scottie H

10

Як щодо цього злому? ;-P

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 - деякі файли"> local.tar # НЕ використовуйте -t тут ... особливо, якщо ви ssh хост unix з вікно одне, але в інших випадках може виникнути багато інших проблем). Дивіться чудову відповідь @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Олів'є

3

Яка це операційна система? У деяких системах (наприклад, ubuntu) motd не друкується на сервері ssh (PrintMotd в / etc / ssh / sshd_config), а в пам’яті з pam_motd. Якщо це так, то ви, ймовірно, не можете контролювати це від клієнта.


Ви не можете керувати ним у ssh-клієнті, але ви точно можете на стороні клієнта :) .. Детальніше дивіться мою відповідь
drAlberT

Ні, ви запропонували досить цікавий / розумний злом навколо друкованої компанії, а не рішення, щоб зупинити її друк клієнтом, в чому полягало питання.
theoterreceive

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

Ні, ти цього не робиш. Дивіться відповідь Кайла Брандта нижче.
Стобор

-1 - Відповідь не відображає відредаговане запитання. Більше не актуально.
romandas

2

Не виконайте команду ssh безпосередньо за допомогою cron.

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

Тоді як покласти цей баш сценарій у cron і жити щасливим :)

Примітка. Це загальне рішення, і він повинен працювати будь-яку роботу, яку ви повинні виконати через ssh. Тільки клієнтська сторона також повинна відповідати вашим потребам ... Єдина залежність клієнта від конфігурації сервера - це знання точного повідомлення, яке ви хочете вирізати з std помилки або з ssh клієнта


2
Це не рішення, яке вирішує питання.
niXar

Я не можу з тобою погодитися. IMHO - це так, як слід робити все чисто ... Я погодився з вами, якби був спосіб явно налаштувати ssh-клієнт ігнорувати motd, але він не може існувати, просто тому, що він не знаходиться під контролем sshd !
drAlberT

2

Просто сторонне позначення (був би коментар, якщо я можу це опублікувати): Зміст motd відображається після успішного входу в систему. Якщо я хотів би юридично заборонити людям отримувати доступ до коробки, я б краще зробити це за допомогою "Банера" ​​в 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: я передаю висновок в реєстратор. Просто переведіть його через хвіст, щоб видалити перші (скажімо 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. ... Зауважте, що якщо команда введена в каталог у sh-вході, 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 " fail_ remote_command 2> & 1" 2> / dev / null || echo з’єднання SSH не вдалося або віддалена команда повернула ненульовий код виходу
 bash: failed_remote_command: команда не знайдена
Не вдалося підключити SSH або віддалену команду - будь-який з них повернув ненульовий код виходу 127

Приклад 2:

ssh remotehost " fail_ remote_command 2> & 1; true " 2> / dev / null || echo з’єднання SSH не вдалося
 bash: failed_remote_command: команда не знайдена

Приклад 3a:

ssh remotehost " fail_ remote_command 2> & 1; true" 2> / dev / null || echo SSH-з'єднання не вдалося
 # повідомлення не відображається

Приклад 3b:

SSH nonexistinghost " failed_ remote_command 2> & 1; істина" 2> / DEV / нуль || ехо SSH-з'єднання не вдалося
 З'єднання SSH не вдалося

0

Ви спробували видалити текст з файлу motd? Просто думка.

Hint: /etc/motd

4
Він сказав з боку клієнта, з налаштування на стороні сервера PrintMotd, щоб ні в sshd_config, мабуть, було б краще
Кайл Брандт

0

Що ви намагаєтеся зробити і чому МТР вас турбує? Я здогадуюсь виконувати віддалену команду та аналізувати вихід? Якщо це так, це можна зробити різними способами без виклику інтерактивної оболонки (що призводить до показу motd).


О, такі як? Я б дуже хотів використовувати ssh подумки ..
Rory

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.