
サーバーにTelnetで接続し、特定のポートのpidを探したいと思います。その後、そのPIDを殺します。
私はこれを試しました。
ssh -T [email protected] ; "netstat -lnpt ; awk '$4 ~ /:2020$/ {sub(/\/.*/, "", $7); print $7}'"
netstat
これを行うには、コマンドを使用する必要があります。
答え1
あなたはそれを逃しましたパイプの特徴(|
代わりに;
)コマンドを使用してください。私はこれを提供する:
ssh -t [email protected] "sudo netstat -plnt | grep 2020 | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"
sudo
サーバーにインストールされてアクセスできるとします。私のテストでは、netstat
オプションを正しく使用するためにこの機能が必要になることがあります-p
。
私はawkスクリプトを複雑すぎるのを避けるためにここでgrep
+を使用することを好みます(私の考えでは)。sed
-t
sudo
:コマンドを実行するためのユーザーパスワードを入力できます。grep 2020
: フィルタポート番号awk '{print \$7}'
awk
:正しいフィールドを選択しましょうsed s+/.*++g
:削除/
とその後の文字(注:簡潔にするために、この+
記号はここの既存の記号を置き換えます/
)sort -u
:そのポートを使用する複数のプロセスがある場合に備えて(IPv4とIPv6の両方を使用している場合に発生します)xargs kill
:kill
標準入力を引数として使用します。
sudo
他のユーザーが終了したいプロセスを所有している場合は、最後のプロセスに以下を追加する必要があります。sudo xargs kill
たとえば、変数を使用することもできます(ここではコマンドを区切るためにセミコロンを使用し、パイプは必要ありません)。
[email protected] ; port=2020 ; ssh -t $server "sudo netstat -plnt | grep $port | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"
答え2
あなたは目標に十分近づいています。しかし、まだ足りないものがあります。
- ホストIPの後にはセミコロンは必要なく、リモートコマンドはIPの直後に来る必要があります。したがって、セミコロンを削除します。
- awkの前にある他のセミコロンをパイプ記号に置き換えます
|
。これにより、netstat出力がawkに移動します。 - すべてのドル記号はバックスラッシュでエスケープする必要があります。それ以外の場合は、ローカルシステムで評価されます。
上記を完了すると、印刷されたPID(存在する場合)が届きます。その後、そのPIDをkillコマンドに渡す必要があります。ここで最も簡単なようですが、xargs Killを使用することをお勧めします。この PID は kill コマンドによって承認されます。
したがって、最終バージョンは次のようになります。
ssh -T [email protected] "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"
最高の姿ではありませんが、あなたのアプローチは私にとって効果的です。