元の接続を乱すことなく unix ソケット上のレスポンスを監視し、スクリプトにパイプして処理したいと思います
tcp接続のためのtcpdumpでこれを行う方法は知っていますが、ローカルのunixソケットのための解決策を見つけることができません
こんなことも可能なのか?
69 None 2012-10-07
2つのソケット間のゲートウェイとして機能し、流れる全てのデータをログに記録するアプリを作ることで、そうすると主張している人がいます。ソケットをタップすることはできませんが サービスを再起動して この男のアプリを使うように調整すれば 全てのトラフィックを見ることができます
以下がその投稿へのリンクです。Unix ソケットスニッファー
他にも、ソケットに接続されているプロセスIDを見つけて、ソケットのファイルディスクリプタをlsofで見つけて、straceを使ってファイルディスクリプタをタップする方法もあります
ソケットを使用しているクライアント/サーバを停止して再設定することができる場合、私は常に最初の方法をお勧めします
誰かが私たちを啓発してくれることを願っています。)
Good luck
16 Valor 2012-10-07
socatを使うことができます
sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original
上記で何が起きているのか。まず、元のソケットを sock.original に移動します。Socat は元の場所に新しいソケット (‘UNIX-LISTEN’) を作成し、すべてを元のソケット (‘UNIX-connect’) に転送します。v は socat に STDERR にも出力するように指示します
88 storoj 2013-04-01
また、ソケットの両側のプロセスのいずれかで strace を使ってみるのもいいかもしれません。私の本番環境では、socat を使用していませんが、strace を使用しています
どのような有用な目的のためにも、何か大きなものに-sを設定することは必須です
6 omnigrok 2014-09-21
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original
// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original
// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089
then:
sudo tcpdump -i lo -netvv port 8089
4 任喜军 2019-04-04
少し遅れましたが、リスニングプロセスからソケットトラフィックを転送できない人のために systemtap スクリプトを修正しました。私は Red Hat Enterprise Linux 7 でしかテストしていませんが、参照している構造は一般的なもので、(うまくいけば)あまり変わりません
/*
* watch_unix_socket.stp
*
* This is a simply more modern version of the script found here:
* https://sourceware.org/systemtap/wiki/WSunixSockets
*
* The first argument is the location of the file descriptor for a UNIX socket.
* To find this address, for example, for the Docker socket run:
*
* # lsof 2>&1 | awk '/docker.sock/ {print $7}' | grep -v '0t0' | sort -u
* 0xffff8ed0b4eb1800
*
* And use that address to run this systemtap script:
*
* # stap watch_unix_socket.stp 0xffff8ed0b4eb1800
*/
probe begin {
printf("Watching input into socket 0x%x...\n", $1);
}
probe kernel.function("unix_stream_sendmsg") {
if ($sock->sk != $1) {
printf("%d %s is accessing %p\n", pid(), execname(), $sock->sk);
printf("====================\n");
len = 0
for (i = 0; i < $msg->msg_iovlen; i++) {
len += $msg->msg_iov[i]->iov_len;
}
printf("%d [", len);
for (i = 0; i < $msg->msg_iovlen; i++) {
printf("%s", user_string_n($msg->msg_iov[i]->iov_base, $msg->msg_iov[i]->iov_len));
}
printf("] [");
for (i = 0; i < $msg->msg_iovlen; i++) {
printf("%s", user_string_n($msg->msg_iov[i]->iov_base, $msg->msg_iov[i]->iov_len));
}
printf("]\n\n");
}
}
私はそれをGithub Gistとして私のページに更新しています
1 Robb Manes 2020-06-12