c言語でunixにおけるパスワード変更のプログラムを作っています。
etc/shadowのパスワードの部分を書き換えたいのですがいまいちファイルの取り扱いがよくわかりません。

ファイルの中のユーザを検索して、ファイルの一部分を書き換えるのには
どうしたらよいのでしょうか?

よろしくおねがいします。

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

A 回答 (2件)

演習問題としてですか?



もし実用的にそれをしたいというなら、ファイルのロックの問題とかもありま
すし、どんなセキュリティホールを作ってしまうかわからないので、独自に作
るのはやめた方が無難だと思います。それよりは、passwd や chpass を外部
プログラムとして呼び出すように設計する方がいいでしょう。

演習問題としてなら、UNIXでは、ファイルのある部分(10byte程度)だけ変更
するというのは、基本的には困難です(というより無理です)。全体をメモリ
に読み込んで、必要な部分を変更して、全体を書き出すということになるでしょ
う。

メモリに読み込む際には、1行ずつ読み、(動的に確保した)別々の配列に入
れ、先頭が該当するユーザ名なら、パスワード部を適当に変更します。変更す
るには、パスワードの暗号化アルゴリズムとして、何を使うかを決めた上で、
暗号化関数を呼びます。通常は crypt でいけるでしょう。

ただし、異常な長さの行があるときとか、異常な行数とか、最後の行に改行が
ないとか、フォーマットが変とか、そういうのに完全に対応するには、ちょっ
とした経験がいると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

演習問題としてやります。
後半でおっしゃっていただいているのを
試してみたいと思います。

で、できたら前半のも・・・(無理かも・・・)

なにぶん経験が浅いものですから・・・(^-^;

がんばってみようとおもいます。
本当にへんとうありがとうございました。

お礼日時:2002/01/17 20:46

UNIX処理系によってはPAMという枠組みが用意されていて


「pam_」で始まる名前の関数で統一的に扱えるようになっているものがあります。
(最近の、linux、Solaris、FreeBSDなどで使えるようです。)

PAMがない場合は、前の方がおっしゃっている通りだと思います。
    • good
    • 0
この回答へのお礼

PAMですか・・・
初めて聞きました。
調べないとだめですね。調べてみます。

ありがとうございました。

お礼日時:2002/01/17 20:47

このQ&Aに関連する人気のQ&A

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

このQ&Aと関連する良く見られている質問

Qファイル読み込みで一部分書き換えについて

C++でテキストファイルから先頭の一部分を読み込んで
その一部分だけ更新するプログラムを作りたいんですけど
どうすればよろしいでしょうか?

テキストファイルの中身例(test.txt)
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA

これを読み込んで

↓↓↓↓↓↓↓↓

たとえば先頭の三文字だけ変えたいとか(test.txt)
BJDAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA

これくらいの行数でしたら

string s1,s2,s3;

fin.open("test.txt");
fin>>s1;
fin>>s2;
fin>>s3;
fin.close();

fout.open("test.txt");
fout<<s1<<"\n";
fout<<s2<<"\n";
fout<<s3<<"\n";
fout.close();
でもなんとかなりそうですけどもっと大量になったときにあまりに
行が長くなりそうなんで他の方法は何かないでしょうか?
ちなみに関係あるか分かりませんがコンパイラはVisualC++2005です。

C++でテキストファイルから先頭の一部分を読み込んで
その一部分だけ更新するプログラムを作りたいんですけど
どうすればよろしいでしょうか?

テキストファイルの中身例(test.txt)
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA

これを読み込んで

↓↓↓↓↓↓↓↓

たとえば先頭の三文字だけ変えたいとか(test.txt)
BJDAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA

これくらいの行数でしたら

string s1,s2,s3;

fin.open("...続きを読む

Aベストアンサー

fstream fs("test.txt",ios::in | ios::out);
fs << "BJD";
fs.close();

文字数が変動しないなら、こんな感じの処理で書き換えることができます。
そうでない場合は、1行ずつ読み込んで書き換えたい行だけに操作を加えるといった処理をしなければならないと思います。

QAdmin権限ユーザと一般ユーザで共有のファイルを操作したい

WindowsXP、VC++6.0 の環境です。
<やりたいこと>
Admin権限ユーザ、一般ユーザで情報を共有したい。
どちらのユーザでログオンしたとしても、
「同じ格納場所」に情報をリード/ライトする処理を
したい。

「同じ格納場所」としてレジストリを考え、以下の質問をしましたが回答がなく、またテストしてもダメそうでした。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=545935

で、ファイルを共有しようと考えましたが、Admin権限で作成したファイルに一般ユーザはライトできませんでした。
一般ユーザでもライトできるように権限を変更する
Win32API関数などはあるでしょうか。

または、上記の要求を満たせるような方法はあるでしょうか。
ご存知の方がいればアドバイスお願いします。

Aベストアンサー

Admini権限でファイル作成した場合に
Everyoneに書き込み権限を付与するように作成されたら
いかがですか?ダメ?
キーワードは、ACLs・・かな?
http://www.loa.espci.fr/winnt/cacls/cacls.htm
このURLのソースを解析して作成してみては?

QC言語でのファイル検索&ファイル書き換えについて

C言語である特定のフォルダを指定して、その階層内(サブフォルダも含む)にあるファイル、例えばsample_nameをファイル名に含むファイルを見つけ、そのファイル内の例えば下のような書き換えを行えるようなプログラムはどうつくればいいのでしょうか。

元ファイル
~sample_name1.txt~
aaa, 10
bbb, 20
ccc, 30

~sample_name2.txt~
aaa, 30
ccc, 12
bbb, 20
ddd, 15

上のように各ファイルにaaaやbbbが共通に含まれています。

対象ファイル:sample_name
対象文字列:aaa
変換後:100

変換後ファイル
~sample_name1.txt~
aaa, 100
bbb, 20
ccc, 30

~sample_name2.txt~
aaa, 100
ccc, 12
bbb, 20
ddd, 15

Aベストアンサー

★Windows OS の環境だと仮定して回答します。
・C 標準関数だけではフォルダからファイルを検索する方法はありません。
 その代わりに Win32 API とかならフォルダからファイルを検索するものが用意されています。
 (1)FindFirstFile(最初のファイルを検索)
 (2)FindNextFile(続きのファイルを検索)
 (3)FindClose(ファイル検索を閉じる)
 この3つの API を再帰処理でファイルを検索します。
 http://oshiete1.goo.ne.jp/qa3397883.html→『再帰処理の考え方について詳くかかれたサイトありますか?』
 このリンクの回答 No.2 を参考にして下さい。
・ファイル名は『fdFile.cFileName』構造体で取得できます。
 これを使って C 標準関数の fopen、ファイル処理、fclose の手順で元ファイルを
 書き換えるようにプログラミングすれば良いです。
・以上。Windows 環境だと仮定して回答しました。

参考URL:http://oshiete1.goo.ne.jp/qa3397883.html

★Windows OS の環境だと仮定して回答します。
・C 標準関数だけではフォルダからファイルを検索する方法はありません。
 その代わりに Win32 API とかならフォルダからファイルを検索するものが用意されています。
 (1)FindFirstFile(最初のファイルを検索)
 (2)FindNextFile(続きのファイルを検索)
 (3)FindClose(ファイル検索を閉じる)
 この3つの API を再帰処理でファイルを検索します。
 http://oshiete1.goo.ne.jp/qa3397883.html→『再帰処理の考え方について詳くかかれたサイトありますか?...続きを読む

QUNIX C ファイル出力

UNIX Cにてあるテキストファイルの中身(1行分)を、別のテキストファイルに出力したいのですが、どうすれば、いいでしょうか。
例。A.txt
123 yano 200612
  ↓
B.txt
123 yano 200612

Aベストアンサー

★サンプルを紹介しましょう。

/* 区分が '0' のレコードだけを、B.txt に書き出す処理 */
static void ZeroRecordOutput( FILE *fp, FILE *fo )
{
 char buff[ BUFSIZ ];
 
 while ( fgets(buff,BUFSIZ,fin) != NULL ){
  if ( buff[0] == '0' ){ ←区分が '0' だから!
   fputs( fo, buff );
  }
 }
}

引数:
・fp は入力ストリーム(A.txt)のファイル・ポインタです。
・fo は出力ストリーム(B.txt)のファイル・ポインタです。
・どう。簡単でしょう。
・行単位で入出力すると簡単に処理できますよ。

補足:
・回答者 No.1 ~ No.7 さんの回答&アドバイスをよく読みましょうね。
・最後に人に頼りすぎないように!頑張りましょう。では、さようなら。

QUNIX上でのファイルopenについて

C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。
シェルで、ファイル名の取得を行っていっています。
shell
----
ls /home/data > /home/src/infile.txt
----
C
-----------------------------
FILE *fp;
char y[30]="/home/data/";
// ↓aには上記シェルにて取得した1件目のファイル名が入っています。
strcat(y,a);
// ↓ここでは絶対パスが正しく表示されます
printf("ddd:%s\n",y);
// ddd:/home/data/11.txt
// ↓ここでfile open errorで一件目で終了してしまいます。
if ((fp = fopen(y,"r")) == NULL){
printf("file open error!!\n");
exit(1);
}
-----------------------------
このようなファイルの読込みのやり方ができるのか教えてください。
もしできるのであるのなら、そのやり方も教えてください。
わかりにくい文章ですが、お願いします。

C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。
シェルで、ファイル名の取得を行っていっています。
shell
----
ls /home/data > /home/src/infile.txt
----
C
-----------------------------
FILE *fp;
char y[30]="/home/data/";
// ↓aには上記シェルにて取得した1件目のファイル名が入っています。
strcat(y,a);
// ↓ここでは絶対パスが正しく表示されます
printf("ddd:%s\n",y);
// ddd:/home/data/11.txt
// ↓ここでfi...続きを読む

Aベストアンサー

こんにちは。

 まず、aliasと打って、lsコマンドに余分な別名が付いていないか確認してください。付いている場合、\lsとして、aliasをパスします。"alias ls 'ls -F'"などとしてあると、*などの余分な文字がくっつきます。また、厳密には"\ls -1 >"とします。-1は、1カラムで表示するというオプションです。

 次にyの配列数ですが、PATH_MAXという定数がありますので、こちらを使用してください。

 それから数件表示/オープンするのであれば、strcatでyに連結すると、次のデータはどうなると思いますか?

 オープンが失敗する理由ですが、viコマンドでそのファイルをオープンできますか?つまり、実行ユーザにリードのアクセス権がありますか?また、デバッガで止めて、確実に目的のファイルを指していることを確認してください。

 最後に、「プログラミング言語C」第2版はお持ちでないですか?
http://www.pro.or.jp/~fuji/computerbooks/c/c.kernighan.html
お持ちでないなら、本屋に急行してください。C言語を作った人によるC言語の本で、「Cのバイブル」、「KR本」とも言われるものです。この中に、外部コマンドからファイル名をもらわなくても、ディレクトリの内容を再帰的に表示するプログラムの例があります。

こんにちは。

 まず、aliasと打って、lsコマンドに余分な別名が付いていないか確認してください。付いている場合、\lsとして、aliasをパスします。"alias ls 'ls -F'"などとしてあると、*などの余分な文字がくっつきます。また、厳密には"\ls -1 >"とします。-1は、1カラムで表示するというオプションです。

 次にyの配列数ですが、PATH_MAXという定数がありますので、こちらを使用してください。

 それから数件表示/オープンするのであれば、strcatでyに連結すると、次のデータはどうなると思いま...続きを読む


人気Q&Aランキング

おすすめ情報