tcpdump无法写入pcap文件权限被拒绝

hwazgwia  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(823)

我正在为我的java应用程序开发一个网络监控解决方案,这样我就可以嗅探机器接口上的数据包,并将结果转储到滚动pcap文件中。当从java代码启动tcpdump命令(使用sudo)时,我得到 tcpdump: /path/to/app/log/GTP00: Permission denied 细节
该命令使用 Runtime.getRuntime().exec(command) 哪里 command 是字符串值 sudo tcpdump -i eth0 -w /path/to/app/log/GTP -W 50 -C 20 -n net 10.246.212.0/24 and ip 启动java应用程序的用户是“testuser”,它属于组“testgroup”。允许此用户sudo tcpdump。
目标目录具有以下属性: [testUser@node ~]$ ls -ld /path/to/app/log drwxrwxr-x. 2 testUser testGroup 4096 Feb 4 15:40 /path/to/app/log 更多细节
从命令行启动命令可成功地在指定文件夹中创建pcap文件。 [testUser@node ~]$ ls -l /path/to/app/log/GTP00 -rw-r--r--. 1 tcpdump tcpdump 1276 Feb 4 16:12 /path/to/app/log/GTP00 我开发了一个简化的java应用程序,用于测试

package execcommand;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ExecCommand {

    public static void main(String[] args) {
        try {

            String command;
            String line;
            String iface = "eth0";
            String capturePointName = "GTP";
            String pcapFilterExpression = "net 10.246.212.0/24 and ip";
            int capturePointMaxNumberOfFilesKept = 50;
            int capturePointMaxSizeOfFilesInMBytes = 20;

            command = "sudo tcpdump -i " + iface + " -w /path/to/app/log/"
                    + capturePointName + " -W " + capturePointMaxNumberOfFilesKept + " -C "
                    + capturePointMaxSizeOfFilesInMBytes + " -n " + pcapFilterExpression;

            Process process = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            while ((line = br.readLine()) != null) {
                System.err.println(line);
            }
        } catch (IOException ex) {
            Logger.getLogger(ExecCommand.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

此测试程序由同一用户启动,成功地在指定的文件夹中创建pcap文件。 [testUser@node ~]$ ls -l /path/to/app/log/GTP00 -rw-r--r--. 1 tcpdump tcpdump 1448 Feb 4 16:21 /path/to/app/log/GTP00 然后,我可以推断出这个问题在某种程度上仅限于我的java应用程序。我的java应用程序就是这样启动的: exec java -Dknae_1 -Djavax.net.ssl.trustStorePassword=<trust_pass> -Djavax.net.ssl.trustStore=/path/to/app/etc/certificates/truststore -Djavax.net.ssl.keyStorePassword=<key_store_pass> -Djavax.net.ssl.keyStore=/path/to/app/etc/certificates/keystore -d64 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8887,suspend=y -XX:-UseLargePages -Xss7m -Xmx64m -cp /path/to/app/lib/knae.jar:/path/to/app/lib/xphere_baseentity.jar:/path/to/app/lib/mysql.jar:/path/to/app/lib/log4j-1.2.17.jar:/path/to/app/lib/tools.jar:/path/to/app/conf:/path/to/app/lib/pcap4j-core-1.7.5.jar:/path/to/app/lib/pcap4j-packetfactory-static-1.7.5.jar:/path/to/app/lib/jna-5.1.0.jar:/path/to/app/lib/slf4j-api-1.7.25.jar:/path/to/app/lib/slf4j-simple-1.7.25.jar com.app.package.knae.Knae knae_1 更新
我可以在 /tmp . 我也试过给777个权限给 /path/to/app/log 无济于事。这是两位导演的态度:

[testUser@node ~]$ ls -ld /tmp
drwxrwxrwt. 10 root root 4096 Feb  6 10:13 /tmp
[testUser@node ~]$ ls -ld /path/to/app/log
drwxrwxrwx. 2 testUser testGroup 4096 Feb  6 09:25 /path/to/app/log

我将根据需要提供任何其他信息。
为什么tcpdump抱怨不能写这个文件?

htzpubme

htzpubme1#

在命令行中使用绝对路径,而不是“ sudo “和” tcpdump "
使用 ProcessBuilder.class 而不是 Runtime.exec() 因为可以指定工作目录,所以可以在选项中使用空格等。
在tcpdump命令中必须使用 -Z 用于指定用户的标志,因为pcap使用不同于调用者。在服务器上检查此链接故障:tcpdump permisson denied

相关问题