1

SSHセッションにログインするリモートユーザーからIPを取得するための小さなプログラムをCで作成しました

コード :

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) のみを印刷するために文字列をカットする方法がわかりません。

私は終日解決策を検索しますが、成功しません:/

助けてくれてありがとう:)

アップデート !

SSH_CLIENT の代わりに REMOTEHOST を使用できることを発見しました:)
しかし、ラースクのソリューションは非常に役立ち、覚えておく価値があります

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 に答える