sshログインがクライアントからmotdを印刷しないようにしますか?


44

SSHパスワードレスを設定しましたが、ログインするとMoTDが出力されます。クライアント側からそれを止める方法はありますか?

試しましたssh -qが、うまくいきません。使用したくない~/.hushlogin、またはサーバーのセットアップを変更したくない。動作できる唯一のことは、すべての出力をQuietすること>/dev/null 2>&1です。ただし、実際に問題がある場合に備えて、エラーを無視したくありません。motdを標準エラー出力に出力するように見えるため>/dev/null、実行しても動作しませんssh

更新と推論バックアップをcronで実行しています。エラーが発生しない限り、cronメールを受け取りたくありません。ただし、motdが印刷されている場合は、常に電子メールが届きます。

motdには法的な意味合いがあるため、印刷し続ける必要があります。motdは、「許可されていないアクセスは禁止されています」と言います。人々が法的にアクセスできないようにするために、この種の声明をそこに入れる必要があります(侵入禁止標識のように)。それゆえ、私はそれを常に無効にしたくない。


1
cronジョブに関する詳細を追加できますか?
カイルブラント

1
motdは、対話型セッションでのみ出力されます。> $ ssh host→MOTD印刷> $ ssh host ls→ホームディレクトリのコンテンツのみを印刷します。つまり、あなたは何か非常に悪いことをしています。試したことはありますか?
niXar 09

また、/etc/profile.dそこで実行される可能性のあるスクリプトをチェックインし、ログイン時にコンソールに出力を出力することも注目に値します。
デイブ

4
「不正アクセスは禁止されています」と言うことを義務付ける法律は本当にありますか?DMCAにより、あらゆる種類の電子システムを(どの程度保護が不十分であっても)破壊することは違法であると考えたため、何らかのパスワード/ SSHキー要件がある限り、これは純粋なウィンドウドレッシングのように見えます。
ニックT

回答:


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
Fwiw、この通知は不正なアクセスを防止するものではなく、適切な法的措置を講じることができる(そしてそうする)ことを人々に通知するだけであり、電話での会話の記録に関する通知と同様に、その使用を監視している場合があります。
jtimberman

また、使用しているcronジョブを貼り付けると大いに役立ちます。
jtimberman

3
.hushloginいいです
andrewtweber

16

これをユーザーごとに行うtouch ~/.hushlogin場合は、a を実行するだけでOpenSSHで設定できます。

更新:別の場所で指摘したように、pam_motdユーザーごとを使用しないように構成できます.hushlogin。を確認/etc/login.defsHUSHLOGIN_FILEます。すべてのユーザーが一覧表示される/etc/hushloginsか、類似するように構成できます。


2
試しましたが、うまくいきませんでした。他の人が指摘しているように、motdはpamから印刷される可能性があります
ロリー

11

@noteすべての例では、などの変数connectionStringを設定していることを前提としていますconnectionString=user@server

ソリューションに到達した方法

を使用ssh -Tすると、単純なコマンドで機能するはずです。たとえば、これは追加情報を出力しません。

ssh -T $connectionString "echo 'blah'"

問題は、here-docを使用して多くのコマンドを実行しようとする場合です。たとえば、以下は機能しません-今日のメッセージ(MoTD)をエコーし​​、「stdin:is not a 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

これにもっと賛成票があればいいのに。必要なオーバーSSHのスクリプトを理解するのに非常に役立ちます。
csexton

素晴らしい答え!! どうもありがとうございました!!
スコッティH

10

このハックはどうですか?;-P

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

以下は、ない有効:

-Ttty割り当てを無効にするためにsshに渡す:

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を使用しないでください...特にUNIXホストをsshする場合Windows1。しかし、他の多くの問題は他の場合に発生するかもしれません。:素晴らしい@StephaneChazelasの答えを参照してくださいunix.stackexchange.com/questions/151916/...
オリヴィエ・デュラック

3

これはどのオペレーティングシステムですか?一部のシステム(ubuntuなど)では、motdはsshサーバー(/ etc / ssh / sshd_configのPrintMotd)ではなく、pam_motdを使用したpamによって印刷されます。この場合、おそらくクライアントから制御することはできません。


クライアント側で確認のためにあなたは、SSHクライアントでそれを制御することはできませんが、あなたのことができ:) ..詳細については、私の答えを参照してください
drAlberT

いいえ、あなたはmotdが印刷されるのをやめるための解決策ではなく、印刷されるmotdについてかなり興味深い/巧妙なハックを提案しました。それが問題でした。
受信2:09で

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

いいえ、しません。以下のカイル・ブラントの回答をご覧ください。
ストボー2009

-1-回答は編集された質問を反映しません。関連性がなくなりました。
ロマンダ09

2

cronでsshコマンドを直接実行しないでください。

代わりにヘルパーbashスクリプトを作成し、sshジョブを実行して、必要に応じて出力、エラー、エラーコードを取得します。最終的にそれらを解析して、エラーメッセージ(お使いの場合はMoTD)から不要な文字列を削除してから、bashスクリプトの出力に再出力し、そのようにして取得したものをエラーストリームします。

このbashスクリプトをcronに入れて幸せに生きるよりも:)

注: これは一般的な解決策であり、sshを介して実行する必要があるジョブは何でも動作する必要があります。それはあなたのニーズを満たすだけのクライアント側でもあります...サーバー設定へのクライアントの唯一の依存は、std errまたはsshクライアントから切り取りたい正確なメッセージの知識です


2
これは回避策である解決策ではありません。
niXar

申し訳ありませんが同意できません。私見それは物事がきれいに行われるべき方法です... motdを無視するようにsshクライアントを明示的に設定する方法があれば、私はあなたに同意しましたが、sshdの制御下にないという理由だけで存在することはできません!
drAlberT 09

2

ただの補足(私がそれを投稿できたなら、コメントだっただろう):motdの内容は、システムに正常にログインした後に表示さます。人々がボックスにアクセスするのを合法的に禁止したい場合は、sshd_configの「バナー」でそれを行います。ユーザー名を入力した後、認証する前に内容が表示されます。


4
私はあなたのノートに同意することはできませんので、はい、しかし、あなたは、SSHクライアントに-qを使用してバナーを無効にすることができます
drAlberT

1
ああ、私は完全にそれを見ることができます、「-q」はダイナコープ社のために働いているクラック法務チームの防御全体を打ち負かします。彼らはそれが来るのを見ていませんでした。リアルに。バナーを意図的に見ることになっている誰かがそれを回避した場合、それを回避するためにそれを知っていなければならなかったので、バナーはまだ拘束力があります。
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は次を実行します。および/ etc / motd(構成ファイルまたは〜/ .hushloginで防止されていない限り、「ファイル」セクションを参照)。2. ... sshログインでコマンドをディレクトリに入力した場合、MOTDは表示されないことに注意してください
katriel 09

それが私が実演していたことです。あなたのポイントは何ですか?
niXar 2009

1

理解できれば、他の理由でmotdが必要ですが、バックアップにmotdは必要ありません。sshdの設定では、ユーザー単位でグローバルにのみ設定できません。したがって、クライアント側でmotd抑制を解決する必要があります。ただし、motdのテキストとバックアップソフトウェアのエラーメッセージに違いはありません。両方とも端末内のテキストです。この2つのメッセージの違いを確認し、motdのメッセージをフィルタリングする唯一の解決策です。ソフトウェアのメッセージは修正が難しいため、motdのテキストを修正することをお勧めします。たとえば、周囲にフレームを配置します。

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

motd message

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

次に、フレーム間のテキストを除外してドロップする必要があります。


1

ここの解決策:

サーバーを担当しておらず、motdまたはsshdの構成を変更できない場合は、次のようなコマンドを使用します。

リモートコマンドが表示されるように、STDERRをSTDOUTにリダイレクトします。そして、sshのSTDERRを/ dev / nullにリダイレクトします。MOTDはSTERRに進み、最終的に/ dev / nullになります。リモートコマンドからの標準のANDエラーメッセージが表示されます(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 || エコーSSH接続が失敗したか、リモートコマンドがゼロ以外の終了コードを返しました
 bash:failed_remote_command:コマンドが見つかりません
SSH接続またはリモートコマンドが失敗しました-どちらかがゼロ以外の終了コード127を返しました

例2:

ssh remotehost " failed_ remote_command 2>&1; true " 2> / dev / null || エコーSSH接続失敗
 bash:failed_remote_command:コマンドが見つかりません

例3a:

ssh remotehost " failed_ remote_command 2>&1; true" 2> / dev / null || echo SSH connection failed
 #メッセージは表示されません

例3b:

SSH nonexistinghost " failed_は 2でremote_command>&1;真" 2>を/ dev / null || エコーSSH接続に失敗しました
 SSH接続に失敗しました

0

motdファイルのテキストを削除しようとしましたか?ちょっとした考え。

Hint: /etc/motd

4
彼は、sshd_configの中で何にPrintMotdを設定していないサーバ側から、おそらく良いだろう、クライアント側から言った
カイルブラント

0

あなたは何をしようとしているのですか、なぜMoTDはあなたを悩ますのですか?リモートコマンドを実行して出力を解析すると思いますか?その場合、インタラクティブシェルを呼び出さずにさまざまな方法でこれを行うことができます(これにより、motdが表示されます)。


ああ、など?私は本当にsshの思考を使用したい..
ロリー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.