• ベストアンサー

ファイルの書き換え

punchan_jpの回答

  • ベストアンサー
回答No.1

演習問題としてですか? もし実用的にそれをしたいというなら、ファイルのロックの問題とかもありま すし、どんなセキュリティホールを作ってしまうかわからないので、独自に作 るのはやめた方が無難だと思います。それよりは、passwd や chpass を外部 プログラムとして呼び出すように設計する方がいいでしょう。 演習問題としてなら、UNIXでは、ファイルのある部分(10byte程度)だけ変更 するというのは、基本的には困難です(というより無理です)。全体をメモリ に読み込んで、必要な部分を変更して、全体を書き出すということになるでしょ う。 メモリに読み込む際には、1行ずつ読み、(動的に確保した)別々の配列に入 れ、先頭が該当するユーザ名なら、パスワード部を適当に変更します。変更す るには、パスワードの暗号化アルゴリズムとして、何を使うかを決めた上で、 暗号化関数を呼びます。通常は crypt でいけるでしょう。 ただし、異常な長さの行があるときとか、異常な行数とか、最後の行に改行が ないとか、フォーマットが変とか、そういうのに完全に対応するには、ちょっ とした経験がいると思います。

yoyomi
質問者

お礼

ありがとうございます。 演習問題としてやります。 後半でおっしゃっていただいているのを 試してみたいと思います。 で、できたら前半のも・・・(無理かも・・・) なにぶん経験が浅いものですから・・・(^-^; がんばってみようとおもいます。 本当にへんとうありがとうございました。

関連するQ&A

  • ファイルの書き換えについて

    ファイルの書き換えについて ファイルの書き換えについて質問です。 特定のフォルダ(サブフォルダ含む)からあるテキストファイルを検索して、 その検索された複数のファイルの同一部分の内容を 一斉に変更することはできるでしょうか? フリーソフトウェアなどありましたらよろしくお願いします。

  • ファイル操作について、テキストファイルの書き換え

    よろしくお願いします。 データファイルAからデータを取得して、テキストファイルBの内容の一部を取得したデータで書き換えるという操作を行うプログラムを作りたいです。 具体的には、 データファイルA[A.txt]の中身 111 222 333 444 テキストファイルB[B.txt] 文字列1="123" 文字列2="234" 文字列3="345" 文字列4="456" というような二つのファイルを読み込み、B.txtの""で囲まれた部分を、A.txtで取得したデータで置き換えるような操作を行いたいのですが・・。 使用する言語としてはスクリプト言語であるperl、もしくはプログラム作成経験があるCを使用しようと思っています。(perlは未経験で入門書を読んでいるレベル)

    • ベストアンサー
    • Perl
  • PerlでLinuxのユーザー認証・管理プログラム

    ブラウザでLinuxのユーザー名とパスワードと入力して、 ユーザー認証してログイン後、Linuxユーザーの パスワードを自分で変更できるプログラムが作りたいのです。 /etc/passwdにパスワードが直接記録されていれば簡単なのでしょうが、 シャドウパスワードなので苦労しています。LinuxはFedora Core3です。 まず、/etc/shadowに記録されているような、 $1$ではじまる暗号化されたシャドウパスワードをPerlで作るには どのようにしたらいいのでしょうか。 pwconvのソースをみたらどんなアルゴリズムかわかると思い、 shadow-utilのSRPMをインストールしてみたりしましたがわかりませんでした。PHPのメーリングリストに $salt = substr(md5(microtime()), 0, 9); return crypt($password, "$1$" . $salt); このようなコードがあったのですが、これでは$saltが毎回 代わってしまい、よくある $salt=substr(暗号化されたパスワード,0,2); if(crypt($pass,$salt) ne 暗号化されたパスワード){ &err("パスワードが違います"); } のような認証ができないのではないかと思いました。 Linuxではどのようなアルゴリズムでシャドウバスワード を作り、パスワードの認証をしているのでしょうか。 つまり、簡単にいうとPerlでシャドウパスワードを使った Linuxユーザーのパスワード認証と パスワード変更ができないか、ということなのです。 また、Perlでシャドウパスワードなど作らなくても system()などを使ってLinuxのコマンドを使えば 各ユーザーの認証やパスワードの変更がブラウザでできるという場合は、 教えていただけないでしょうか。 どうかご教示ください。よろしくお願いします。

  • .cfgファイルについての質問

    visual studio 2003で書かれたプログラムのソースをダウンロードしました. visual studio 2005で開いてみるとプロジェクトの中に.cppファイルと.hファイルと, あと.cfgファイルというものがありました. プログラムのマニュアルを見ると~~.cfgファイルを書き換えることで 設定を変更できるとのことです. cfgを書き換えることはできますが,C言語のプログラムで.cfgをどのように利用しているかがわかりません. C言語での.cfgの使い方,使い方の解説をしてあるページを知っている方がいたら教えてください.

  • fstatでファイルがリンクかどうか分かるか

    c言語でファイル操作の勉強をしています. 引数にファイル名を与えてプログラムを実行するとして, そこからfstatでそのファイルがリンクかどうかを, 判別する方法はありますか. また,statなら判別できますか? パソコンはunixです. よろしくお願いします.

  • 管理者ユーザを作ったつもりなのですが

    管理者グループに、新規testユーザを作成しました。 そのtestユーザでshadowファイルを確認しようとしたところ 権限がないと表示されました。 その理由が分からないのです。 [root@host ~]#useradd -g root test [root@host ~]#su test [test@host root]$ cat /etc/shadow cat: /etc/shadow: 許可がありません [test@host root]$ ls -l /etc/shadow ---------- 1 root root 734 1月 19 17:36 2013 /etc/shadow rootグループにtestユーザを割り当てたので、 testユーザでshadowファイルを見れると思っていのですが見れないのです。 理由がわからないのです。 /etc/shadowファイル所有者がrootだからでしょうか? rootグループにtestを参加させているだけではだめなのでしょうか? ご教授お願いします。

  • C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング

    C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング ファイル名が 0.txt というC言語で書き込んだテキストファイルがあり その中身は以下のようなものとします。 111 000 222 555 000 444 222 000 これらを行ごとに見て重複行を削除し 更に値の小さな順に並び変えたい、つまりファイル内を 000 111 222 444 555 となるようなプログラミングを考えているのですが 調べても分からず悩んでいます。 c言語のプログラム内に UNIXコマンドを扱う方法を考えているのですが c言語内でUNIXコマンドを併用するためのsystem()関数 や 重複行を削除する uniq というUNIXコマンドを どのようにプログラム内に挿入すればいいのでしょうか? ご回答、よろしくお願いいたします。 ちなみに以下のプログラムは system関数が理解できない私の作成失敗したものです。 #include <stdio.h> #include <stdlib.h> int main(void) { system("uniq 0.txt"); }

  • passwd/shadowファイルの「smtp」ユーザーについて

    メール/POPサーバーのpasswdファイルを別のマシンのもので上書きしてしまいました。 ユーザーはuseraddでとりあえず修復(所有権変更も)できたかと思ったのですが、その後バックアップしたファイルが見つかり比較したところ、passwdファイル、shadowファイルに「smtp」というユーザーが以前は登録されていました。 passwdファイル smtp:x:0:0:Mail Daemon User:/: shadowファイル smtp:NP:6445:::::: そこで以下のどの対応が好ましいのか教えていただけますか。 1) バックアップしてあったpasswd/shadowファイルで書き換え。UID変わってしまっているのでユーザーのメールファイルは所有権を変更。そのときの注意点は。 2) smtpユーザーを追加。 useradd -u 0 -o -d / -g 0 smtp vipw → (passwdファイル)→shadowファイル smtp:*LK*::::::: を smtp:NP:6445:::::: に変更。 (これで大丈夫なのか?) 3) このユーザーは不要なのでなにもしなくてよい。 使用環境は、 OSはSunOS 5.6 sendmailは 8.11.6 (以前にバージョンアップ) です。3)だとうれしいですが、いかがなものでしょうか。

  • 別ファイルの内容を検索したいのですが、(超初心者です)

    現在、独学でC言語を勉強しているのですが、 別のファイル(.dat)にあるデータの内容を 該当するデータだけ表示させたいのですが、 どうやったらできるのかわかりません。。 例えば、、、 別ファイルの内容が、 145556 1 C言語 256885 2 C言語その1 456789 3 C言語その2     : という風になっていたとして、 プログラム実行中に 145556 と入力したら C言語 と表示されるような 行ごとに入力されたデータの最初の6桁を検索して 必要な部分だけを表示することはできるのでしょうか? もし、できるのであれば どのようにプログラムを作成すればいいのか教えてください! そして、勝手なのですが、勉強中なので  どうして そうなるのかも教えて欲しいのです。 よろしくお願いします。

  • ユーザーのパスワードを確認する方法

    いつもお世話になっております。 redhat系で、ユーザのパスワードを確認したいのですが、 確認できる方法ありますでしょうか。 /etc/shadowにて暗号化されたパスワードがあるのは知っておりますが、 平文の状態のパスワードが知りたいです。 rootであれば、パスワードなしに、そのユーザーになれますが、 やはり、そのユーザーのパスワードが何なのかが知りたいです。 パスワードの再設定しかないでしょうか。。