• ベストアンサー

変数の使用方法

ファイルを読み込み、 任意の文字列だけを変数にするプログラムを記述したのですが、 sscanfでその文字列を各変数に代入し、 if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ の行で展開させようとしたのですが、 確認したところ、取得した値が代入していませんでした。 printf("%s\n", cause);の場合は、実行後、画面に表示するのですが、 変数型に問題があるのでしょうか。 すみませんが、何が問題なのかご教授よろしくお願いいたします。 FILE *fp; FILE *fd; char string[MAX_LEN]; char cause[256],point[256],user[256],passwd[256]; char id[256]; while ((fgets(string, MAX_LEN, fp)) != NULL) {  string[strlen(string) - 1] = '\0'; if(sscanf(string, "connect cause = %s", &cause) == 1){  }else if(sscanf(string, "connect point = %s", &point) == 1){  }else if(sscanf(string, "username = %s", &user) == 1){    if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){    }    pclose(fd);   } } fclose(fp);

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

まだこちらが理解できないので、推測で書きますが、 勘違いがあったらお許しください。 popen("smbmount cause /mnt/date -o username=user","r") で、文字列の中の「cause」と「user」が 自動的に展開されると思っていませんか? 展開するにはstrcatかsprintfを使います。 /*文字列に展開するためのバッファ*/ static char buf[256]; .... /* causeとuserを文字列に展開 */ sprintf(buf, "smbmount %s /mnt/date -o username=%s", cause, user); /*bufに文字列が入っているので、それを使ってpopenを呼び出す*/ if((fd = popen(buf, "r")) != NULL){ ... } のようにします。 なお、最初のbufにstaticを付けたのは、 それを付けないと「バッファオーバーフロー」という 現象が心配だったからです。 付けなくても動作するなら無用ですが…。 (string以下の変数も、これでいいのか心配です。 ですがそれで動いているのなら何も言いません)

996
質問者

お礼

ありがとうございます。 まだまだ未熟なため、分からない部分が多々あったと思います。 現在では、やはりsmbmountとパスワード入力部分が問題なので、別の方法で模索中です。

その他の回答 (2)

回答No.2

char cmd[1024]; sprintf(cmd, "smbmount %s /mnt/%s -o username=%s", cause, point, user); if ((fd = popen(cmd, "r")) ... をしたいのでしょうか? # fd という変数名では、普通のCプログラマなら整数を意図しますが、それはおいといて あと、まだ問題山積です。 なぜ popen() なのか なぜ "r" なのか パスワードは標準入力から入れられるのか? system() と smbmount の password= オプションを使うことは考えましたか?もっとも、これでは、実行中にpsするとパスワードが見えてしまうという欠点があるわけですが。

996
質問者

補足

system()でsmbmountのusernameとpassword、オプションを使用することは当初考えましたが、linuxのコマンドから試みてみましたが、再度パスワードがきかれます。 使用方法が間違っているのかと思いましたが、ヘルプを確認しましたが、同様の結果になりました。 現在は、別の方法で模索中です。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

失礼ですが、このコードでは、 何がやりたいのか私にはわかりません。 >if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ >の行で展開させようとしたのですが、 といっても、ここには「展開」という動作をする命令が 見あたらないと思いますが…。 常に 「smbmount cause /mnt/date -o username=user」と「r」 という文字列を引数にpopen(パイプオープンでしょうか)を起動するだけで、 それ以外のことをしているようには見えません。 あと、if~else if~の並びも、わかりません。 「sscanf(string, "username = %s", &user) == 1」が 成り立ったときだけ、 「fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL」 を実行したいのでしょうか? また、これを囲んでいるifは意味がないように思います。 よろしければ説明をおねがいします。

996
質問者

補足

linuxのファイルサーバのsambaにあります、smbmountのコマンドを使用しクライアントの共有ファイルをマウントし、/mnt/dateに共有データを閲覧するようにするプログラムを記述しています。 linuxでのコマンドからの使用方法は、 #smbmount //マシンの名前/共有フォルダ /mnt/project -o usernamed=administrator #>パスワード入力になります。 マウントがしっかりと動作した場合、クライアントマシンの共有フォルダの内容が/mnt/projectフォルダにて閲覧できるようになります。 また、マウントを解除する場合は、 #umount /mnt/projectになります。 プログラムの記述は、 FILE *fp; FILE *fd; char string[MAX_LEN]; char cause[256],point[256],user[256],passwd[256]; fp = fopen("file.conf", "r"); while ((fgets(string, MAX_LEN, fp)) != NULL) {  if(sscanf(string, "connect cause = %s", &cause) == 1){  }else if(sscanf(string, "connect point = %s", &point) == 1){  }else if(sscanf(string, "username = %s", &user) == 1){  }else if(sscanf(string, "password = %s", &passwd) == 1){   if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){    fputs("passwd\n",fd);    system("umount /mnt/date");   }   pclose(fd);  } } fclose(fp); です。 file.confの中は、 connect cause = //caprice/docomo →cause connect point = //homw/www →point username = administrator →user password = yumijunsanasyuto →passwd です。 現状では、 if((fd = popen("smbmount cause /mnt/date -o username=user","r")) != NULL){ の"cause"、"user"に文字列を入れて、smbmountのコマンドを実行させ、fputsでパスワードを入力させるプログラムを記述しようとしていますが、文字列とパスワード入力が動作していない状況です。 説明不足で申し訳ありません。 現在も、色々と試しているのですが、あまり芳しくありません。すみませんが未熟者にご教授よろしくお願いいたします。

関連するQ&A