2012-04-02 19 views
1

私はLinuxシステムコールを使ってユーザーパスワードを変更するためのCプログラムを書こうとしています。 /etc/passwd/etc/shadowファイルを使用しようとしましたが、パスワードが暗号化されているため問題があります。これを解決する手助けができますか?Linuxのシステムコールを使用してCでユーザパスワードを変更するにはどうすればよいですか?

無効メイン(int型のargc、char型** ARGV){

uid_t uid; 

struct passwd *pw; 

uid = getuid(); 

if (argc > 1) 
    pw = getpwnam(argv[1]); 
else 
    pw = getpwuid(uid); 
//system("passwd"); 
//printf("%i",execl("/usr/bin/passwd","passwd",pw->pw_name)); //here I tried to use execl but it returns error 

}

は、私が( "passwdの")システムを使用するが、私は私の先生がそれを受け入れるだろうとは思いません。残りの部分では、私はちょうどgetpwを理解しようとしていた...もの、それは重要ではない。

+0

何を試しましたか?あなたのコードは何ですか?これを行うための標準的なシステムコールはありません。ロジックは 'passwd'プログラムと1つまたは2つの他のプログラムにカプセル化されています。 (あなたが必要とするシステムコールは、 'passwd'プログラムを実行する' system() 'ステートメントです)。 –

+1

" passwd "は十分です。完全な理解なしにこれらのファイルを扱うのは危険です。そうしないと、セキュリティが損なわれる可能性があります。また、私は自分の "passwd"コマンドのユースケースを見ません。 –

答えて

2

これにはputpwentを使用できます。コメントでJonathan Lefflerが述べたように、シャドウファイルを更新する場合は、putspentが必要です。

これを行うには最も簡単でおそらく最も移植性の高い方法は、をsystem(3)またはpopen(3)で呼び出すことです。

+0

'/ etc/shadow'には[' putspent() '](http://linux.die.net/man/3/putspent)などが必要です。暗号化されたパスワードを '/ etc/passwd'に入れている人はいますか? –

+0

@JonathanLeffler私はputpwentアップデートの影があると思いました。 – cnicutar

+0

@ JonathanLefflerいいえ、実際には影を更新していないようです。確かに ''/etc/passwd' 'ではなく、一般的なpasswdファイルを対象としています。 'system(3)'はこのために行く方法のようです。 – cnicutar

1

WindowsとOS Xの開発の背景からLinuxにソフトウェアを書き始めたときに私が最初に学んだのは、コマンドラインユーティリティが捨てられるのではなく、受け入れられるということです。 C APIやコマンドラインユーティリティを使用するオプションがある場合でも、戻りコードが0であるかどうかを気にしない限り、forkexecにはよりスマートで信頼性が高いことがよくあります(popenを使用しないでください)。 C APIを使用するよりも。

実際には、コマンドラインユーティリティを呼び出すのは、がアプリケーションのすべてのパフォーマンスビットを必要としない限り、CのAPIを呼び出すのと同じです。実際には関数名がユーティリティ名で、パラメータがコマンドライン引数であるAPIです。

あなたの質問に答えて:execpasswdを試してください。それはあなたの問題をすべて処理します。

関連する問題