人に聞けない痔の悩み、これでスッキリ >>

c言語でsambaのsmbmountを使用し、各クライアントの共有フォルダをmountし、linuxからでも閲覧するようなプログラムを作成しています。

現在、system()関数を使用し、smbmountまでは動作確認しているのですが、smbmount後のpasswordの自動入力のプログラム記述が分からない状況です。

popenやfopenなどの関数を使用してみましたが、問題は解消できませんでした。

すみませんが、ご教授よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

smbmountのコマンドラインオプション"-o password=xxxx"でパスワードを指定できるのは分かっているんですよね.それだとpsコマンドなんかでパスワードが見えてしまうから,パイプか何かでsmbmountに食わせたいと.



ああいうパスワード取得プログラムは,直接/dev/tty(そのプロセスに接続されている制御端末)からパスワードを取得します.標準入力を経由しないんでパイプでは通常は無理です.ただ,多くのプログラムはttyのオープンに失敗した後,標準入力からパスワードを取得するという作戦をとります.ですから,ttyをオープンできないようにしてやればパイプでパスワードを取れるようになる場合があります.

で,ttyをオープンできないようにするには,制御端末から切り離してしまえばOKです.それにはまず/dev/ttyをオープンしてから,そのファイルディスクリプターをioctl()で指定して,TIOCNOTTYコマンドで切り離します.↓

int
main ( int argc, char **argv )
{
int pfd[2];
int pid;
int fd;
char pswd[] = "xxxxxxx\n";

pipe (pfd);

if ( (pid = fork ()) == 0 ){
/* 子プロセス */
/* パイプを標準入力につなぐ */
close (pfd[1]);
close (0);
dup (pfd[0]);
/* /dev/ttyをオープン */
fd = open ("/dev/tty", O_RDONLY);
/* 制御端末切り離し */
ioctl (fd, TIOCNOTTY);

system ("smbmount //srv/rsc /mntpnt");
exit (0);
}
/* 親プロセス */
close (pfd[0]);
write (pfd[1], pswd, strlen(pswd));
exit(0);
}

こうすると,子プロセスをpsコマンドで見るとTTYの項目が?になっていて,制御端末から切り離されます.smbmountが上記の作戦にしたがうならこれでいけます.ちなみにうちではOKでした.sambaのバージョンによってはもしかしたらだめかも.
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変に参考になりました。

お礼日時:2003/05/16 14:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング