2017-06-13 54 views
2

在Solaris中,我需要获取特定进程正在使用的IP地址(sshd session),我有他的ID。
他们在linux上如何做到这一点?在读取netstat.c源文件后,这是流程:
迭代位于/ proc/ProcessId/fd /的进程文件描述符,
如果迭代的文件描述符是套接字,它们将读取链接,打开并最终读取文件描述符。检测文件描述符是否是solaris 11.0中的套接字,并提取ip地址

所以在solaris中,我可以检测到进程的套接字文件描述符。

int fd=NULL; 
struct dirent *dentp; 
while ((dentp = readdir(dirp)) != NULL) { //iterate file descriptors 
    fd = atoi(dentp->d_name); 
    struct stat statb; 
    char temp_dir_path [100]; 
    if (stat(temp_dir_path, &statb) != -1) 
    { 
     if (S_ISSOCK(statb.st_mode)) 
     { 
     //What to do here ?? temp_dir_path is /proc/12345/fd/4 

我看到有喜欢的getpeername(..),getsockname(..)他们收到的PARAM的当前上下文过程的文件描述符的方法,我想读文件描述符另一个进程。
我可以打开文件描述符并将其转换为struct sockaddr_in吗?

套接字文件描述符结构是Linux和Solaris之间的不同。我想我需要做什么,他们在做PFILES/lsof的

回答

2

我看到有喜欢的getpeername方法(..),getsockname( ..)它们作为参数接收当前上下文进程的文件描述符,我想为另一个进程读取文件描述符。 我可以打开文件描述符并将其转换为struct sockaddr_in吗?

号可以open(),并使用文件描述符open()回报,并尝试在你得到的文件描述符使用getpeername()getsockname()。它甚至可能工作。

使用方法pfiles的用法可能会更好。 Per the pfiles man page

PFILES

报告fstat(2)fcntl(2)信息在 每个进程所有打开的文件。 对于网络端点,还提供了本地(和同行如果连接了 )地址信息。对于套接字, 套接字类型,套接字选项和发送和接收缓冲区大小也提供 。另外,如果 信息可从/ proc/pid/path获得,则会报告该文件的路径。这不一定是 用来打开文件的同名。有关更多信息,请参阅proc(4)。

pfiles源代码可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/ptools/pfiles/pfiles.c

的Solaris提供了一个libproc接口库已经做了你需要的东西被发现。 pfiles使用 - 库提供诸如pr_getpeername()pr_getsockname()的调用。您可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libproc/common/pr_getsockname.c

中看到实现请注意,有实际的系统调用来直接从内核获取您需要的内容。

开放的Solaris手册页libproc库可以在http://illumos.org/man/3proc/all发现他们很可能是基本相似的Solaris 11 libproc实施。

要使用这些工具,你必须非常小心。 From the Pgrab man page for the function used to grab a process

抓取过程是一种破坏性行为。停止进程将停止执行其所有线程。停止进程的影响取决于该进程的目的,即 。例如,如果一个人停止主要进行计算的进程 ,则在其停止的整个时间其计算被延迟 。但是,如果相反,这是一个 活动的TCP服务器,则接受待办事项可能会填充导致连接 错误和潜在的连接超时错误。

有些选项可以阻止抓取的进程,并以只读方式抓取它。

+0

谢谢我将在明天工作..当我试图打开()作为根目录进程的子​​进程的文件描述符时,它返回-1 – ilansch

+0

* easy *解决方案是类似'popen(“pfiles 1234“,”r);'并且只是解析输出,这样做的好处是不会依赖于没有文档或者稀疏文档的Solaris内部实现,但是性能会降低 –

+0

这个我可以从批处理脚本中完成..但是它不能好,因为pfiles在检查过程中暂停过程。我希望避免暂停,因为我只需要快速读取。 – ilansch