SSHを使用してパスワードなしでセットアップしましたが、ログイン時にMoTDが出力されます。クライアント側で発生するのを止める方法はありますか?
ssh -q
を試しましたが、うまくいきません。 ~/.hushlogin
を使用したくない、またはサーバー設定を変更したくない。機能できるのは、>/dev/null 2>&1
を使用してすべての出力をクワイエットすることだけです。ただし、実際に問題が発生した場合でも、エラーを無視したくありません。 ssh
はmotdをstderrに出力するようなので、>/dev/null
を実行しても機能しません。
更新と推論 cronでバックアップを実行しています。エラーが発生しない限り、cronメールを受け取りたくありません。ただし、motdが印刷されている場合は、常にメールが送信されます。
Motdは法的な意味があるため、印刷されたままにしておきたいです。 motdは「無許可アクセスは禁止されています」と述べています。そこにこの種の声明を入れて、人々がそれに侵入することを法的に禁止する必要があります(侵入禁止の標識のように)。したがって、私はそれを常に無効にしたくありません。
私はなぜこれを正しく行うことに嫌悪感があるのか分かりません-サーバーのいずれかで
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
コマンドを少しいじる必要がありますが、それで始められるはずです。
ユーザーごとにこれが必要な場合は、touch ~/.hushlogin
を実行するだけで、すべてOpenSSHで設定できます。
更新:他で指摘されているように、pam_motd
はユーザーごとに.hushlogin
を使用しないように設定できます。 /etc/login.defs
でHUSHLOGIN_FILE
を確認します。すべてのユーザーが/etc/hushlogins
または類似のリストに含まれるように構成されている可能性があります。
@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
このハックはどうですか? ;-P
ssh -t user@machineName '/bin/bash'
以下はnot有効です:
合格-T
to ssh to tty allocation:
ssh -T machineName 'echo foo'
これはどのオペレーティングシステムですか?一部のシステム(ubuntuなど)では、motdはsshサーバー(/ etc/ssh/sshd_configのPrintMotd)によって印刷されず、pam_motdを使用したpamによって印刷されます。この場合は、おそらくクライアントから制御することはできません。
Cronで直接sshコマンドを実行しないでください。
ヘルパーbashスクリプトを作成する代わりに、sshジョブを実行し、必要に応じて出力、エラー、エラーコードを取得します。最終的にそれらを解析して、エラーメッセージ(あなたの場合はMoTD)から不要な文字列を削除し、bashスクリプトの出力とそのような方法で取得したエラーストリームに再出力します。
この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からのメールが好きではないため、次のようにします。出力をロガーにパイプします。それを末尾にパイプして、無意味な免責事項の最初の数行(たとえば3行としましょう)を削除します(テストされていないコード、スクリプトにアクセスできません)。
( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
解決策はこちら:
サーバーを担当しておらず、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接続に失敗しました
私が理解していれば、他の理由でmotdが必要ですが、バックアップにmotdは必要ありません。 sshdの構成では、ユーザーベースでのみグローバルに設定することはできません。したがって、クライアント側でmotd抑制を解決する必要があります。しかし、motdのテキストとバックアップソフトウェアのエラーメッセージに違いはありません。どちらもターミナル内のテキストです。この2つのメッセージを区別してmotdのメッセージをフィルタリングする唯一の解決策です。ソフトウェアのメッセージは変更が難しいため、motdのテキストを変更することをお勧めします。たとえば、次のようにフレームを配置します。
*** BEGIN message from the machine room ***
motd message
*** END message from the machine room ***
次に、フレーム間のテキストをフィルタリングして、ドロップする必要があります。
Motdファイルのテキストを削除してみましたか?ちょっとした考え。
Hint: /etc/motd
あなたは何をしようとしているのですか、MoTDはなぜあなたを悩ませていますか?リモートコマンドを実行して出力を解析していると思いますか?もしそうなら、これはインタラクティブなシェルを呼び出さずにさまざまな方法で行うことができます(これによりmotdが表示されます)。
Sshサブシステム構成を使用してみましたか? http://www.hell.org.ua/Docs/oreilly/tcpip2/ssh/ch05_07.htm に例があり、ファイルのバックアップも含まれています。