我正在为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应用程序的用户是属于“ testGroup”组的“ testUser”。允许该用户sudo tcpdump。
目标目录具有以下属性:
[testUser@node ~]$ ls -ld /path/to/app/log
drwxrwxr-x. 2 testUser testGroup 4096 Feb 4 15:40 /path/to/app/log
更多详细信息
从命令行启动命令SUCCESFULLY在指定文件夹中创建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);
}
}
}
由同一用户SUCCESFULLY启动的此测试程序将在指定的文件夹中创建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
中写入pcap文件。
我还尝试了将/path/to/app/log
的777权限无济于事。
这是两个服装的服装:
[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抱怨无法写入此文件?
答案 0 :(得分:0)
sudo
”和“ tcpdump
” ProcessBuilder.class
代替Runtime.exec()
,因为可以指定工作目录,可以在选项等中使用空格。-Z
标志来指定用户,因为PCAP的使用与调用方的使用不同。在ServerFault上检查以下链接:tcpdump permisson denied