68user's page 掲示板

Prev< No. 3594〜3694> Next  [最新発言に戻る] [過去ログ一覧]
No. 3594 # 68user 2004/03/03 (水) 00:07:43
>>3593 へにか
ありがとうございます。お返事は後ほど。

で、メモその 2。EVP 版 blowfish 暗号化・復号化。なお、
      http://www.openssl.org/docs/crypto/EVP_EncryptInit.html
は古いバージョンの API。OpenSSL の web は本当にひどい。

#include <stdio.h>
#include <openssl/evp.h>

int do_crypt(FILE *in, FILE *out, int enc_mode){
    unsigned char key[]="SECRET!";
    unsigned char iv[8];
    EVP_CIPHER_CTX ctx;
    char outbuf[256];
    int outlen;

    memset(iv, 0, sizeof(iv));
    EVP_CipherInit(&ctx, EVP_bf_cbc(), key, iv, enc_mode);

    while (1){
        char inbuf[128];
        int inlen;
        inlen = fread(inbuf, sizeof(inbuf[0]), sizeof(inbuf)/sizeof(inbuf[0]), in);
        if ( inlen==0 ){
            break;
        }
        EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen);
        fwrite(outbuf, sizeof(outbuf[0]), outlen, out);
    }
    EVP_CipherFinal(&ctx, outbuf, &outlen);
    fwrite(outbuf, sizeof(outbuf[0]), outlen, out);
    return 0;
}

int main(int argc, char *argv[]){
    int enc_mode;
    if ( argc == 1 ){
        printf("Specify enc or dec.\n");
        exit(1);
    }
    if ( strcmp(argv[1], "enc") == 0 ){
        enc_mode = BF_ENCRYPT;
    } else if ( strcmp(argv[1], "dec") == 0 ){
        enc_mode = BF_DECRYPT;
    } else {
        printf("Specify enc or dec.\n");
        exit(1);
    }
    do_crypt(stdin, stdout, enc_mode);
    return 0;
}

No. 3595 # 瀧上 2004/03/03 (水) 16:13:46
>>3587 68user
ご回答ありがとうございます。
.oがsrcと同一ディレクトリに存在するのは基本なのですね。
検討した結果、下記の様な仕様にしました。

単体環境:make終了後*.oは自動削除する。単体で1プログラムを対象(実際には共通ライブラリも含まれますが。。)にmakeするのにタイムスタンプを管理する必要は無いと言う結論です。

結合環境:全コンパイルが必要となる結合以降はsrcファイルと同一ディレクトリに.oを保管する。単体完となっているはずなので、修正のあったファイルをupdateするのみとする。

以上結論報告です。(報告されても。。。と思われるかも知れませんが。。(^^;))

No. 3596 # スナフキン 2004/03/05 (金) 17:26:05
質問するのはお久しぶりです。

つかぬ事をお伺いしますが、VineLinux起動中の停電後の再起動で、
非常に冷や汗モノのメッセージが出現しました。

Mounting proc filesystem: mount /proc/: can't read superblock

これがそのメッセージですが、HDDのブート関連の情報が消えたと言う
事になるのでしょうか・・・(死刑宣告?)
もしその最悪の状態の場合に、その他のパーティションのデータ復旧は
望めないでしょうか。
ちなみになぜかCDブートも出来ない状態です。
ファイルシステムはex3です。

神様仏様どうか最悪の状態では無いように・・・アーメン
何でこんな時に・・・

No. 3597 # スナフキン 2004/03/05 (金) 17:33:49
追加情報ですが、df の表示は /dev/hda6 としか表示されません。
fdisk /dev/hda の結果は、Unable to open /dev/hda です。
う〜ん・・・

No. 3598 # 68user 2004/03/05 (金) 18:11:55
>>3593 へにか
いまだ調査中、というか英文と格闘中です。


>>3595 瀧上
単体環境と結合環境のやり方を変える必要があるのかどうかは疑問です。

Makefile を 2つ作るのか、Makefile は 1つで、環境変数などを見て
単体環境の場合のみ *.o を削除するのか、などの実現方法がわからない
のですが、例えば
    - Makefile に記述した依存関係が不正確だった
    - しかし単体環境では毎回全ソースを build するので影響がなかった
    - ところが結合環境に修正ソースを上げたら、依存関係の不正確さから
        狙いのソースがコンパイルされず、古い版の *.o がリンクされてしまった
などということにならないでしょうか?

ソースが非常に大規模なのでこういう仕組みを作らないと運用できない、
などの理由があるなら仕方ないでしょうが、
      単体と結合でやり方が違う
というのはミスの元ですので、それなりの利点がないなら避けるべきこと
と思います。

> 報告されても。。。と思われるかも知れませんが。。(^^;)
掲示板に質問しておいて結果報告すらしない輩が多いですが、
瀧上さんはちゃんと報告していただけるので、こちらとしても
非常にうれしいことです。


>>3596 スナフキン
そこらへん詳しくないんですが、/proc はカーネル内部のプロセス
状態を見るための覗き穴なので、そこで Can't read superblock とは
奇怪なことです (/proc に superblock なんか存在するのか? という話)。

そもそもこのエラーが出た結果、マウント対象となる HDD が読め
ないなどの異常が発生しているのでしょうか? もしそうなら /proc
マウントにさえ行き着けず、もっと前に /dev/hda などに関する
エラーメッセージが表示されているのではないかと思うのですが。

> fdisk /dev/hda の結果は、Unable to open /dev/hda です。
/dev/hda が / なのでしょうか? /etc/fstab を見せていただけませんか?

あと、/etc/fstab から /proc に関する行をコメントアウトすると
どうなりますか?

で、本当に superblock が飛んでいたりするなら、わたしの手には
負えないです。「ext3 superblock 復旧」などでぐぐると、いくつか
ヒットするようです。

No. 3599 # スナフキン 2004/03/05 (金) 18:54:27
早速の御返答ありがとうございます。

/etc/fstab の中身です。(多分大丈夫だと思いますが書き写し漏れがあるかも)

LAVEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc /proc defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/hda7 swap swap defaults 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
(タブを全角スペースに置き換えしてます)

>あと、/etc/fstab から /proc に関する行をコメントアウトすると
ダメです。Read Only になっているので書き込みが出来ませんし、
そもそも vi が何も反応せずに起動しません…
植物状態って事?(T@T)

不思議なことに、インストーラーCD内のfdiskだとパーティション情報が
正常に表示されますが、HDDのモノだと前記の通りです。

No. 3600 # 68user 2004/03/05 (金) 22:03:48
>>3599 スナフキン
> /etc/fstab の中身です
LABEL=... という記述を初めて見たのですが、Linux には
ラベルという仕組みがあるのですね。

要は /dev/hdx がどのマウントポイントに相当するのか、
知りたかったのですが、これではわからないですね。ログ
ファイルなどに記録が残っていませんか?

> Read Only になっているので書き込みが出来ませんし、
mount -o rw,remount /dev/hdx /hoge などで再マウント
できませんか?

> インストーラーCD内のfdiskだとパーティション情報が
> 正常に表示されますが、HDDのモノだと前記の通りです。
正常に表示、とは何が表示されるのですか?

わたしは Linux に詳しいわけではないのですが、全体的に
情報が少なすぎます。

Q1. そもそもマシンに何個の HDD が付いているのですか?
Q2. そのうちどれが壊れたかわかりますか? その根拠は?
Q3. シングルユーザモードで起動して、一部だけでも手動で
        マウントできませんか?
Q4. どこまでマウントに成功しているのですか? / 以外は
        全滅ですか? /boot も /usr も /home も /var も
        見えないのですか?

No. 3601 # スナフキン 2004/03/05 (金) 23:05:42
ごめんなさい、どんな情報が必要かわからなかったのと、自分でも
何が問題なのかよく判らないもので・・・

>再マウントできませんか?
いろいろと指定を変えて試しています。
ただ、パーティンション情報が間違っている時に rw で書き込んで
大丈夫でしょうか?

A1 HDDはIDEが一台のみです。
A2 メッセージをかいつまんで見る感じでは、superblock が読めない
        と表示されているように思いました。
A3 シングルモードで試してみましたがROでマウントされている状態が
        変わりません。
A4 起動中に /proc へのアクセスが出来なくてエラーとなっているようです。
    /boot /var /usr /proc のマウントが失敗しているようですが、 / に
    /usr /var というファイルが存在しますが、/proc というファイルは
    存在していません。

関連サイトをあさって情報を探していますが、ファイルシステムは(も)
よく判らない状態です・・・

ログは /var へアクセスできないのでお手上げです。

No. 3602 # へにか [URL] 2004/03/06 (土) 00:08:25
"Merkle-Hellman" DESと、Googleで検索をかけたところ、
http://info.isl.ntt.co.jp/~ohta/BOJ-Seminar.pdf
を見つけました。21枚目あたりが参考になるかも知れません。

#なんだか、いらない突っ込みしてしまって、余計な苦労を
#かけてしまったとしたら、申し訳ないです。
#お忙しいでしょうし、僕の意見も間違っている可能性大い
#にあるでしょうから、その内気が向いたらで結構です。

No. 3603 # 68user 2004/03/06 (土) 00:31:48
>>3601 スナフキン
> A3 シングルモードで試してみましたがROでマウントされて
> いる状態が変わりません。
シングルユーザモードで起動すれば、Read Only でマウント
されているものだと思います。狙いは / のみがマウントされ
ている状態にすることで、その後ひとつひとつマウントして
みることで、どの部分が壊れているのか原因がわかると考えました。

あとですね、この fstab では LABEL=/home などとファイル
システムのラベルを指定しています。わたしの知る限り FreeBSD や
Solaris にはこういった機能はないので想像ですが、fstab に
ラベルを指定すると、まず全デバイスのラベル名を取得し、
ラベル名が一致したデバイスを mount しようとするのでは
ないかと思います。

で、マウントしようとしているデバイスとは異なる場合でも、
ラベル取得時に壊れたファイルシステムが原因でエラーに
なるのではないかと想像しました (違うかもしれませんが)。

よって、ラベルを使わず
      # mount -o rw,remount /dev/hdx /hoge
などとデバイス名を指定してマウントしてみてください。

> /usr /var というファイルが存在しますが
マウントポイントは最初から必ず存在します。存在するか
どうかではなく、その下にファイルがあるかどうか、つまり
マウントに成功しているかどうかを教えてください。

> パーティンション情報が間違っている時に rw で書き
> 込んで大丈夫でしょうか?
保証はできませんが、大丈夫だと思います。もしファイル
システムとして認識できなければマウントできません。また、
/usr を /var に間違えてマウントしたとろで、/var/bin
とか /var/sbin とか /var/X11R6 などができてしまう程度
です (当然 umount すれば元通りです)。

ただ、そこでプログラム類が悪さをして /var などの下の
ファイルを操作してもらっては困るので、そういう意味でも
「シングルユーザモードで起動」をお勧めします。

No. 3604 # スナフキン 2004/03/07 (日) 01:41:20
結果から書くと諦めました。

教えてもらった事と、考えられる事を幾つか試してみましたが、
何らかのエラーのオンパレード・・・

remount も試しましたが、その内 / に居るのに /etc の内容が
見えたり完全におかしくなって来ました。

ちなみに、/ の中には、
/boot 空
/home 空
/usr 壊れたファイルの断片を含んだファイル
/var 同上
といった内容でした。
(lsコマンドが正常なうちの結果)

まともだった頃の、幾つかのコマンド結果を書いてみます。
#fsck /dev/hda2
Couldn't open /proc/partitions: Input/output error
Is /proc mounted?

# mount /proc
mount: non: can't read superblock

# fdisk /dev/hda
modprobe: modprobe: Can't locate module char-major-27
modprobe: modprobe: Can't locate module char-major-27

Unable to open /dev/hda


しかし、ext3 がクラッシュに強いってのは信じられなくなり
ました、4年近く使っている古いext2のシステムは、大きなト
ラブルも無く今だ健在なのにたった一度の不正終了で・・・。
運が悪いといえばその通りなんでしょうが・・・(涙)

お付き合いありがとうございました。

No. 3605 # スナフキン 2004/03/07 (日) 03:33:57
インストーラーで、前のパーティションを残してインストールする選択
肢が有ったので、/home を残して再インストールしたところ、ラッキー
な事にデータを残せたようです。
/etc は全滅なので全て再設定を行う必要が有りますが、一番重要なデ
ータが残せた事でよしとします。

また、今回のトラブルでファイルシステムのキーワードを沢山見つけま
したが、自分はシステムを作るヒトじゃなく使うヒトなので、あまり
深入りするつもりは有りません。

しかし、バックアップの重要性は友人にあれほど言っている自分が今回
の様なトラブルにあった事でよい戒めとなりました。

ジャーナルシステムを過信するとワタシの様な目に遭いますので、皆さ
まご注意を(^^;;;;

お騒がせいたしまして申し訳有りませんでしたm(_ _)m

No. 3606 # へにか [URL] 2004/03/07 (日) 20:49:33
英語と格闘させてしまってるところ、申し訳ないのですが、
暗号技術大全§15.2をご覧ください。

#ごめんなさい。手元にあるのに気が付かなくって。

しかも、Merkle-Hellmanの論文はacmに登録しないと読めない
ようなので、僕が一人相撲をとっていたようですね。

#間抜けなことをしでかして、すみません。

No. 3607 # バンガード [URL] [E-mail] 2004/03/08 (月) 16:00:43
色々と調べたのですが、どうしても分かりません。
以下の機能のスクリプトを作成中です。

1.ユーザーに入力を促し、ユーザーID、パスワードを入力させる。
2.入力されたパスワードの整合性チェック
                文字数、英文字数、数字文字数、ユーザーIDと不一致etc.
3.正しいパスワードであった場合、passwdコマンドを実行し該当ユーザーのパスワードを変更。

問題は、上記の「3」です。
ユーザーが入力したパスワードをそのままpasswdコマンドに渡し、パスワード変更を行いたいのですが、入力されたパスワード文字列をpasswdコマンドに渡すことが出来ません。
通常時のpasswdコマンド実行時の様に旧パスワード/新パスワード/新パスワード(再入力)を促さずに、変数として持っているパスワード文字列をpasswdコマンドに渡すことは出来ないでしょうか?

環境はAIX 5.2でシェルは出来ればkshで実現したいと考えています。

No. 3608 # 68user 2004/03/08 (月) 17:55:21
>>3607 バンガード
AIX は知りませんが、一般的な UNIX では root 権限があれば
元パスワードを聞かれることはないと思います。
    http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/passwd.htm

ただしプログラムで制御するなら、pwdadm を使った方が
よいような気がします。
    http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/pwdadm.htm

passwd は人間が操作することを前提としたコマンドなので。

No. 3609 # zsh 2004/03/09 (火) 00:49:09
>>3607 バンガード
passwdコマンドは端末からの入力しか受け付けないため
シェルからpasswdコマンドへ直接値を渡すことは出来ません。
expectを使うのが一般的?かなと思います。
(Solaris以外はさっぱりなので参考程度に。)

>>3608 68user
AIXにはpwdadmというコマンドがあるのですね。
HP-UXのshの話といい、色々と参考になります。

No. 3610 # 68user 2004/03/09 (火) 01:30:50
>>3609 zsh
> passwdコマンドは端末からの入力しか受け付けないため
> シェルからpasswdコマンドへ直接値を渡すことは出来ません。
UNIX 一般の話であれば、そうでもありません。Linux では
    % ( echo oldpasswd ; sleep 3 ; \
            echo newpasswd ; sleep 3 ; \
            echo newpasswd ) | passwd
でできました。Solaris8 だと不可でしたが、本当に端末が
ない状況 (cron からとか、CGI からとか) でやるとうまく
いったりするかも、とか思ったりします。

なぜ sleep が必要かについてはよくわからないんですが、
そのうち Linux の passwd のソースを読んでみよう。

>>3593 へにか
遅くなりましたが、2key-3DES について。お待たせしたわりに
技術的な話ではないんですが…。

http://x68000.startshop.co.jp/~68user/net/crypt-1.html では、
      2key-3DES はやめといた方がいいよ。なぜなら、こんな
      攻撃方法があって、現時点では (全数探索を除くと) 最も
      現実的な攻撃と思われるからでありますよ。
ということを書きたかったのです。よって、これに対して

> 確かに2つの鍵を使う3DESは攻撃方法がある、ということも
> 書いていますが、どっちかって言いますと、既存の方法、すなわち、
> §2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、
という指摘はちょっと意図が図りかねるなぁと思っておりました。

つまり Merkle-Hellman Attack の選択平文攻撃よりも既知
平文攻撃の方が脅威であるため、
    「Merkle-Hellman Attack の方は紹介しなくていいかな。
        論文も見つからないし」
と思ったわけです。もしこの認識が誤りであればご教示願います。

No. 3611 # へにか [URL] 2004/03/09 (火) 07:23:26
>>3610 68user

> つまり Merkle-Hellman Attack の選択平文攻撃よりも既知
> 平文攻撃の方が脅威であるため、
> 「Merkle-Hellman Attack の方は紹介しなくていいかな。
> 論文も見つからないし」

当時の僕は論文の意図しか見ておらずこの、「論文も見つからない」
ということ、特に誰でも容易にハイパーリンクを辿ることによって
確認できる方法が無い、というところまで、頭が回っていませんでした。

> と思ったわけです。もしこの認識が誤りであればご教示願います。

いえ、少なくとも現在の僕の認識とは同一です。

#僕の勇み足だったと思います。お詫び申し上げます。

No. 3612 # バンガード [URL] [E-mail] 2004/03/09 (火) 10:09:31
>>3610 68user
バンガードです。

この掲示板を使うのが初めてなので、うまくコメント出来ていなかったら御免なさい。

>UNIX 一般の話であれば、そうでもありません。Linux では
> % ( echo oldpasswd ; sleep 3 ; \
> echo newpasswd ; sleep 3 ; \
> echo newpasswd ) | passwd
>でできました。Solaris8 だと不可でしたが、本当に端末が
>ない状況 (cron からとか、CGI からとか) でやるとうまく
>いったりするかも、とか思ったりします。
        at コマンドで試してみましたが、残念ながら駄目でした。

        引き続きpwdadmについて調査致します。
        また、結果を報告させていただきます。

No. 3613 # バンガード [URL] [E-mail] 2004/03/09 (火) 11:40:26
>>3608 68user
>ただしプログラムで制御するなら、pwdadm を使った方が
>よいような気がします。
    pwdadmについても確認しましたが、残念ながらpasswdと動作は変わらない様です。
    (もう少し、細かい設定が出来はしますが)

    やっぱり、旧/新パスワードを聞いてきて、それぞれの入力が必要であると言う部分では、全く変わりませんでした。

>>3609 zsh
    expectについては、昨日も調査を致しました。
    しかしながら、expectおよびTclの導入が必要ですので、採用を躊躇しています。

No. 3614 # 68user 2004/03/09 (火) 13:33:52
>>3613 バンガード
3608 でも書いたように、root 権限で実行したら
旧パスワードは聞かれないと思いますが、どうですか?

No. 3615 # バンガード [URL] [E-mail] 2004/03/09 (火) 14:19:13
>>3614 68user
はい。この件は返事が抜けていましたね。
申し訳ございません。
仰る通り、root権限であれば確かに古いパスワードは聞かれません。
ですが、結局は新パスワードに入力が必要であり、ここでユーザーの介在が必要なことに変わりはありません。

やっぱり、expectを導入するしかないのだろうかと考え始めています。

No. 3616 # 68user 2004/03/11 (木) 01:40:33
>>3615 バンガード
> やっぱり、expectを導入するしかないのだろうかと考え始めています。
もし AIX の passwd が、どうしても端末からしか読んでくれないなら、
expect などに頼るか、PAM を使ったパスワード変更プログラムを
書くことになるかと思います。

No. 3617 # ビギナー 2004/03/11 (木) 17:28:30
LinuxASからsolaris9に乗せ替えるのですが、
クーロンはどのように移行できるのでしょうか?
まだ実機が来ていなくて何も環境が見えません。
これまでの設定ファイルやスクリプトファイルが
そのまま使えるのか、シェルの変更をしないと使えないのか、
どこに配置するのか・・・少しでも事前に解っていれば助かるかな〜って思ってます。

No. 3618 # 68user 2004/03/11 (木) 18:24:25
>>3617 ビギナー
あらーそれは大変ですね。基本的に機能面 (コマンドの数とかオプションの
種類とか) で言うと Linux > Solaris なので (正確には GNU モノ > Solaris)、
Linux から Solaris への移行は結構面倒です。

まずは Sun が提供している
    「Linux から Solaris オペレーティング環境への移行」
            http://sdc.sun.co.jp/solaris/migration/linux/index.html
をどうぞ (ドキュメントを読むにはユーザ登録が必要だと思われます)。

上記ドキュメントには、当然ながら Sun に都合が悪いことはあまり書かれて
いませんので (互換性ないですよ、とはあまり書かれていない)、以下わたしの
印象を書きます。

全体的に言えることは、
      - Linux (というより GNU) 独自の機能を使っていたら移行に苦労する
      - 古来からの UNIX の機能しか使っていないならあまり苦労しないかも
ということです。GNU モノの一覧はこちらを。
      http://www.linux.or.jp/JM/INDEX/gnu.html
特に Solaris の find・date・grep・tar・make・awk・sed コマンドの機能は、
Linux のそれと比べると貧弱な印象があります。

まぁ Solaris でも GNU モノをインストールすることはできるので、
がんばってプログラムを直すか、Solaris に GNU モノを入れるかという
選択肢はありますけどね。

なお、apache や perl など、Linux にも Solaris にも属さないもの
(第三者が開発しているもの) は、基本的に同じ動きをします。


> クーロンはどのように移行できるのでしょうか?
基本機能は同じですが、例えば
      http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
の name=value という書き方は Solaris ではできません。
0-23/2 というのもダメなはず。

上記 man には
      ATT や BSD の cron では "1-3,7-9" は拒否されるだろう --
      "1-3" または "7,8,9" のいずれかだけしか指定できない。
とありますが、Solaris ではどうだったかなぁ。

Solaris の crontab(1) はこちら。
    http://www.freebsd.org/cgi/man.cgi?query=crontab&apropos=0&sektion=0&manpath=SunOS+5.9&format=html

> 設定ファイル
OS の設定ファイル名や内容は、同じものは同じですが、違うものは
違います (としか言いようがない)。

同じもの:
      /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf

違うもの:
      その他たくさん。Linux の /etc/fstab は、Solaris では /etc/vfstab など。

> スクリプトファイル
Linux では sh は bash ですが、Solaris は古来からの sh です。例えば
Solaris の sh では
    export A=B
はダメで、
    A=B
    export A
としなくてはいけません。このような bash 依存な書き方をしていなければ
少しの修正でいけるかもしれませんが、bash の便利な機能を活用しまくって
いるなら苦労するでしょう。

No. 3619 # ビギナー 2004/03/12 (金) 11:49:16
>>3618 68user
参考にさせていただきます。
実機の搬入が来週なので、結果報告はその時にします。

No. 3620 # バンガード [URL] [E-mail] 2004/03/12 (金) 19:13:45
>>3616 68user
現在expectで対応する方向で準備中です。
ありがとうございました。

No. 3621 # バンガード [URL] [E-mail] 2004/03/12 (金) 19:17:53
度々申し訳ございません。
今度はkshで教えてください。

======= test_file ========
aix4-r1
aix4-r2
aix4-r3
aix4-r4
aix3-r1
aix3-r2
aix3-r3
aix3-r4
aix2-r1
aix2-r2
aix2-r3
aix2-r4
======= test.ksh ========
#!/usr/bin/ksh

file="test_file"

nawk '{
                if ( (substr($0,1,4) == "aix4") )\
                {\
                                printf "TRUE:%s\n",$0; \
                }\
                else {\
                                printf "FALSE:%s\n",$0; \
                }\
}' $file

上記の様に文字列の先頭数文字のみを見て一致するかの判定を行いたいのですが、ksh単体での実現方法が分からず苦労しています。
やはり、上に示したようにawkを使用して、その中でsubstr関数を使用するしかないでしょうか?

本当に基本的なことで申し訳ございませんが、よろしくお願い致します。

No. 3622 # 68user 2004/03/12 (金) 22:12:33
>>3621 バンガード
こんな感じですかね。

while read line; do
        prefix=${line%-r[0-9]}
        if [ "$prefix" = "aix4" ]; then
                echo "TRUE:$line"
        else
                echo "FALSE:$line"
        fi
done < test_file

No. 3623 # バンガード [URL] [E-mail] 2004/03/15 (月) 09:51:21
>>3622 68user
> prefix=${line%-r[0-9]}
> if [ "$prefix" = "aix4" ]; then
これだと、私が例で示させていただいたパターンにしか対応できませんよね。(そういう意味では私の示した例が悪かったですね)
これを「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか?
たとえば、以下のようなif文は無理でしょうか?
if [ $line = "aix4"* ]; then

No. 3624 # 68user 2004/03/15 (月) 10:41:45
>>3623 バンガード
> 「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか?
> if [ $line = "aix4"* ]; then
aix4* では aix-r4x3 はマッチしないように見えますが、
またしても不適切な例ではありませんか?

> if [ $line = "aix4"* ]; then
if ではできませんが、case ならできます。

while read line; do
    case $line in
        aix4*)
            echo aix4
        ;;
        aix5*)
            echo aix5
        ;;
        *)
            echo others
        ;;
    esac
done < test_file

No. 3625 # バンガード [URL] [E-mail] 2004/03/15 (月) 12:55:51
>>3624 68user
>aix4* では aix-r4x3 はマッチしないように見えますが、
>またしても不適切な例ではありませんか?
おっしゃるとおりです。
重ね重ね申し訳ございません。

>if ではできませんが、case ならできます。
なるほど、caseでなら「aix4*」が可能ですか。
助かりました。

No. 3626 # 裏方 [E-mail] 2004/03/15 (月) 16:35:44
初めまして、裏方と申します。
WinSockを用いたウィンドウズネットワークプログラムで、インター
ネットを介して、私のマシン名からIPアドレスを取得する方法に
ついて悩んでいます。言語はC言語を扱っております。

ローカルネットワークではマシン名からIPアドレスを取得するには
Gethostbyname関数で取得できるのですが、インターネットを介した
遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま
せん。(私のはサーバマシンでは無いので当然なのですが・・・)

私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに
動的なIPアドレスが割り当てられるのですがサーバプログラム等を
私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え
なければならないので非常に不便です。

どうにかして、私のマシン名からIPアドレスを取得する方法が
あるのでしょうか?どなたかアドバイスをお願いします。

No. 3627 # 68user 2004/03/15 (月) 16:58:12
>>3626 裏方
- 逆引きできないから困っているの?
    (もしそうなら「マシン名」というのは何?)
- IP アドレスがころころ変わるから困っているの?
    (もしそうなら「マシン名」は関係ないのでは?)
- そもそもマシン名って何を指しているの? FQDN?
- DHCP で振られる IP アドレスには FQDN が設定してあるが、
    外部向け DNS サーバには登録してなくて、内部からしか逆引き
    できない、という状況?

などなど疑問はつきませんが、http://www.dyndns.org/ などの
DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。

ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて
いる IP アドレスに結びつけるということです。管理者が寛容である
ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。

No. 3628 # Tangerine 2004/03/15 (月) 17:11:48
始めまして、UNIX使い始めです。
この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。

そこでお聞きしたい事がるのです
awkコマンドのifなどの中で変数は使えないのでしょうか?

現在全ファイルに作成日付が付加されており、
指定日より前の物を削除したいいのです
シェルの前半で指定日付を変数へ代入し
lsとawkをパイプで繋いで削除しようとしています
awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており判別できないのです
(ifを削除しprintで変数を表示させて確認)

出来ないのであれば何か別の方法を考えなくてはいけないのですが
何方かお答えください

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

No. 3629 # zsh 2004/03/15 (月) 17:50:12
>>3628 Tangerine
具体的にどのようなスクリプトなのか見せて頂けませんか?
(そもそもawkを使う必要があるのでしょうか?)

No. 3630 # Tangerine 2004/03/16 (火) 11:02:40
返信遅れてすいません。
えっと、確かに自分もawkを使う必要があるのか微妙ですが

#! /usr/bin/sh

make_date=`date +"%Y%m%d"`
make_date=`echo $make_date"-1" | bc`
echo $make_date
ls *.*.* | awk -F. '{if($2<make_date) print $0}'

問題としているのはこのあたりです。
変数make_dateに昨日の日付けが入り、
それ以前のものを表示させたいのです。

正直なところを言えばawkを使う必要性はまったくといってないです
ただ、自分が色々調べた結果awkを使ってやれば出来るのか?
と、考えて使ってみただけですので

awkじゃなくて別の方法で行えるのであれば
御教授いただけると嬉しいです。

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

No. 3631 # zsh 2004/03/16 (火) 12:48:26
>>3630 Tangerine
単純に昨日以前のファイルを表示するのであればこんな感じで。
(ファイルが無い時を考えるとls使った方がいいのかな?)
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
for f in `echo *.[0-9]*.*` ; do
    d=`echo $f | cut -d. -f2`
    [ $d -lt $make_date ] && echo $f
done
------

awkを使うのであればこんな感じかな。
実装されているawkによって変数の設定の仕方が違うので注意してください。
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
ls *.[0-9]*.* | awk -F. '{if($2 < d) print}' d=$make_date

No. 3632 # Tangerine 2004/03/16 (火) 13:56:36
>>3631 zsh
おおっ!!有難う御座います(T▽T)
なるほど、forですね。なんとも勉強不足でした(^^;
やはりawkでは変数をそのまま引き継げないのですね
awk内で更に変数に入れ込まなければいけないとは(^^;
有難う御座います
教えていただいた方法で作成していきます。
本当に助かりました(w

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

No. 3633 # 68user 2004/03/16 (火) 14:15:32
>>3632 Tangerine
> やはりawkでは変数をそのまま引き継げないのですね。
そういうわけではありません。

> ls *.*.* | awk -F. '{if($2<make_date) print $0}'
awk はどういう引数が欲しいか、というと
      awk -F. '{if($2<$make_date) print $0}'

      awk -F. '{if($2<make_date) print $0}'
ではなくて、
      awk -F. '{if($2<20040315) print $0}'
となってほしいわけです。

で、こうなるように書くにはどうすればよいか。

[方法1]
まず
      awk -F. '{...}'
と '' で囲ってはいけません。'' で囲った時点で中に入っている
変数が展開されなくなります。というわけで、
      awk -F. "{...}"
と "" で囲みます。これで中の変数が展開されます。しかし
      awk -F. "{if($2<$make_date) print $0}"
と書いてしまうと、$2 や $0 まで展開されてしまいます。$2 や $0 は
awk にそのまま渡したいので、
      awk -F. "{if(\$2<$make_date) print \$0}"
と \ でエスケープします。

[方法2]
方法1 のエスケープがうっとうしいなら、まず
      awk -F. '{...}'
と '' で全体を囲みます。そして狙いのところだけ '' の外に出します。例えば
      awk -F. '{if($2<'$make_date') print $0}'
こんな感じ。つまり
      'x'$y'z'
という形にするわけですが、これは 'x' + $y + 'z' というふうに結合されるので
うまく動きます。

いずれの場合であっても、
      % sh -x hoge.sh
と -x オプションを付け、変数が狙い通り展開されているかどうか
チェックする癖をつけましょう。

No. 3634 # Tangerine 2004/03/16 (火) 14:52:46
なるほど〜、ややこしい事になっていたのですね〜
おかげさまで希望の日付以前のファイルを削除することが出来ました、
有難う御座います。

追伸
>% sh -x hoge.sh
使うようにしてみます(^^;

No. 3635 # zsh 2004/03/16 (火) 18:53:22
>>3633 68user
その方法があることをすっかり忘れてました。
(というか使った試しが無い・・・反省)
いつもながら勉強になります。

No. 3636 # tomato 2004/03/19 (金) 18:06:05
初めまして、Perl初心者です。
Socketを使ってUDPのプロキシ機能を作りたいのですが、
Send関数のあて先の指定で、inet_atonを使わずに指定
する方法がわかりません。というのも、あて先IPアドレスは
分かっているのですが、/etc/resolv.confには記述されて
いないからなのですが。
やっぱりinet_aton関数を使ってホスト名からIPアドレスを
取得しないとダメなのでしょうか?
どなたか教えてください。
環境は、Solaris8 、perl5 です。
今はこんな感じなのですが、、、

socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
$ip = '192.168.253.155';
$sock_addr = pack_sockaddr_in(2426, $ip);
send(SOCKET, "test", 0, $sock_addr);

No. 3637 # 68user 2004/03/19 (金) 18:36:10
>>3636 tomato
inet_aton には IP アドレスも渡せます。なので、
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    $ip = '192.168.253.155';
    $iaddr = inet_aton($ip);
    $sock_addr = pack_sockaddr_in(2426, $iaddr);
    send(SOCKET, "test", 0, $sock_addr);
でよいです。

    http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton
ではホスト名しか渡せないような書き方をしていますので、ちょっと
不適切でした。

そもそも、C 言語での inet_aton の機能は、
      aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する
というもので、名前解決は行いません。一方、perl の Socket パッケージの
inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。

No. 3638 # バンガード [URL] [E-mail] 2004/03/19 (金) 23:25:32
    また初歩的なことで申し訳ありません。
    以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて
いるのですが、全てNULLになってしまいます。

        +1 #!/usr/bin/ksh
        +2 INDEX=0
        +3 TEST=`ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done`
      +10 echo "$TEST"
      +11
      +12 INDEX=0
      +13 while [ $INDEX -lt 5 ]
      +14 do
      +15 echo $INDEX":"${CMD[$INDEX]}
      +16 let "INDEX = INDEX + 1"
      +17 done

    このプログラムの3行目から10行目を以下の様に修正すれば、13行目
以降でも配列の中身が正常に表示されます。
        +3 ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done
      +10

    最初のプログラムの様に、最初のループの結果を変数にセットする
場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう
か?

No. 3639 # zsh 2004/03/21 (日) 22:59:40
>>3638 バンガード
バッククォーテーションでくくると別プロセスになるから
変数を保持することはできないと思いますが・・・

No. 3640 # 68user 2004/03/22 (月) 14:19:23
>>3638 バンガード
> このプログラムの3行目から10行目を以下の様に修正すれば
この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。

No. 3641 # バンガード [URL] [E-mail] 2004/03/22 (月) 14:51:49
>>3640 68user
3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。
これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。

No. 3642 # 68user 2004/03/22 (月) 15:27:00
>>3641 バンガード
> while文の出力は標準出力へ出て行くだけ
それは echo しているからでは? echo しなければ OK かと思います。

> while文の出力を変数に格納したいと考えています
修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。
また、ループを抜けた後でも参照が可能だと思います。

No. 3643 # バンガード [URL] [E-mail] 2004/03/22 (月) 16:12:09
>>3642 68user
まず、3行目から10行目を修正した場合の結果は以下の通りです。
0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
5:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
6:-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
7:-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7

0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4

次に3行目から10行目を修正しない場合の出力結果です。
0:
1:
2:
3:
4:

ちなみに7行目のecho文をコメントにしても結果は同じです。

この様にwhile文をダブルクォーテーションで囲むかどうかでwhile
文を抜けた後で配列を参照できるかが異なってきます。

No.3639でzshさんが回答されている様にダブルクォーテーションで囲んでいるために別プロセスになってしまうのが原因の様です。
whileの出力を変数に格納した上で、whileから抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか?

No. 3644 # 68user 2004/03/22 (月) 17:05:31
>>3643 バンガード
> ちなみに7行目のecho文をコメントにしても結果は同じです。
わたしはありえないと思いますが、そういう ksh もあるんですかね。
当方の HP-UX11i で
    #!/usr/bin/ksh
    INDEX=0
    ls -l |
    while read LINE; do
        CMD[$INDEX]=$LINE
        let "INDEX = INDEX + 1"
    done
    INDEX=0
    while [ $INDEX -lt 5 ]; do
        echo $INDEX":"${CMD[$INDEX]}
        let "INDEX = INDEX + 1"
    done
というのスクリプトを実行したところ、
    0:合計 7
    1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
    2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
    3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
    4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
というような、先頭 5 行分だけの出力が得られました。

No. 3645 # バンガード [URL] [E-mail] 2004/03/22 (月) 19:34:47
>>3644 68user
御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出
ます。

以下の様に修正した場合に配列の中身が2つ目のwhile文で出力され
なくなります。
        #!/usr/bin/ksh
        INDEX=0
        TEST=`ls -l |
        while read LINE; do
                CMD[$INDEX]=$LINE
                let "INDEX = INDEX + 1"
        done`
        INDEX=0
        while [ $INDEX -lt 5 ]; do
                echo $INDEX":"${CMD[$INDEX]}
                let "INDEX = INDEX + 1"
        done

No. 3646 # 68user 2004/03/23 (火) 01:56:23
>>3645 バンガード
> 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出ます。
そうでしょうね。

> 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力されなくなります。
そうなりますね。`〜` とするとサブシェルが起動されますから、
$CMD が設定されるのはサブシェルだけで、親のシェルには反映
されません。

質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
いない理由があって、>>3644 は採用できないのですか?

No. 3647 # バンガード [URL] [E-mail] 2004/03/23 (火) 03:49:34
>>3646 68user
>質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
>いない理由があって、>>3644 は採用できないのですか?
3644のスクリプトでは、最初のwhile文の出力を変数に格納していません。
この形式であれば、最初の私の質問で御提示させていただいている通りで
す。(3行目から10行目を修正したもの)
次に質問を続ける理由ですが、3642で「echo しているからでは?
echo しなければ OK かと思います。」
「ループを抜けた後でも参照が可能だと思います。」と回答されているの
で、そんなことは無いと言うことで3643の回答をしています。

それに対して、3644で「わたしはありえないと思いますが」とお答え
いただいていますよね?
ですから、それに対しての回答で3645の回答をさせていただいていま
す。

3642の回答が無ければ、3639の回答で「なるほど」と納得していた
のですが、3640で「なぜだめなのか?」と言う事ですので状況を説
明させていただいている次第です。

結局3640の回答にある通り、バッククォーテーションで囲んでいる
ために別のジョブとして起動されるためにwhileから抜けた後で配
列を参照できないのですよね。

私としては最初のwhile文での出力を変数に格納した上でwhile文の
外でも配列の中身を参照したいと言うのが最終目標です。
しかしながら、バッククォーテーションで囲んだ以上は別タスクに
なるために、while文の外で配列が参照できないとなれば、最初の
while文の出力をファイルに格納するしかないかと考えています。
もし、それ以外の方法があるのであれば、お教えいただけると助か
ります。

No. 3648 # 68user 2004/03/23 (火) 10:26:19
>>3647 バンガード
やっとわかりました。変数に格納って TEST=`…` のことですか。

わたしの読解力が足らないだけでしょうが、
      「変数 TEST に ls の出力全体を、CMD には 1行ずつの
          結果を代入したい」
     「このスクリプトの目的は ls の結果全体を表示しつつ、
          なおかつ先頭 5 行を表示すること」
などと書いていただければもっと早く理解できたと思われます。

で、スクリプトは以下のような感じでしょうか。

#!/usr/bin/ksh
INDEX=0
ls -l |
while read LINE; do
    CMD[$INDEX]="$LINE"
    TEST="$TEST ${INDEX}:$LINE"
    let "INDEX = INDEX + 1"
done
echo "$TEST"
INDEX=0
while [ $INDEX -lt 5 ]; do
    echo "${INDEX}:"${CMD[$INDEX]}
    let "INDEX = INDEX + 1"
done

No. 3649 # バンガード [E-mail] 2004/03/23 (火) 11:50:40
>>3649 バンガード
なるほど、全ては私の質問の書き方が原因だったのですね。
本当に申し訳ありません。
今回御指摘いただいた様な表現を最初からすべきでしたね。

御提示いただいたスクリプトで目的が達成できました。

重ね重ね誠にありがとうございました。

No. 3650 # m16 2004/03/23 (火) 13:18:33
awk(正規表現?)でちょっと行き詰まってしまったので質問します。

OS:Solaris8

やりたいこと
    環境変数の内容で awk を使ってテキストファイルの検索を行う。

検索に使用する環境変数を HOGE として

awk '/ENVIRON["HOGE"]/ {print}' FILE_NAME

を行っても検索されませんでした。
ちなみに {print ENVIRON["HOGE"]} とした場合には値が返りませんでした。

何か根本的なところで間違ってるかもしれませんが・・よろしくお願いします。

#grep $HOGE FILE_NAME とすれば出来るのですが・・awk で実現したいのです。

No. 3651 # 68user 2004/03/23 (火) 18:09:25
>>3650 m16
awk はよくわかりませんが、
      % awk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME
ですかね。

No. 3652 # zsh 2004/03/23 (火) 18:47:06
>>3650 m16
/usr/bin配下のawkでは環境変数を参照できなかったと思います。
/usr/xpg4/bin/awkかnawkを使ってください。

% nawk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME

No. 3653 # m16 2004/03/24 (水) 09:40:15
68user さん zsh さん レスありがとうございます。

まだうまくいきません。

確認のため
/usr/bin/awk 、/usr/xpg4/bin/awk 、 /usr/bin/nawk で
{ print ENVIRON["HOGE"] } としても空白しか出てきません。

もうちょっと修行してみます

No. 3654 # zsh 2004/03/24 (水) 10:27:06
>>3653 m16
HOGEはちゃんとexportしてますよね?

No. 3655 # すすむ 2004/03/25 (木) 12:50:36
UNIXのtarコマンドについて教えて下さい。
DATテープから任意のファイルをワイルドカード(*)で取り出したいの
ですが上手くいきません。
どのようにすれば取り出せますか。

rwxr-xr-x 0/3 0 2004年 2月 17日 20:55 ./bkup/
rw-r--r-- 0/3 3506495 2003年 6月 5日 15:48 ./bkup/200303031741data_tar.gz
rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200303032300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200303042300data_tar.gz


rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200312302300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200312312300data_tar.gz

このリストから200309となっているもファイルをとりだそうといろいろと
やってみたのですが、

# tar -xvf /dev/rmt/1m 200309\*data.tar.gz
# tar -xvf /dev/rmt/1m ./bkup/200309\*data.tar.gz
# tar -xvf /dev/rmt/1m './bkup/200309*data.tar.gz'
# tar -xvf /dev/rmt/1m "./bkup/200309*data.tar.gz"

上手くいきませんでした。



HP-UX11.00です。

No. 3656 # すすむ 2004/03/25 (木) 12:52:19
>>3655 すすむ
すみません
リストのファイル名は、
YYYYMMDDHHMMSSdata_tar.gz

YYYYMMDDHHMMSSdata.tar.gz
です。

No. 3657 # バンガード [E-mail] 2004/03/25 (木) 13:04:02
>>3656 すすむ
tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
ではどうでしょうか?

No. 3658 # すすむ 2004/03/25 (木) 13:47:55
>>3657 バンガード

>tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
上手くいきません。

No. 3659 # 68user 2004/03/25 (木) 13:51:31
>>3652 zsh
> /usr/bin配下のawkでは環境変数を参照できなかったと思います。
ご指摘ありがとうございます。まわりに Solaris 環境がなくなってしまった
ため誤ったことを書くことが増えると思いますが、そのときはご指導願います。

>>3653 m16
    % echo abc | /usr/bin/nawk '{ print ENVIRON["HOGE"] }'

    % printenv HOGE
で何も出力されないなら、環境変数の設定ミスでしょう。

>>3655 すすむ
> UNIXのtarコマンドについて教えて下さい。
> DATテープから任意のファイルをワイルドカード(*)で取り出したいの
> ですが上手くいきません。
HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
できないようです。
    - 全部 tar xf で展開し、狙いのファイルを拾う
    - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
    - GNU tar をインストールする
などの方法を検討するのがよいかと思われます。

>>3657 バンガード
> tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
sh 系・csh 系いずれも、カレントディレクトリに bkup というディレクトリが
存在し、その下に 200309*data.tar.gz にマッチするファイルが存在した場合、
存在するファイル名に展開されてしまい、結果として意図とは異なるファイルが
展開されます。

また、sh 系ではマッチしなかった場合 ./bkup/200309*data.tar.gz がそのまま
tar に渡りますが、csh 系ではシェルの glob 展開の時点でエラーになります。

メタキャラクタは必ずエスケープしましょう。

No. 3660 # バンガード [E-mail] 2004/03/25 (木) 13:52:51
>>3658 すすむ
当方はAIX 5.2上で試しましたが、以下の様な結果になります。
(tar でなくて申し訳ありません)
% ls -l ./test_dir
合計 7
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030901data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030902data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030903data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031201data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031202data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031203data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040101data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040102data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040103data
-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7
% wc ./test_dir/200309*data
              0 0 0 ./test_dir/20030901data
              0 0 0 ./test_dir/20030902data
              0 0 0 ./test_dir/20030903data
              0 0 0 合計
念のため、csh と ksh で試しましたが、結果は同じです。

No. 3661 # 68user 2004/03/25 (木) 14:10:02
>>3660 バンガード
根本的に誤解があるようです。
> % wc ./test_dir/200309*data
この場合、操作対象ファイルは既に存在するのでエスケープは不要です。
この例ではシェルがメタキャラクタを展開し、wc は
      ./test_dir/20030901data ./test_dir/20030902data ./test_dir/20030903data
というような引数を得ます。

しかし
> # tar -xvf /dev/rmt/1m 200309\*data.tar.gz
の場合は、今から展開しようとしているわけなので、ファイルはまだ
存在しません (仮に存在していたとしても、存在するファイルにマッチ
してもらっては困るわけです)。

よって、シェルが展開しないように \* などとエスケープします。
すると tar は
      -xvf /dev/rmt/1m 200309*data.tar.gz
というふうにメタキャラクタをそのまま受け取るので、それを /dev/rmt/1m
内のデータと比較し、マッチするファイルのみを抽出します。ただし
今回のように tar が自前でメタキャラクタを展開する機能を持っていない
とうまくいきません。

      用語集: ファイルグロブ
          http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%D5%A5%A1%A5%A4%A5%EB%A5%B0%A5%ED%A5%D6

の一読をお勧めします。

No. 3662 # バンガード [E-mail] 2004/03/25 (木) 14:25:24
>>3661 68user
まず最初にお断りさせていただきたいのですが、私が3660の投稿を行ったタイミングでは
まだ3659の発言はありませんでした。
ですので、3660投稿の時点では3659の発言は読んでいませんでした。

ただ、どちらにしても私のテスト自体に思い違いがあった様で御指摘は大変参考になり
ました。
御指摘誠にありがとうございました。
この投稿を送信次第御提示いただいた資料を参照してみます。

No. 3663 # すすむ 2004/03/25 (木) 15:21:18
>>3659 68user
>HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
>できないようです。
> - 全部 tar xf で展開し、狙いのファイルを拾う
> - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
> - GNU tar をインストールする
>などの方法を検討するのがよいかと思われます。
tar tvf の結果をgrepで拾って、tar xvf に対して完全なファイル名を
指定する方法でできました。

ありがとうございました。

No. 3664 # Naoki [E-mail] 2004/03/27 (土) 20:37:18
はじめまして。Naokiと申します。
皆さんに教えていただきたいことがあり、書き込ませていただきます。
レンタルサーバーを借りてホームページを開設しようとしているのですが、
最初に読み込まれるトップページを指定したいのですが、どのようにしたらよいのでしょうか?
具体的には、アクセス元がパソコンor携帯かによって、それぞれのトップページを振り分けるCGI
をトップページにしたいと考えています。(ファイル名はindex.cgi)
サーバー会社に問い合わせたところ、『index.cgiやindex.phpをトップページにする方法として、
.fowardファイルにて操作可能』と言われ、それ以上はサポート外なので対応できないということです。
そこで、どのように設定したらよいのか教えてください。
以上、よろしくお願いいたします。

No. 3665 # has 2004/03/28 (日) 23:58:46
こんばんは。
皆様のようにきっちり回答できる自信がなく、時折の書き込みで恐縮ですが、
たまたま一部知っている内容だったので回答させていただきます。

>>3664 Naoki
CGI側でサーバ変数HTTP_USER_AGENTを参考に判定する方法があります。
CGIでよく使われていると思われるサーバ変数を解説しているページが
あったのでご紹介します。
http://www.din.or.jp/~hagi3/Perl/http.htm

Japan Apache Users Groupでの解説個所も見つけました。
http://www.apache.jp/docs/howto/cgi.html#environmentvariables

No. 3666 # samy 2004/03/30 (火) 13:40:12
こんにちわ。
Perlについてのごく初歩的な質問なんですがファイルデータを保存する時の方法についてなんですが
CSV形式なら
open(OUT,">data.dat");
    print OUT "$FORM{'fld1'},$FORM{'fld2'},$FORM{'fld3'},$FORM{'fld4'}\n";
close(OUT);
だと思うのですが固定長の場合はどうしたらよいのでしょうか?
よろしくお願いします。

No. 3667 # 68user 2004/03/30 (火) 13:56:35
>>3666 samy
>固定長の場合はどうしたらよいのでしょうか?
基本は
      printf(OUT "%05d%20s%010d%10s\n",
                    $FORM{'fld1'}, $FORM{'fld2'}, $FORM{'fld3'}, $FORM{'fld4'});
など。%d は数値。%s は文字列。%20d は右詰め。%-20d は左詰め。
%020d はゼロパディング。

項目数が 10〜20 程度ならこの方法でよいでしょう。

もし項目数が 100 を超えるのであれば、出力フォーマットの定義
ファイル化などを検討しましょう。

No. 3668 # samy 2004/03/30 (火) 18:29:45
ありがとうございます。
助かりました。
また、質問があれば投稿しますのでその時はよろしくお願いします。

No. 3669 # Goldwasser [URL] 2004/03/30 (火) 18:58:06
だから私を見て!
http://sgldwssr.hp.infoseek.co.jp/otp.html

No. 3670 # tmr [E-mail] 2004/04/06 (火) 21:38:22
awkについての質問です。

Solaris7上で、nawkを実行する際、

"cat text.txt" | getline var

という構文があるとvarに "cat text.txt" の結果が入るのですが、
同じことを /usr/xpg4/bin/awk で実行すると var に値が
入らないようです。
このあたりの事情をご存知の方、教えてくれませんか?

No. 3671 # tmr 2004/04/07 (水) 15:27:13
下記の件ですが、awkをかける対象のテキストの行数が、
getlineで取り込まれるテキストの行数より少ない場合に
発生することがわかりました。
つまり、getlineで取り込まれるテキストの方が短い場合、
nawkでは最後の行の内容が保持されて、それを利用した置換処理が
行われるが、 /usr/xpg4/bin/awk では行われないということです。

No. 3672 # 68user 2004/04/08 (木) 10:46:06
>>3671 tmr
なるほど。そういう違いがあることは知りませんでした。一般論としては、
getline の戻り値チェックをしっかり行ないましょう、てな感じでしょうか。

No. 3673 # Goldwasser 2004/04/08 (木) 15:38:24
誰かハイホーネットにメールを送信するアプリをくれましたか?(w

No. 3674 # vm 2004/04/12 (月) 22:17:45
はじめましてvmと申します。
UNIXのコマンド処理で質問があるのですが、
何行かあるテキストファイルの指定のカラム位置に文字列を行単位に挿入
するという処理を、UNIXのコマンドだけでやりたいと思っています。

自分で処理を考えてみたのですが、
1. cutコマンドを使用して、指定カラム位置を境にして、
「指定カラム位置より前の文字列が入ったファイル」と
「指定カラム位置より後の文字列が入ったファイル」に分割する。
2. paste コマンドを使用して、セパレータを元のファイルが使用していない文字を指定して、
1で作ったファイルを結合する。
3. sedコマンドでセパレータ文字を挿入したい文字列に置き換える。


ワークファイルができてしまって、UNIXっぽくないので、
これ以外にもっと簡単なやり方がないか探しているのですが、
もしご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。
よろしくお願いします。

No. 3675 # 68user 2004/04/13 (火) 10:35:37
>>3674 vm
やりたいことがよくわからないので、入力と出力のサンプルを
提示してください。

No. 3676 # zsh 2004/04/13 (火) 13:14:57
>>3675 68user
多分このような事を考えているのだと思います。

■入力ファイル
aaaa,bbbb
cc,ddd
eeeeee,ffff

■挿入文字列
00

■出力ファイル
aaaa00bbbb
cc00ddd
eeeeee00ffff

>>3674 vm
で、やりたい事が上記の通りだとすると、
perlとかawkで出来ると思います。

No. 3677 # vm 2004/04/13 (火) 17:42:20
こんにちはvmです。
説明不足でした。

入力データは1ファイルで、

AAAABBBCCCCC
DDDDEEEFFFFF
GGGGHHHIIIII
  :

という感じで項目間の区切り無しのレコードが
いくつか入っているという状態で、

AAAABBB****CCCCC
DDDDEEE****FFFFF
GGGGHHH****IIIII
  :

1行目で見ると、BBBとCCCCCの間に****を挿入するということを、
シェルかUNIX標準コマンドでやりたいと考えています。

先に書いた私の手順ですと、一度cutコマンドで

AAAABBB
DDDDEEE
GGGGHHH
  :

CCCCC
FFFFF
IIIII
  :

2つのワークファイルを作るので手順も多くて面倒なため、
他にやり方がないものかと考えている次第です。
もっと単純化できる方法がありましたら、ご教授ください。
お願いいたします。

No. 3678 # zsh 2004/04/13 (火) 19:10:14
>>3677 vm
区切り文字なしだとすると、文字列の挿入個所は何を基準に判断するのでしょうか?
下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

後気になった点はUNIXの標準コマンドというのは
どこまでを指すのでしょう?
インストール時点でインストールされるコマンドは、
OS・インストールオプションによって異なると思いますが・・・

No. 3679 # vm 2004/04/14 (水) 21:04:08
こんにちはvmです。

>下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

すみません。そのとおりです。

>後気になった点はUNIXの標準コマンドというのは
>どこまでを指すのでしょう?

POSIXに準拠しているコマンドのことを指していました。

あれからちょっと調べてみたのですが、

awk '{printf("%s%s%s\n", substr($0,1,2), "TUIKA", substr($0,3));}' target.txt > result.txt

awkコマンドであれば、私のやりたいことがワークファイルを作らずに
実現できそうなことがわかりました。

どうもお騒がせしました。
これより良い方法がございましたら、ご教授ください。

No. 3680 # tgr [URL] [E-mail] 2004/04/15 (木) 09:25:34
gfg

No. 3681 # 馬場 2004/04/15 (木) 10:54:14
宜しくお願いします。

tarコマンドを実行した際に以下のメッセーシ゛が出たんですが、
何を意味しているかわかりません。
ご教授ください。

--------------------------------------------------
cd /
tar -cvf /dev/rmt0n ./usr/*
tar -rvf /dev/rmt0n ./var/* ← メッセーシ゛が出ます
--------------------------------------------------
表示メッセージ
tar:blocksize=0
tar:backspace over record failed
--------------------------------------------------
ご教授ください。宜しくお願いします。

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

No. 3682 # ryo 2004/04/15 (木) 21:47:40
mailxコマンドに関してですが
件名がベース64で本文がJISコードのメールを読む時、
以下の状態になってしまいます。
直す方法を知っている方おりましたらお教えください

1.件名が日本語の長文だと、以降の画面が文字化けします
2.JISコードの本文を開くと
    「---Executing: kterm sh: kterm: 見つかりません」
    とでてしまい表示できません

No. 3683 # 68user 2004/04/16 (金) 04:28:19
>>3679 vm
> これより良い方法がございましたら、ご教授ください。
awk より良い方法かどうかはわかりませんが、
    sed 's/^\(..\)/\1TUIKA/' < target.txt > result.txt
というのもあります。

>>3681 馬場
すでにアーカイブ済のファイルが出現したため、前に戻って
置き換えようとしたが、テープドライブのため前に戻る機能が
なかった、ということではないですかね。

>>3682 ryo
Solaris2.6 ではその症状は出ませんでした。

No. 3684 # Phantom 2004/04/16 (金) 10:02:39
こんにちは。Phantomと申します。

ネットで色々調べた結果ちょっと、見当たらなかったので質問させてください。
アクセスログの話なのですが、Web/FTPサーバのアクセスログでは有りません
(Web/FTPのアクセスログの情報は腐るほど有りました。また、情報が全く無か
ったと言うのは嘘で、高いソフトウェアやASPぐらいの情報しか出てこず、個人
の私としては手が出ません。)。

ローカルのLinux環境内でアクセスされたファイルのログを取りたいと考えて
いるからです(Unix系OSで実現するのが難しいから情報が少ないのでしょうか?)。
当然、アクセスログなのでアクセスしたユーザ名、時間、アクセス先などの情報を
見たいと思っています。
セキュリティの事もあるのですが、私自身が何時ファイル(特に設定ファイル)の
編集を行ったかという履歴を見たいからです。

それで、これに見合った(フリー)ソフトウェアやシェルスクリプト等が存在しまし
たら、紹介していただければ幸いです。(それとも、もしかしてすごく簡単にPerl
とかで組めちゃったりするんでしょうか?)

No. 3685 # 68user 2004/04/16 (金) 11:24:16
>>3684 Phantom
履歴や変更点の確認をしたいということなら、cvs や subversion
などのバージョン管理ツールを使うのがよいでしょう。

履歴を何段階でもとることができ、細かい修正点を記録できるという
利点がありますが、その一方でファイル更新とバージョン管理とが
密に連携しているわけでないので、バージョン管理ツールへの登録
忘れが発生する可能性がある、という欠点があります。

あるいは
> ユーザ名、時間、アクセス先
だけの情報だけでよいなら、
      - ユーザ名、時間、ファイル名を記録する
      - エディタを起動する
      - (必要なら) 編集前と編集後のファイルをどこかに保存する
というファイル編集用スクリプトを作成し、それを使うように
すればよいでしょう。もちろん、このスクリプトを使わずに直接
ファイルを修正してしまうとアウトです。

もっと厳密にやりたいならシステムコールをフックするタイプ
のものが必要です。たとえば Linux Security Module (LSM) や
      Sysrace: http://www.citi.umich.edu/u/provos/systrace/linux.html
など。

しかしこれらの主目的はシステムコールを許可するかしないかを
決めるためのものなので、ログを記録できるような仕組みがある
のかどうかはわかりません。

> Unix系OSで実現するのが難しいから情報が少ないのでしょうか?
Windows なんかだと API のフックが簡単にできますが、UNIX は
そこらへんの機能が弱いのです。

No. 3686 # Phantom 2004/04/16 (金) 12:12:08
>>3685 68user
凄く素早いレス有難う御座いました。
沢山の情報を与えてくださって感謝しております。

> cvs や subversion
成る程。バージョン管理ツールという手が有りましたか。

> ファイル編集用スクリプトを作成
作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
編集しちゃって失敗しそうです。

> LSM や Sysrace
私には難しいみたいですが、一つの手として調べてみます。

No. 3687 # zsh 2004/04/16 (金) 12:53:07
>>3686 Phantom
>作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
>編集しちゃって失敗しそうです。
エディタコマンドと同じ名前のスクリプトを作成し、
スクリプトを格納したディレクトリを環境変数PATHの先頭に追加しては如何なでしょうか?

No. 3688 # scott 2004/04/17 (土) 15:00:50
Solaris7にて/dev/consoleに出力しているログを横取りして
ファイルに落としたいんですが、なにかいい方法はありますか?
ありましたらご教授願います。

No. 3689 # MM 2004/04/21 (水) 00:00:53
こんにちは。

あるSolarisからLinuxにPingすると、

do you want to ping broadcast? Then -b というメッセージがかえってくるのですが、
どういう意味ですか?他にも10台あって、この2台以外はお互いちゃんとPingできるのですが、どうしてでしょうか?

SolarisのIPとホストは172.17.155.01 AT002といいます。
Linuxのほうは172.17.155.17 AI007といいます。

SolarisからLinuxにPingすると"no answer from AI" といわれ。
LinuxからSolarisにPingすると"do you want to ping broadcast? Then -b" なります。

教えてください。
MM

No. 3690 # 68user 2004/04/21 (水) 00:51:00
>>3688 scott
syslog に出力するようにして、syslog.conf の方で
ログファイルにも落とすようにする、という方法しか
思いつきませんでした。

>>3689 MM
> do you want to ping broadcast? Then -b
> どういう意味ですか?
x.y.z.255 などのブロードキャスト宛に ping したいので
あれば、-b オプションを付けなさい、ということです。

とりあえずネットワーク設定がうまくいっていないようなので、
そこを見直すのがよいのではないでしょうか。たとえば
/etc/hosts に変な記述がないかとか、ネットマスクは同じか
とか、IP アドレスを直接指定して ping するとどうなるかとか。


で、質問です>どなたか

質問 1.
「Do you want to ping broadcast」でぐぐると、
    http://licensing.steeleye.com/open_source/diffs/ping.c
が見つかりました。

    #ifdef linux
        if (source.sin_addr.s_addr == 0) {
            int probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
            dst.sin_port = htons(1025);
            if (connect(probe_fd, (struct sockaddr*)&dst, sizeof(dst)) == -1) {
                if (errno == EACCES) {
                    if (broadcast_pings == 0) {
                        fprintf(stderr, "Do you want to ping broadcast? Then -b\n");
                        exit(1);
                    }
                }
            }
        }
        bind(s, (struct sockaddr*)&source, sizeof(source));
    #endif

とありますが、何をやってるのかさっぱりわかりません。
source.sin_addr.s_addr が 0 なら、UDP でポート 1025
に connect? なんのために? connect したら、それを bind?
なんのため?

質問 2.
あるディストリビューションの Linux で採用している ping の
ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
RedHat ならどこを見ればよいですか?

No. 3691 # has 2004/04/22 (木) 00:36:04
>>3690 68user
>質問 2.
>あるディストリビューションの Linux で採用している ping の
>ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
>RedHat ならどこを見ればよいですか?

いつもどおり答えになってませんがDebian GNU/Linuxのは見つかりました。
http://packages.debian.org/stable/net/netkit-ping

linuxは基本的にtar.gzやtar.bzでの配布よりもrpm(redhat package manaer)
形式(ソースなら*.srpm、*.src.rpmの場合もあり)が普通みたいですよ。

なお今回は、[ping srpm ソース]で検索→[netkit-ping]で検索→到達です。
# 本当はもっといろいろ遠回りしてますが…

No. 3692 # 流離のカメソらいだ〜 [E-mail] 2004/04/22 (木) 20:59:55
僕は某高専2年の電気科なんですが,C言語の授業があって学校のPCのOSがunixなんですよね〜。
Windowsで作成した文書ファイル(拡張子.c)をFDでunixに送る場合,文字化けしますよね?
それを防止する方法を教えて下さい。メールで返答していただければ幸いです。

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

No. 3693 # vm 2004/04/23 (金) 13:04:14
>>3692 流離のカメソらいだ〜
一般的にはWindowsの標準文字コードがS-JISで、UnixがEUCだからそうなります。
FDに保存する際にエディタでEUCに変換しておくか、
エディタにその機能がないかUnix上で変換かける場合は、nkfコマンドを使ってください。

No. 3694 # abc 2004/04/24 (土) 13:40:28
texの文書で、dviのファイルをpdh形式に変換したいのですが、人に聞いた
ところGhostscriptを使ってできるとのことで、早速GSを落としてみたので
すが、具体的な操作など教えてもらえれば幸です。

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