ssh
私はいくつかのコンピュータに接続し、セッションを通していくつかのコマンドを実行する簡単なスクリプトを書いています。
sshpass -p 'password' ssh $target_ip << EOF
echo \$PATH
# example
echo \$HOSTNAME
[...]
EOF
仕事は正確ですが、私を悩ませるのは、すべての接続でssh
サーバーバナーを表示し、スクリプトの残りの部分を妨げることですstdout
。
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-81-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Nov 23 11:58:14 CET 2022
System load: 0.44 Processes: 131
Usage of /: 9.2% of 108.79GB Users logged in: 0
Memory usage: 26% IPv4 address for br0: 172.16.20.11
Swap usage: 0% IPv4 address for br0: 10.130.1.1
Temperature: 36.0 C IPv4 address for tun0: 10.130.0.27
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
241 updates can be installed immediately.
134 of these updates are security updates.
To see these additional updates run: apt list --upgradable
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
だから私はそのバナーが表示されたくありません。ただ私はここにいますEOF
。
関連がある場合に備えて、私が使用しているSSHバージョンはですOpenSSH_9.1p1, OpenSSL 3.0.7 1 Nov 2022
。OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
サーバーからバナーを削除したくありません。sshd
構成から削除できます。私が望むのは、クライアントがスクリプトでバナー印刷を無効にすることです。
しかし、sshラインオプションは他の人には効果がありました(私はここそしてここ) 私には効果がなかった。
ssh -o LogLevel=error $ip
返品:
ssh -q $ip
クライアントレベルでこの機能を無効にするにはどうすればよいですか?これを行うためのSSHオプションやパラメータはありませんか?それ以外の場合は、実行中のコマンドの出力に触れることなくどのようにstdout
リダイレクトできますか?/dev/null
EOF
ベストアンサー1
Banner
SSHサーバーのSSH認証オプションの前のバナーです。sshd_config
サーバー構成を変更しない限り、サーバーがそれを送信しないようにすることはできません。クライアントはこれをstderrとして印刷する必要があるため、2>/dev/null
ローカルでは表示されませんが、他のメッセージssh
(sshpass
あなたの場合)もstderrとして印刷されません。
SSH 以降の認証バナーは、リモートシェルの一部の起動スクリプトから出る可能性が高くなります。*これらのバナーが表示されたら、ssh "$target_ip" date
サーバーの起動スクリプトを確認し、バナーの印刷を担当するコードを見つけて修正する必要があります。犯人が一部のグローバルスクリプト(あなたの/etc
)にいる場合は、その個人スクリプト(あなたの$HOME
)を作成して動作を変更できます。サーバーのログインシェルのドキュメントを参照してください。
バナーが表示されない場合は、ssh "$target_ip" date
問題の現在のスクリプトが非対話型シェルのバナーを抑制することを意味します。この事実を利用して、サーバー上で何も変更せずにバナーをミュートすることができます。
リモート側に初期コマンドを渡さないため、sshpass -p 'password' ssh $target_ip << EOF
SSH サーバーは対話型シェルを起動し、標準入力を読み取り、そこでドキュメントを使用します。
非対話型シェルを起動するには、コマンドを渡します。使用するシェルであり、インタラクティブで起動しないことを確認する必要があります。$SHELL
ここでは、ドキュメントのシェルが何であるかをローカルで知っているので、リモート値や何かに依存しないことをお勧めします。元のリモートシェルはもはや必要ないので、これはexec
良い考えです。
次の例では、要求されたシェルは標準入力がbash
ttyではないため、対話式で開始されません(比較:SSHサーバーがこれを明示的に要求したために問題を引き起こすリモートシェルは、ttyに関係なく対話式で開始されます)。 。
sshpass -p 'password' ssh "$target_ip" 'exec bash' << EOF
echo \$PATH
# example
echo \$HOSTNAME
[...]
EOF
*通常、サーバーの公式のデフォルトシェルは何でも構いません。たとえば、bash
起動スクリプトとは別に無条件に何かを印刷して実行するラッパーなどがありますbash
。これは奇妙なシナリオですが、可能です。おそらくしかし、実際にはそうではありません。