1

我用 C 编写了一个小程序来从登录 SSH 会话的远程用户那里获取 IP

代码 :

int main (){
    char * getIP ;
    getIP = getenv ("SSH_CLIENT");
    printf ("%s", getIP);
    printf("\n");
    return 0;
}

它工作得很好,我有输出

shell# ./a.out

192.168.1.33 39840 22

但我只想打印 IP 地址而不是字符串的其余部分。我不知道如何剪切字符串以仅打印第一部分(255.255.255.255)

我搜索一整天的解决方案但没有成功:/

谢谢你的帮助 : )

更新 !

我发现您可以使用 REMOTEHOST 代替 SSH_CLIENT :)
但是 Larsks 解决方案非常有帮助,值得记住

4

3 回答 3

2

您甚至不需strtok()要这样做,因为您只关心空格前的第一个字符串。使用strchr()定位第一个空格,将其设置为NUL,您就完成了:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main (){
    char *getIP, *mark;
    int i;
    getIP = getenv ("SSH_CLIENT");

    // get the location of the first space character
    mark = strchr(getIP, ' ');

    // set it to 0 (ascii NUL)
    *mark = 0;
    printf ("%s\n", getIP);
    return 0;
}

您实际上可以通过执行以下操作将其折叠一点:

*(strchr(getIP, ' ')) = 0;

代替:

mark = strchr(getIP, ' ');
*mark = 0;

但这不是很清楚,而且进行正确的错误检查会更难。

于 2012-05-27T01:09:34.120 回答
0

您可以拆分getenv()使用返回的字符串strtok(),将字符串拆分为空格。您获得的第一个令牌是 IP 地址。

于 2012-05-27T01:00:23.710 回答
0

永远不应该改变 getenv-result

int main() {

  char firstword[BUFSIZ], *getIP = getenv("SSH_CLIENT");
  if( getIP )
  {
    sscanf( getIP , "%*s", BUFSIZ-1, firstword );
    puts(firstword);
  }
    return 0;
}
于 2012-05-27T11:24:50.937 回答