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

<p>у меня установлен ssh без пароля, однако он печатает motd при входе в систему. есть ли способ остановить это на стороне клиента?</p><p>я пробовал <code>ssh -q</code> но это не работает. я не хочу использовать <code>~/.hushlogin</code> и я не хочу изменять настройки сервера. единственное, что может работать, это успокоить весь вывод с помощью <code>>/dev/null 2>&1</code>. однако я не хочу игнорировать ошибки в случае, если на самом деле есть проблема. даже делая <code>>/dev/null</code> не работает, поскольку <code>ssh</code>, кажется, печатает motd на stderr.</p><p><strong>обновление и рассуждения</strong> я запускаю резервное копирование в cron. я не хочу получать электронную почту cron, если не произошла ошибка. однако, если motd напечатан, я буду получать электронную почту все время.</p><p>я хочу сохранить печать motd, потому что это имеет юридические последствия. мотд говорит "неавторизованный доступ запрещен". вы должны иметь такого рода заявление, чтобы юридически запретить людям доступ к нему (как знак "не входить"). следовательно, я не хочу все время отключать его.</p>

<p>я не уверен, почему у вас есть отвращение к тому, чтобы делать это правильно - либо на сервере а-ля</p><pre><code>printmotd no printlastlog no </code></pre><p>а также</p><pre><code>#/etc/pam.d/ssh # print the message of the day upon successful login. # session optional pam\_motd.so </code></pre><p>или добавив ~/.hushlogin для каждого пользователя.</p><p>подсказка, для ~/.hushlogin добавьте его в/etc/skel, чтобы новые домашние каталоги пользователей создавались вместе с файлом.</p><h3>обновление:</h3><p>без дополнительной информации о задании резервного копирования cron я могу предложить только одно: перенаправить вывод команды в файл (или позволить cron перехватить его в электронной почте) и вывод сеанса ssh в/dev/null. что-то вроде:</p><pre><code>0 0 * * * ssh backuphost "backup\_script\_that\_writes\_to\_a\_log" >/dev/null </code></pre><p>или</p><pre><code>0 0 * * * ssh backuphost "backup\_command 2>&1" >/dev/null </code></pre><p>мне нужно немного поиграться с командами, но это должно помочь вам начать.</p>

<p>если вы хотите это для каждого пользователя, просто сделайте <code>touch ~/.hushlogin</code> и все готово с openssh.</p><p><strong>обновление</strong>: как указано в другом месте, <code>pam\_motd</code> может быть настроено так, чтобы не использовать пользователя <code>.hushlogin</code>; чек об оплате <code>/etc/login.defs</code> за <code>hushlogin\_file</code>. может быть настроено, чтобы все пользователи были перечислены в <code>/etc/hushlogins</code> или похожие.</p>

<p>@note все примеры предполагают, что вы установили переменную <code>connectionstring</code> с чем-то вроде <code>connectionstring=user@server</code>.</p><p><strong>как я дошел до решения</strong></p><p>с помощью <code>ssh -t</code> должно работать для простых команд. например, это не выводит дополнительную информацию:</p><pre><code>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" </code></pre><p>но это грязно ...</p><p><strong>окончательное решение</strong></p><p>сделайте универсальную функцию (обратите внимание, что она может принимать строку или heredoc в качестве команд).</p><pre><code>function silentssh { local connectionstring="$1" local commands="$2" if [ -z "$commands" ]; then commands=cat fi ssh -t $connectionstring "$commands" } <strong>примеры</strong>используйте это так:somethinglocal='something local' silentssh $connectionstring <<eoc echo 'blah' echo "blah $somethinglocal" eoc или вот так:silentssh $connectionstring "echo 'blah'" </code></pre><p>или вот так:</p><pre><code>silentssh $connectionstring <<'eoc' echo 'blah' somethingremote=echo 'whatever' echo "blah $somethingremote" eoc </code></pre><p>или даже так:</p><pre><code>silentssh $connectionstring < getlines.sh 

как насчет этого взломать? ;-пssh -t user@machinename '/bin/bash' следующее <strong> не </strong> действительно:проходя -t в ssh, чтобы отключить распределение tty:ssh -t machinename 'echo foo' 

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

не выполняйте команду ssh напрямую cron.<strong>создайте вспомогательный скрипт bash</strong> вместо этого, выполняя задание ssh и извлекая выходные данные, ошибки и код ошибки, если необходимо; в конечном итоге проанализируйте их, чтобы удалить ненужные строки из сообщений об ошибках (motd в вашем случае), а затем повторно распечатайте выходные данные скрипта bash и потоки ошибок, которые вы получили таким образом.чем положить этот скрипт в cron и жить счастливым :) примечание:  это общее решение, и оно должно работать независимо от того, какую работу вы должны выполнять через ssh. только клиентская сторона должна отвечать вашим потребностям ... единственная зависимость клиента от конфигурации сервера - это знание точного сообщения, которое вы хотите вырезать из std err или из ssh клиента

вы должны сделать это на сервере: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 

либо вы не пробовали то, что описали, либо ваши серверы настроены неправильно!вот что я только что попробовал на 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 

<strong>решение здесь:</strong>если вы не отвечаете за сервер и не можете изменить конфигурацию 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 $?</code></p><p>вариант 2 - если вы хотите игнорировать код выхода удаленной команды - просто выполните true в качестве последней удаленной команды</p><p><code>ssh remotehost "(remote\_command<b>; true</b>) 2>&1" 2>/dev/null || echo ssh connection failed</code></p><p>примеры сообщений об ошибках:</p><p>пример 1:</p><pre> ssh remotehost "<b>не смогли\_</b>remote\_command 2> & 1 "2>/dev/null || echo ssh-соединение не выполнено или удаленная команда вернула ненулевой код выхода <i>bash: failed\_remote\_command: команда не найдена соединение ssh или удаленная команда не выполнены - любой из них возвратил ненулевой код выхода 127</i> </pre><p>пример 2:</p><pre> ssh remotehost "<b>не смогли\_</b>remote\_command 2> & 1; <b>правда</b>"2>/dev/null || echo ssh соединение не удалось <i>bash: failed\_remote\_command: команда не найдена</i> </pre><p>пример 3а:</p><pre> ssh remotehost "<b>не смогли\_</b>remote\_command 2> & 1; true "2>/dev/null || echo ssh соединение не удалось <i># сообщение не отображается</i> </pre><p>пример 3б:</p><pre> ssh <b>nonexistinghost</b> "<b>не смогли\_</b>remote\_command 2> & 1; true "2>/dev/null || echo ssh соединение не удалось <i>сбой соединения ssh</i> </pre>

<p>если я вас понимаю, вам нужен motd по другим причинам, но не нужен motd для резервного копирования. в конфиге sshd нельзя настроить его только на глобальном уровне. поэтому вам необходимо решить проблему подавления motd на стороне клиента. но нет разницы между текстом motd и сообщениями об ошибках программы резервного копирования. оба текста в терминале. единственное решение, которое я вижу, чтобы сделать различие между этими двумя сообщениями, а затем отфильтровать сообщение motd. поскольку сообщения программного обеспечения трудно изменить, я предлагаю изменить текст motd. например, поместите рамку вокруг:</p><pre><code>*** begin message from the machine room *** motd message *** end message from the machine room *** </code></pre><p>затем вы должны отфильтровать текст между рамкой и опустить его.</p>

<p>вы пытались удалить текст в файле motd? просто мысль.</p><pre><code>hint: /etc/motd </code></pre>

<p>что вы пытаетесь сделать и почему мтд беспокоит вас? я предполагаю выполнение удаленной команды и анализ выходных данных? если это так, это можно сделать различными способами, не вызывая интерактивную оболочку (что приводит к отображению motd).</p>

<p>вы пробовали использовать конфигурацию подсистемы ssh? вы можете найти пример по адресу <a href="http://www.hell.org.ua/docs/oreilly/tcpip2/ssh/ch05\_07.htm">http://www.hell.org.ua/docs/oreilly/tcpip2/ssh/ch05\_07.htm</a> , который даже включает резервное копирование файлов.</p>