web-dev-qa-db-ja.com

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

SSHを使用してパスワードなしでセットアップしましたが、ログイン時にMoTDが出力されます。クライアント側で発生するのを止める方法はありますか?

ssh -qを試しましたが、うまくいきません。 ~/.hushloginを使用したくない、またはサーバー設定を変更したくない。機能できるのは、>/dev/null 2>&1を使用してすべての出力をクワイエットすることだけです。ただし、実際に問題が発生した場合でも、エラーを無視したくありません。 sshはmotdをstderrに出力するようなので、>/dev/nullを実行しても機能しません。

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

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

45
Rory

私はなぜこれを正しく行うことに嫌悪感があるのか​​分かりません-サーバーのいずれかで

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

コマンドを少しいじる必要がありますが、それで始められるはずです。

58
jtimberman

ユーザーごとにこれが必要な場合は、touch ~/.hushloginを実行するだけで、すべてOpenSSHで設定できます。

更新:他で指摘されているように、pam_motdはユーザーごとに.hushloginを使用しないように設定できます。 /etc/login.defsHUSHLOGIN_FILEを確認します。すべてのユーザーが/etc/hushloginsまたは類似のリストに含まれるように構成されている可能性があります。

16
towo

@noteすべての例では、connectionString=user@serverなどの変数を使用して変数connectionStringを設定したと想定しています。

解決方法

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

ssh -T $connectionString "echo 'blah'"

問題は、ヒアドキュメントを使用して多くのコマンドを実行しようとしたときです。たとえば、以下は機能しません-今日のメッセージ(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
11
Nux

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

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

以下はnot有効です:

合格-T to ssh to tty allocation:

ssh -T machineName 'echo foo'
10
Kyle Brandt

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

3
theotherreceive

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

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

このbashスクリプトをcronに入れて幸せに暮らしてください:)

注:これは一般的な解決策であり、sshを介して実行する必要があるジョブは何でも機能する必要があります。これもクライアント側のみであり、ニーズを満たす必要があります。クライアントのサーバー構成への唯一の依存関係は、std errまたはsshクライアントから切り出したい正確なメッセージの知識です

2
drAlberT

あなたはサーバー上でそれを行う必要があります:

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
2
ThorstenS

あなたが説明していることを試していないか、サーバーが正しく設定されていません!

これが私が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
2
niXar

解決策はこちら:

サーバーを担当しておらず、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 "失敗したremote_command 2>&1 "2>/dev/null || echo SSH接続が失敗したか、リモートコマンドがゼロ以外の終了コードを返しました
bash:failed_remote_command:コマンドが見つかりません
 SSH接続またはリモートコマンドが失敗しました-どちらかがゼロ以外の終了コード127を返しました

例2:

 ssh remotehost "失敗したremote_command 2>&1; 本当"2>/dev/null || echo SSH接続に失敗しました
bash:failed_remote_command:コマンドが見つかりません

例3a:

 ssh remotehost "失敗したremote_command 2>&1; true "2>/dev/null || echo SSH接続に失敗しました
#メッセージは表示されません

例3b:

 ssh 存在しないホスト 」失敗したremote_command 2>&1; true "2>/dev/null || echo SSH接続に失敗しました
SSH接続に失敗しました
1
Chris

私が理解していれば、他の理由でmotdが必要ですが、バックアップにmotdは必要ありません。 sshdの構成では、ユーザーベースでのみグローバルに設定することはできません。したがって、クライアント側でmotd抑制を解決する必要があります。しかし、motdのテキストとバックアップソフトウェアのエラーメッセージに違いはありません。どちらもターミナル内のテキストです。この2つのメッセージを区別してmotdのメッセージをフィルタリングする唯一の解決策です。ソフトウェアのメッセージは変更が難しいため、motdのテキストを変更することをお勧めします。たとえば、次のようにフレームを配置します。

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

motd message

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

次に、フレーム間のテキストをフィルタリングして、ドロップする必要があります。

1
Saabi

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

Hint: /etc/motd
0
Joseph Kern

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

0
Marie Fischer

Sshサブシステム構成を使用してみましたか? http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm に例があり、ファイルのバックアップも含まれています。

0
David