|
>>3444 perler > なるほど、それがperlの仕様なんですね^^ perl とは関係ないです。これは HTML と CGI の領域です。 apache-1.3.29・IE6・Mozilla-1.5 で試した結果、 > method='GET'の場合 > http://xxx.cgi?mode=resとなりpara2=data2がおくられない。 これは正しいです。正確に言うと 「ブラウザが para2=data2 を送らない」 です。 > method='POST'の場合 > http://xxx.cgi?para2=data2となりmode=resがおくられない。 これは間違いです。標準入力を解析していないだけ、でしょう。 以下の CGI スクリプトを実行し、GET と POST それぞれで QUERY_STRING と標準入力にどういう値が入っているか確認 してください。 ------- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; $script_name = $0; $script_name =~ s|.*/||; print <<END; <html><body> <form action="$script_name?para2=data2" method='GET'> <input type="hidden" name="mode" value="res"> <input type="submit" value="GET"> </form> <form action="$script_name?para2=data2" method='POST'> <input type="hidden" name="mode" value="res"> <input type="submit" value="POST"> </form> END print "REQUEST_METHOD=$ENV{REQUEST_METHOD}<br>\n"; print "QUERY_STRING=$ENV{QUERY_STRING}<br>\n"; print "STDIN=\n"; print <STDIN>; |
|
>>3445 68user お返事ありがとうございました。 なるほど、標準入力を解析しないということがわかりました。 パラメーターを指定しているのにPOSTをつかったのがいけなかったようですね。 またGETをつかってもパラメーターを送らないので素直に違う方法を考えます。 ご教授ありがとうございました。 |
|
>>3443 68user こんにちは、Muleです。 ご返事、ありがとうございます。 中途半端なコードを書いたせいか、誤解があったようですが、わたしも68user様が言われた、 >http は proxy 経由かもしれないが、ftp や telnet は >proxy 経由でないことを期待して、クライアント側から >ftp や telnet でサーバに接続させるように仕向けて、 >IP アドレスを取得する という、まさにそのことを考えております。 proxyのルーチンは、proxy経由かどうかを最初にチェックする為のもので、 httpからのアクセスがproxy経由でなければ、画像を出力し普通に接続元を記録する。 そうでなければ、クライアント側からtelnetでサーバに接続させて、接続元を記録する、という流れです。 FTPと書いたのは、わたしのほうで、FTPを用意し、CGIから出力する画像の参照元に、FTPサーバにある画像を指定して出力させれば、FTPのログに元の接続先が残るのではないかと思うからです。 考え方として、何か大きな間違いをおかしているでしょうか? ご指摘いただければ、幸いです。 |
|
>>3447 Mule > そうでなければ、クライアント側からtelnetでサーバに接続させて、 > 接続元を記録する、という流れです。 なるほど。つまり、 >>3442 Mule のサンプルは、 接続元 IP アドレスに接続 [*1] if ( 接続成功 ){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。[*2] } else { 画像を表示 } ということですね? もしそうなら納得です。 ただ、*1 の部分は可能ですが、*2 の部分はよほどセキュリティが 甘いブラウザでないと無理なのではないか、と思います。 |
|
>>3448 68user さっそくのご返事、感謝いたします。 私が考えているのは、68user様のひながたに沿って考えると、最初にtelnetを起動するというのではないです。 たとえば、こんな感じになると思います。 use CGI qw(:standard); $addr = remote_addr; $host = remote_host; $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); unless($host){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。 } else { 画像を表示 } です。 素朴に疑問なのですが、最初にtelnetを起動して、接続元に接続できるかどうかの判定を行わなければ、理屈的に無理なのでしょうか? 私は、proxy経由のアクセスがあった時にのみ、if文を実行させたいと思うのですが... |
|
>>3449 Mule > $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); 逆引きに成功したら (つまりクライアントが FQDN を持って いたら) proxy 経由でない、逆引きに失敗したら proxy 経由 という判定方法ですね。 これは proxy 判定にはなっていません。なぜなら技術的には、 「FQDN を持つかどうかと proxy サーバであるかどうか」 は関係がないからです。 後は統計的に 「proxy サーバは FQDN を持たないケースが多い」 と言えるかどうかですが、特にそういうこともないと思います。 むしろわたしは 「proxy サーバは FQDN を持つ可能性が高い」 と思います。 > 素朴に疑問なのですが、最初にtelnetを起動して、接続元に > 接続できるかどうかの判定を行わなければ、理屈的に無理 > なのでしょうか? 理屈的には、100% の精度の proxy 判定は不可能です。 ただ、完璧でなくていいなら、以下のような策はあります。 1. proxy 特有のヘッダ、例えば以下のようなものが設定されて いるか調べる。 HTTP_PROXY_CONNECTION HTTP_SP_HOST HTTP_VIA HTTP_X_FORWARDED_FOR http://taruo.net/e/ などで判定しているのはコレでしょう。 http://www2s.biglobe.ne.jp/~cru/library/lq/index.html でも 同様の判定を行っているようです。 ただし、proxy サーバの管理者が適切に設定すれば、これらの ヘッダを渡さないようにすることは可能です。 2. クライアント側の適当なポートに接続し、公開 proxy か どうか (誰でも接続できる proxy かどうか) 判断する。 例えば 2ch ではこれをやっているんでしょう。 http://info.2ch.net/guide/faq.html#F5 ただし、以下のような欠点があります。 - どのポート番号に接続するかは適当に決めなければならない。 全ポートをポートスキャンしていると時間がかかる。 - あくまで「公開 proxy」かどうかの判定にしか使えない。 (世の中の proxy の大多数を占める) 特定のネットワーク内から のみ使用可能な proxy は判定できない。 - ポートスキャンは反社会的。やりすぎると相手からクレームを 付けられる可能性が高い。 3. telnet・Java Applet などで直接接続させるよう仕向ける。 詳しくは以下のサイトをどうぞ。 http://akademeia.info/main/lecture3/tokubetu_IP_nuki.htm http://www.nurs.or.jp/~telnet/tips.html の 「telnetプロトコルによるIP抜き」 ただしこれも反社会的です。いきなりこれをやられたら、 わたしならそのサイトには二度と行きません。 普通は 1 でやめておくのがいいでしょう。2・3 は真面目な ページでやるには過激すぎると思います。 |
|
質問ではないんで、邪魔だったら消してくださいね。 過去ログを時間が許すままに読んじゃいました。 とってもおもしろかったです^^ まだまだいっぱい残っているので読破しようとおもいます。 言語はたくさん覚えたけど、UNIXには触ったことがないというある意味 希少なプログラマーなのでちょっとわからないこともあるんですけど、 予想するのが楽しいです。 最近のログをみていると応援の書き込みが少なかったので「管理がんばってください」の意味をこめてかきこませていただきました。 お目汚し失礼いたしました。 |
|
大変、参考になりました。 私がproxyのチェックを行う際には、hostが存在するかどうかの他に、以下のような環境変数を配列に入れて、foreach文や正規表現と組み合わせてチェックしています。 @proxy = ("HTTP_CLIENT_IP", "HTTP_VIA", "HTTP_CACHE_INFO", "HTTP_CACHE_CONTROL", "HTTP_FORWARDED", "HTTP_X_FORWARDED_FOR","HTTP_SP_HOST", "HTTP_TE","HTTP_XONNECTION","HTTP_PROXY_CONNECTION", "HTTP_XROXY_CONNECTION","HTTP_X_LOCKING", "HTTP_PRAGMA","HTTP_IF_MODIFIED_SINCE","HTTP_PC_REMOTE_ADDR"); この他に、 $ENV{'HTTP_CONNECTION'}を調べ、値がkeep-alive以外であればproxyと... しかしこの方法では、精度の高いproxyの判定は、厳しいのではないか...というのが現実でした。 最初から言えばよかったのかも知れませんが...というか、上手く説明できなったのですが、 私がやりたかったことは、結局のところ、 imgタグでしかCGIを起動できない環境で、3 ができるかどうかでした。 コードを直接置ける環境での、3のコードは書いたことがありますので、これをイメージをトリガーにした方法で実装できるかどうかが問題でした。 (telnetの自動起動は、いくらでも未然に防げるものの...) これまでいろいろご教授いただきまして、ありがとうございました。 また書き込みにくるかもしれませんが、暫くは教えていただいた情報を元に試行錯誤してみます。 それでは、よい休日を。 |
|
みなさん こんにちは。 すごく簡単な質問だと思うのですが、 過去ログを見てもわからなかったため質問いたします。 UNIXコマンドの compress a 1>/dev/null 2>&1 というコマンドについて。 compress a は、aファイルをcompress形式で圧縮するということはわかるのですが、 1>/dev/null 2>&1 は、どういう処理をしているのかわかりません。 よろしくお願いします。 |
|
>>3451 perler ありがとうございます。それなりにがんばります :-) >>3452 Mule どうもお互い無駄な時間を浪費したように感じます。掲示板で 円滑なコミュニケーションを行うにあたり、質問時にどの程度の 情報を書くべきかについて ご一考ください。 >>3453 あかつき compress の出力を全て捨てるということです。 http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 http://x68000.startshop.co.jp/~68user/unix/pickup?%2Fdev%2Fnull |
|
ご回答ありがとうございました。 すでにまとめてありましたね。 こんどから、もっときちんと調べます。 |
|
大雑把な質問ですがResetConnect関数はどのように使うものなのですか? |
|
挨拶が抜けましたが、初めて書き込みます。宜しくお願いいたします |
|
>>3456 Hide ResetConnect関数とは何ですか? (google でも 6件しか 引っかからないようですけれども) |
|
一般的な関数でないのでしょうか? RST送信するんですが・・ |
|
>>3459 Hide わたしは初めて聞きました。 |
|
Bシェルなのですが、tarで標準出力した結果をteeでファイルに出力し なおかつ、tarの正常、異常を判断したいのですが、どうすればよい のですか。 tar -cvf /dev/rmt/0m * 2>&1 | tee -a kekka.txt と行ったのですが、標準出力及びkekka.txtに出力されたのですが、 $?の値が常に「0」の状態です。 標準出力、ファイルへの出力、$?の判定を行えるよにするにはどう すればよいのですか。 |
|
>>3461 だん ちゃんとステータスコードを取れるみたいですよ。 % true | tee -a kekka.txt; echo $? 0 % false | tee -a kekka.txt; echo $? 255 と思ったら、取れるのは csh・tcsh だけで sh (Solaris2.6)・bash は 無理みたいですね。 sh では % true && succeed=OK % echo $succeed % false || succeed=NG % echo $succeed や % true && echo OK | tee -a kekka.txt % false || echo NG | tee -a kekka.txt はいけるのに、 % true && succeed=OK | tee -a kekka.txt % echo $succeed % false || succeed=NG | tee -a kekka.txt % echo $succeed は $succeed に値が入らない。なんでだろう。 # サブシェルで実行されるから? というわけで、Solaris2.6 の sh では % (true; echo $? >result) | tee -a kekka.txt % cat result % (false; echo $? >result) | tee -a kekka.txt % cat result とステータスコードをファイルに保存するというかっこ悪い方法で 実現できました。より美しいやり方を募集中です。 |
|
>>3462 68user 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) |
|
>>3463 has ああ、すみません、3462をよく読んでませんでした。 68userの言う、&&とか||の処理詳細と(;)の違いは良く知らないんですが、 redhat 9.0のshでは3463のやり方ができたもので。 一応ご報告まで。 |
|
>>3463 has それだと (〜) の部分はサブシェルが実行することになります。 サブシェルのシェル変数は確かに $rc=1 になるけれど、親の シェルのシェル変数には影響しないので、結局 (〜) の外から $rc を参照することはできないと思います。 ちなみに a && b は、a のステータスコードが 0 のときのみ b を実行 a || b は、a のステータスコードが >0 のときのみ b を実行 です。 |
|
はじめまして. httptalker をしばらく前から愛用しております. 非常に強力なツールで,Webから必要な情報を取得し目的にあわせて加工するなど の用途でたいへん助かっているのですが,ひとつ質問をさせてください. パスワードの認証の後でCookieを受け渡す形式のWebSite のデータをGETする よい方法は,あるでしょうか? httptalker のScript の中にCookie のやりとりをする機能を埋め込めばよさそう ですが,わたしにはかなり難しいのです. |
|
>>3466 capricio えーっと、お使いのものはこれですか? http://x68000.startshop.co.jp/~68user/net/sample/http-client-2.pl これは解説用のサンプルなので、実際の使用はおすすめしません。 じゃなくて http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker これをお使いなら、あまりに汚いコードだったので、さきほど少し 書きなおしました。ついでに追加ヘッダを指定できるようにしました。 % ./httptalker -GET http://example.com/foo/bar -add-header 'Cookie: a=b' で cookie を送信できます。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker?rev=1.3&content-type=text/plain ここからどうぞ。 ただし、これの使用もおすすめしません。テストもしっかりしていないし、 機能面でも劣るからです。 というわけで、できるならば - wget (--load-cookies=ファイル名 で cookie を指定できる) - LWP モジュール付属 (libnet モジュール) の GET コマンド。 オプション -H 'Cookie: a=b' で cookie 送信可能。 - H_HTTP モジュール (http://www.studyinghttp.net/H_HTTP.html) などを使った方がよいでしょう。 |
|
>>3462 68user $ ( true | tee -a kekka.txt ) & ; wait $! ・・・・・やっぱり綺麗じゃないですね。 |
|
すみません徹夜明けでボケてました。 吊って来ます・・・ |
|
>>3463 has 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) 私は、HP-UXを使用しているのですが、 % ( true ; rc = $? ) と実行するとシステムのシャットダウンになります。 他のOSも同じだと思うのですが、使用するときは注意した方が 良いと思います。 |
|
>>3470 くに > % ( true ; rc = $? ) > と実行するとシステムのシャットダウンになります。 /etc に PATH が通っていたため /etc/rc が実行されたのではないかと 思います (引数は = と $?)。 sh の変数代入は = の前後に空白を入れてはいけないので、 rc = $? でなく、rc=$? ですね。 |
|
lsコマンドについて質問です。 lsと実行するとファイル名やディレクトリ名が表示されますが、 ファイル名だけとかディレクトリ名だけとかを表示させたいの ですが、できるのでしょうか。 manで調べてみたのですが該当するものもありません。 何かと組み合わせてて1行でできないものでしょうか。 |
|
>>3472 hanzen > lsと実行するとファイル名やディレクトリ名が表示されますが、 > ファイル名だけとかディレクトリ名だけとかを表示させたいの > ですが 以下のやりとりを参考にしてください。 >>3245 bebe >>3246 68user |
|
>>3465 68user すみません、勘違いしてました。 3463 でできたと思っていたら、1行ずつ実行したときにセットした rcの値が表示されただけでした。 >>3470 くに それは予想していませんでした。 何にせよ紛らわしいのはよくないですね。 気をつけます。 というわけで何かよい方法はないか探してみましたが、 bashだとこういうのがあるみたいです。 (ただしシェルスクリプト内限定らしいですが) $ echo $BASH_VERSION 2.05b.0(1)-release $ cat pipetest.sh #!/bin/bash true | false | true | false echo ${PIPESTATUS[@]} $ ./pipetest.sh 0 1 0 1 あとはこんなん:-< cp /dev/null kekka.txt ; tail -f kekka.txt & pid=$! ; command > kekka.txt ; st=$? ; kill $pid echo $st |
|
>>3465 68user 恥の上塗り。 いろいろと試してみましたが、 ファイルを作成せずにステータスは取得できそうにありません。 後は作成するファイルが通常のファイルかFIFOかくらいの違いでしょうか? ------ #!/bin/sh fifo="fifo.$$" mkfifo -m 600 $fifo trap "rm -f $fifo" 0 1 2 3 15 ( command ; echo $? >$fifo ) | tee kekka.txt & rtn=`cat $fifo` echo $rtn >>3472 hanzen >>3473 68user 後は ls -F | grep '/' とかでしょうか。表示に/がついてしまいますが。 |
|
UNIXでファイルを開かずにファイルの解析を行いたいのですが、 fileコマンドでは実行ファイルなのかどうかなど、詳しいことが わかりませんでした。 #C言語関連のソースかどうか確認したいのです。 何か、他にいい方法はないでしょうか? 教えていただけるとありがたいですm(__)m |
|
こんにちは。 以前、こちらで幾らか質問させて頂いた tomo と申します。 今、perlでタイマ処理をする事を考えているのですが、 perlではC言語の様にタイマIDという形で複数のタイマを 識別管理する事は出来ないのでしょうか? |
|
>>3476 橘 調べたいのは > fileコマンドでは実行ファイルなのかどうか と > C言語関連のソースかどうか のどちらですか? 「〜かどうか判定したい」ということなら、何らかの判断基準が ないと判定できませんので、そこらへんを明確にしてください。 >>3477 tomo > perlではC言語の様にタイマIDという形で複数のタイマを > 識別管理する事は出来ないのでしょうか? C にも perl にもタイマ ID という概念はありません。 そもそも「タイマ ID」とは Win32API (MFC?) のそれですか? なら、perl で Win32API を利用できるモジュールを探せば できるでしょうが、あいにく Windows には明るくないので http://www.cpan.org から探してみてください。 |
|
68user 様 UNIXの部屋等、ちょくちょく参考にさせて頂いております。ありがとうございます。 私、現在、DNSまわりのプログラミングを行っておりまして、ネットワークプログラミングの基礎知識の DNS クライアントを作ってみようのページを、基礎から理解する意味で読ませて頂いたのですが、 この(2)のページ、http://x68000.startshop.co.jp/~68user/net/resolver-2.htmlの DNSヘッダのフラグの部分の第13〜15bitの3bitがRCODEとなっていますが、これは第13〜16bitの4bit分の 間違いだと思うのですがいかがでしょうか。 細かい部分で申し訳ないのですが、気になりましたのでご報告させて頂きました。お忙しいとは思いますが、 よろしくお願いいたします。 |
|
>>3479 なっち ご指摘ありがとうございます。修正しました。ついでに 1…15bit、16…31bit となっていたものを 1…16bit、17…32bit に修正しました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/resolver-2.html しかし、一般的には MSB を第 0bit とする場合が多いでしょうか? 「詳解TCP/IP Vol.1」では 0〜31bit となっていましたので、 悩むところです。 |
|
何をもってして一般的というかによりますが・・・ ハードウェアでは、例えばverilogのバス表記の例にとると、 [15:0] > [0:15] >>> [1:16]という頻度で見かけます。 僕の知っている限りの物理層では、[0]が時間軸で最初に 送受信されるので、[0:15]という表記が現れます。 とはいえ、中身を解釈する際に、[15:0]のように置き換え ないと、人間には理解し難い事が多々あり、そのような処理 は僕はよくします。 |
|
awkの使い方について教えて下さい。 awkを使用して、以下の出力を、数字は、3桁毎にカンマで区切り、 出力位置を揃えて出力したいのですが、 180 file1.txt 1821 file2.txt 113457 fil3.txt を 180 file1.txt 1,821 file2.txt 113,457 file3.txt と出力したいのですが、 数字の部分を揃えることができません。 そのため、たの部分もそろいません。 どうすれば上手くできますか。 ------------------------------- #!/bin/sh # cat list.txt | sort -n -r | awk ' function put_comm(val) { if (val < 1000) { printf("%d",val) ; } else { put_comm(val / 1000) ; printf(",%03d",val % 1000) ; } } { if ($1 < 1000) { printf("%d",$1) ; } else { val=$1 ; put_comm(val) ; } } { #printf "\n" printf(" %s\n",$2) }' |
|
いつも参考にさせていただいてます dtterm上で動作するC言語のプログラムを作成しています そのプログラムで、cursesのwaddchとwrefreshを使用して1画面分の描画を1文字ずつ行っているのですが、 その際にカーソル表示がされているため、ちらついてしまいます カーソルを一時的に消す方法は無いでしょうか? ちなみに、waddchで画面編集後、最後にwrefreshを1回呼ぶ方法ですと、 一気に1画面分を表示できるのですが、編集時間が長く感じられるため、 1文字ずつパラパラと表示したいと考えています。 |
|
>>3482 米 桁数の上限がわからないと駄目ですが こんなのでどうでしょ?(下では8桁まで) ------ $ cat list 123 file1.txt 123456 file2.txt 1234567 file3.txt $ cat test.awk #!/bin/nawk -f { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; } $ ./test.awk list 123 file1.txt 123,456 file2.txt 1,234,567 file3.txt |
|
>>3481 へにか > 僕の知っている限りの物理層では、[0]が時間軸で最初に > 送受信されるので、[0:15]という表記が現れます。 なるほど。ネットワークプログラミングでは当然ネットワーク バイトオーダで MSB が先になるわけなので、 [0:15] か [1:16] のどちらかで決まりですね。 個人的には「プログラマたるもの数えるときは 0 から」という ことで、そのうち [0:15] に修正しておこうと思います。 >>3483 tonpei curses はよくわかってませんが、curs_set(0) ですかね。 capability 的には cursor_invisible (vi) っぽいです。 ただ、端末エミュレータにカーソルを消す機能があるかという 問題があるかもしれません。うちの FreeBSD の /etc/termcap に xterm-basic|xterm common (XFree86):...:vi=\E[?25l:... とあったので xterm で % printf "\033[?25l" とするとカーソルが消えましたが、kterm-6.2.0_5 では消えません でした。kterm にカーソルを消す機能がないような感じがします。 でもまぁ dtterm なら多分大丈夫だとは思います。 |
|
>>3484 zsh 環境も書かずに質問して申し訳ありません。 HP-UX11.00です。 nawkが入っていないので、awkに変えて実行しました。 一応、上手く動きました。 cat list.txt $1 | sort -n -r | awk ' { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; }' |
|
>>3486 米 以下の様に、数字が5桁、4桁は正しくでませんでした。 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt |
|
>>3487 米 if ( i > 1 ) { を if ( i >= 1 ) { です。 |
|
>>3488 米 すみません、その部分のif文自体不要でした。 (不要になるように修正してたのを忘れてました。) ----- $ cat list 1 file1.txt 12 file1.txt 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt $ cat test.sh #!/bin/sh sort -n -r $1 | awk '{ i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } printf("%10s %s\n",str_buf,$2) ; }' $ sh test.sh list 1,234,567 file5.txt 123,456 file4.txt 12,345 file3.txt 1,234 file2.txt 123 file1.txt 12 file1.txt 1 file1.txt |
|
68Userさん、回答ありがとうございました またまた質問がありますので、どなたか回答よろしくお願いします 環境:HP-UX Ver.11.0 1.XWindowのログイン後、言語選択の画面が表示されますが、この画面を出さずに、デフォルトで ATOKを選ぶ方法は? 2.XWindowの起動後、ウインドウ内に、ツールバー(端末起動、エディタ起動などのボタン郡)が 表示されますが、これを非表示(アイコンも無くす)にする方法は? 以上、2件についてご存知でしたら、回答お願いします |
|
HP-UXですが、シェルについて教えて下さい。 printfを使用して書式で、変数の中身を出力しているのですが 上手くできません。 ----------------- #!/bin/sh name1="yamada" name2="taro" printf "%s %s --> %s\n",${name1} ${name2} NG exit 0 ------------ とすると yamada NG --> ,taro となってしまいます。 |
|
>>3490 tonpei http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse の 「回答をもらったら結果を報告する」 をよく読んでください。なお、>>3490 の質問については わかりません。 >>3491 みの > printf "%s %s --> %s\n",${name1} ${name2} NG カンマが余分だと思います。 printf "%s %s --> %s\n" ${name1} ${name2} NG > yamada NG --> > ,taro > となってしまいます。 本当ですか? taro NG --> ,yamada になりませんか? |
|
http://x68000.startshop.co.jp/~68user/net/ ネットワークプログラミングの基礎知識 の http://x68000.startshop.co.jp/~68user/net/crypt-1.html 暗号化のお話 (1) 共通鍵暗号方式 を更新し、 http://x68000.startshop.co.jp/~68user/net/crypt-2.html 暗号化のお話 (2) 公開鍵暗号方式 http://x68000.startshop.co.jp/~68user/net/crypt-3.html 暗号化のお話 (3) 署名 http://x68000.startshop.co.jp/~68user/net/crypt-5.html 暗号化のお話 (5) まとめ を追加しました。 |
|
>>3492 68user 安易な回答をしてしまい申し訳ありませんでした。 利用規約を読ませていただきましたので、改めて回答させてください。 御指摘頂いた、curs_set(0)使用することで、dtterm上でカーソルの消去ができました。 また、printfの方法でも可能でした。 ありがとうございました |
|
>3492 すみません カンマが余分でした。 ありがとうございます。 |
|
HP-UXでのawkについて質問なのですが、 awkを使用してファイルのENDを判断できるのですか。 例えば、 cat date.txt aaa aaa bbb aaa bbb ccc 111 111 222 111 222 3333 とあった場合、 ------------------------ #/bin/sh awk ' function sub() { } getline ; 処理省略 { if (NF == 0) next ; if (NF >= 1) sub() ; ※ }' data.txt ---------------------- ※の場所でファイルのENDか判断したいのですができるのでしょうか。 |
|
>>3496 ブラウン ファイルのENDというのが最後の行の事なのか EOFの事なのか不明ですが、最終行であれば以下のように。 ちなみに環境はSolarisです。 ------ #!/bin/sh max_line=`wc -l $1 | awk '{ print $1 }'` awk '{ print ; if ( NR == max_line ) printf "END\n" }' max_line=$max_line $1 ------ 行数を取得する為だけにawk使うのはどうかと思いますが。 |
|
はじめましてです。C言語を勉強しているものです。 質問なんですが、ネットワークプログラミングで チャットを使ったゲームみたいなものを作りたいなと思っておりまして、 具体的にチャットではサーバーがクライアント全員にメッセージを送る 形になりますが、このゲームではクライアントが メッセージを送る人を選ぶことができるようにしたいのです。 たとえば会話しているのは5人いるけどそのうち3人に送ろうという 感じです。クライアント側で、全ユーザーの名前が表示され その中から送る人を選ぶみたいなかんじのゲームなんですが。 チャットにおいて選んだユーザーにだけメッセージを送るというのは 一体どうすれば可能なのですか? |
|
>>3497 zsh ありがとうございます。 説明不足ですみません。 ファイルのENDというのは、最終行ではなく、EOFのことです。 また、行数を取得するためにawkを使用していません。 awkを使用して、ファイルから1レコードづつよみこみ条件 毎に処理を行い、EOFだったら終了と考えていたのですが。 |
|
>>3499 ブラウン 取得したいのがEOFだとすると getlineの戻り値見るくらいしか思いつきません。 普通にENDに記述じゃダメですか? 或いは行数+フィールド番号でファイルの最後をチェックするとか。 >また、行数を取得するためにawkを使用していません。 すみません、行数を取得するためだけにawkを使うのはどうか というのは自分に対して言ったものです。 |
|
あけましておめでとうございます。 朝早くから失礼いたします。 このページは、EmacsLipsでネットワークプログラミングについて ぐぐっていたら、たどり着きました。 早速一つ質問させてください。 telnetでウェブサーバからファイルを取ってこようとしたところ、 GET /hoge.rdf HTTP/1.0 で、404になってしまいます。ブラウザやwgetだと取ってこれます。 こういう場合は、どのようにすればいいのでしょうか? # あと、私事で恐縮なのですが、SEGA BBSのログを発見したので、 # ためしに名前を入れてみたらおもいっきりヒットしました。(^_^;) # いやー懐かしい。とにかく懐かしいです。(;_;)ホロホロ # ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって #「くにおにく」さんのページですよね? # 当時、「くにおにく」さんに大変世話になった記憶があります。 # 無事で過ごされているようでしたらなによりです。 # 以上、私事で失礼しました。 |
|
>>3501 けんおお すみません。自己解決しました。 GET /hoge.rdf HTTP/1.1 Host:hoge.jp Connection:close でいけました。 最近は、HTTP/1.0ではファイルを取ってこれなくなったんでしょうか? それでは、失礼します。 |
|
はじめまして。 検索辿ってこちらを拝見させていただきました。 早速質問させていただきたいのですが、 SunのUltra10 SPARKマシンで、SunOSのデスクトップに ファイルを配置するためにデスクトップの絶対パスを調べたいのですが、 Windowsのデスクトップのようにショートカットの絶対パスを辿ろうと しても一向に見つかりません。 もしかしてSunOSのデスクトップ(ワークステーション?)上のショートカットは実体のない参照(リンク)でしかなくて、デスクトップの絶対パスなんてものは存在しない(ファイルを置くことはできない)のでしょうか。 よろしくご教示お願いします。 |
|
>>3498 ポッしブル > チャットにおいて選んだユーザーにだけメッセージを送るというのは > 一体どうすれば可能なのですか? 名前と IP アドレスの一覧のテーブルを内部に持っておいて、選択 された名前から対応する IP アドレスを得て、その IP アドレス宛に メッセージを送信すれば可能でしょう。 要は、そういう動作をするように、あなたがプログラムを組まなく てはならないということです。 >>3501 けんおお >>3502 けんおお GET /hoge.rdf HTTP/1.0 が 404 not found なのは、 バーチャルホストな web サーバだったからでしょう。 http://x68000.startshop.co.jp/~68user/net/http-4.html さらなる改善点・バーチャルホストに対応 を読んでください。 HTTP/1.1 で OK だったのは、HTTP/1.1 だと Host ヘッダが 必須なため、結果的にバーチャルホストに対してホスト名を 提示することができたからだと思われます。 > # ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって > #「くにおにく」さんのページですよね? そうです。でも今は公開されていないようですね。1年ほど前に BBS があることは確認しましたが、今は見つけられません。 >>3503 ShinoP CDE ですか? CDE をまともに使ったことはありませんが、 Solaris2.6+CDE 環境で試してみると、 ~/.dt/Desktop/.!dtdesktop ~/.dt/sessions/current/.!dtdesktop などのファイルに、リンク先のフルパスが保存されているような 気がします。 |
|
>>3504 68user いえ、リンク先のフルパスが知りたいのではなく、目的は 「デスクトップ」自体の絶対パスを知りたい、ということです。 少々説明が足りませんでした。 その手段としてWindowsと同じ感覚でショートカットのリンク先ではなく ショートカット自身の絶対パス (Windows2000ならば "C:\Documents and Settings\administrator\デスクトップ" で表されるような) を調べようとしたのですが、 どうにも見つかりません。 これは現在疑ってる通り、ショートカット自体には実体がなく、 したがってデスクトップに実体ファイルを配置する、 ということは不可能だということなのでしょうか。 |
|
>>3505 ShinoP そういうことであれば > ショートカット自体には実体がなく、したがってデスクトップに > 実体ファイルを配置する、ということは不可能 だと思います。 ただしわたしは CDE は常用しておらず、今回初めて CDE のヘルプを 見たくらいなので、間違っている可能性は多分にあります。 |
|
>>3506 68user CDEのデスクトップショートカットはシンボリックリンクみたいなもの、 ということのようですね。 断念して代替パスを設定する方向で進めようと思います。 ありがとうございました。 |
|
>>3500 zsh >取得したいのがEOFだとすると >getlineの戻り値見るくらいしか思いつきません。 >普通にENDに記述じゃダメですか? >或いは行数+フィールド番号でファイルの最後をチェックするとか getlineの戻り値ですか。 ファイルの総行数を取得して、読み込んだ行数と比較するかと思う のですが。 >或いは行数+フィールド番号でファイルの最後をチェックするとか ちなみにどうするのですか。 >普通にENDに記述じゃダメですか。 とはどういう意味ですか。 ファイルの最後にENDを付けた様式ということですか。 それでしたら無理です。 |
|
>>3508 ブラウン >> 普通にENDに記述じゃダメですか。 > とはどういう意味ですか。 { 行ごとの処理 } END { 終了時の処理 } という書き方ではどうか、ということでしょう。これは awk の設計思想に沿った最も自然な書き方だと思います。 それがダメなのなら、わたしも getline の戻り値を 取るのがよいと思います。 |
|
>>3509 68user フォローありがとうございます。 >>3508 ブラウン >ファイルの総行数を取得して、読み込んだ行数と比較するかと思う >のですが。 それは以前提示したスクリプトの方法ですが、 それだと最終行かどうかの判断であり、EOFかどうかの判断ではありません。 >>或いは行数+フィールド番号でファイルの最後をチェックするとか >ちなみにどうするのですか。 あまり意味のない方法ですので、気にしない方が良いと思います。 |
|
シェルについて2点教えて下さい。 1.フィールドの区切がカンマ「,」となっている行から 例えば、 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 から、 先頭のフィールドかあとか、 フィールドの3,4,5を取り出したいのです が、awkを使う以外にないのでしょうか。 2.シェルで、今日から10日前の日付を取得することはできるのでしょうか 環境は、HP-UX11.00、Bシェルです。 |
|
>>3511 ブラウン シェルについて2点教えて下さい。 1.フィールドの区切がカンマ「,」となっている行から 例えば、 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 から、 先頭のフィールドから順にとか、フィールドの3,4,5を取り出したい のですが、awkを使う以外にないのでしょうか。 awkを使わないで出来る方法と、awkを使ってできる方法を教えて 下さい。 2.シェルで、今日から10日前の日付や、指定した日付の10日前を 取得することはできるのでしょうか 環境は、HP-UX11.00、Bシェルです。 |
|
>>3511 ブラウン 質問したら必ず結果を書いてください。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse |
|
賢いやり方か、上手いやり方か分からないが こうすればできる。 -------------------------------------------- #!/bin/sh back_to_day() { case $MM in 0) MM=12 MAX=31 ;; 1|3|5|7|8|10) MAX=31 ;; 4|6|9|11) MAX=30 ;; 2) if [ `expr $YYYY % 4` -eq 0 ]; then MAX=29 else MAX=28 fi ;; esac } YYYY=`echo $1 | cut -c1-4` MM=`echo $1 | cut -c5-6` DD=`echo $1 | cut -c7-` DD=$((DD-7)) if [ ${DD} -le 0 ] ; then MM=$((MM-1)) if [ ${MM} -eq 0 ] ; then YYYY=$((YYYY-1)) back_to_day DD=$((DD*-1)) DD=$((MAX-DD)) fi fi printf "%d%02d%02d\n" $YYYY $MM $DD exit 0 |
|
>>3512 ブラウン 区切り文字がカンマで、awkを使用しない場合。 ------ $ cat data.txt 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 $ cat sam1.sh #!/bin/sh OIFS="$IFS" i=0 while read line ; do IFS="," i=`expr $i + 1` set -- $line j=0 while [ $# -gt 0 ] ; do j=`expr $j + 1` echo "$i - $j : $1" shift done IFS="$OIFS" done < data.txt $ sh sam1.sh 1 - 1 : 山田 太郎 1 - 2 : ヤマタ゛ タロウ 1 - 3 : Yamda Taro 1 - 4 : 18 1 - 5 : 1760/12/24 2 - 1 : 山田 花子 2 - 2 : ヤマタ゛ ハナコ 2 - 3 : Yamda HANAKO 2 - 4 : 18 2 - 5 : 1760/12/24 ------ 指定された日付の10日前の日付を取得するのは面倒そうなのでパス。 単純に今日から10日前を取得する方法については、 下(↓)を良く読みましょう。 http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date |
|
>>3515 zsh ありがとうございます。 行の編集についてはできました。 しかし、日付の操作については、 http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date を参考にしてやって見ました。 タイムゾーンを設定して、URLの例にあるのでは、上手くいったのですが % env TZ=JST+15 date (1日前の時刻を表示) % env TZ=JST-33 date (1日後の時刻を表示) 2日前では、 -9+48=39 % env TZ=JST+39 date は上手く行きませんでした。 環境は、HP-UX11.00、Bシェルです。 |
|
初めて投稿いたします。 UNIXのコマンドで、split というファイル分割コマンドがありますが、分割後のファイルをWindowsで結合させるための、MS-DOS コマンド、あるいは、フリーのソフトを知らないでしょうか。 |
|
>>3517 せんべい > 分割後のファイルをWindowsで結合させるための、MS-DOS コマンド copy a.txt+b.txt+c.txt out.txt でできたような気がします。 > あるいは、フリーのソフトを知らないでしょうか。 http://www.so-net.ne.jp/download/win/util/file/spl_mrg/ など。 |
|
はじめまして,unix初心者です,教えて下さい。 異常終了させてしまい,1つのハードがmountされません。fsckを使って修復しようとしたのですが,エラーメッセージによると部分的なセクターが破損しているため修復できないとの内容でした。破損している箇所だけのフォーマットは可能なのでしょうか?もしあれば方法を教えて下さい。お願い致します。 |
|
>>3519 初心者 詳しくないのでなんともいえませんが (これまで fsck でこけた 経験がないので)、少なくとも以下の情報は必要でしょう。 - OS 名とバージョン - ファイルシステム名 (ufs, ext2 など) - 正確なエラーメッセージ (エラーメッセージで検索できるよう原文を提示する) 検索のキーワードとしては「スーパーブロック」ですかねぇ。 |
|
unixのfindコマンドについて教えて下さい。 findを使用するとファイルの検索ができますが、 自分がいるカレントのみを検索し、その配下にあるディレクトリ を検索したくないのですが、どうすれば可能でしょうか。 例えば、 現在位置 cd /tmp/tool/bin /tmp/tool/bin 入るとします。 find .. -name ".log" -type f -print と行うと、tool及び、bin配下やよのたのディレクトリを検索 find .. ! -depth -name "*.log" -print と行うと検索しない。 1つもだった、ところのファイルのみを検索したい |
|
>>3521 yabu -maxdepth 1 でいけるでしょうが、-maxdepth に対応 していない find もあります。 単にファイル名でマッチさせたいだけあれば、 % echo *.log でもいいでしょう。 |
|
Sunでaliasの設定でつまづいてます。。(alias rm="rm -i") シェルはshなので.profileに記述しましたが効きません。 ネット検索しましたがshでのalias設定なしとありました。 shでのalias設定はどう行えばいいでしょうか? ご教授お願いします |
|
>>3522 68user >-maxdepth 1 でいけるでしょうが、-maxdepth に対応 >していない find もあります。 HP-UX、SunOSともに対応していませんでした。 >単にファイル名でマッチさせたいだけあれば、 > % echo *.log >でもいいでしょう。 でやらせていただきました。 |
|
IE などブラウザ上のボタンなどの操作を外部からしたいのですがしたいのですが、可能でしょうか? 例、VC++ のソフトで、Yahoo の検索を検索キーワードを入力や検索ボタンを押したい。 例、証券会社のHPで定期的に株価更新のため株価ボタンを押す。 などです。 ここの主旨から外れるかも知れませんが、宜しくお願いします。 |
|
>>3523 moko まずは $ . $HOME/.profile としましょう。それで alias が効かないなら .profile の書き方が悪い。alias が効くなら .profile が読み込まれ ていないか、.profile 読み込み後に unalias されている んでしょう。 >>3525 external 詳しいところは知らないので、キーワードだけ並べておきます。 COM (Component Object Model) OLE (Object Linking and Embedding) ActiveX |
|
初歩的な質問ですが、Solarisのhostsについて教えて下さい。 他の端末と通信する為には/etc/inet/hostsにIPを書くと思っています。 でも、/etc/hostsにも同じhostsがあり、両方直しています。 /etc/hostsには/etc/inet/hostsと違った意味があるのでしょうか。 宜しくお願いします。 |
|
>>3527 yuki http://www.freebsd.org/cgi/man.cgi?query=hosts&manpath=SunOS+5.9 NOTES /etc/inet/hosts is the official SVR4 name of the hosts file. The symbolic link /etc/hosts exists for BSD compatibility. というわけで、同じでしょう。 |
|
Volumeの初期化に関して,どうのような操作をすれば良いか教えてください。digital unix 4.0 |
|
crontabを実行した時間がわかるようにするためにはどのような書き方をしたらよいかわかりません。教えていただけないでしょうか。 よろしくお願いいたします。 |
|
こんばんは。 Perlのほうが文字列処理などが書きやすい、でもCのほうが速度が速かったりするなどの理由から、XSを使用して二つの言語を合わせてみようと思いました。 そこで、CのヘッダをXSにかけてからPerlを実行したのですが、 "Your vendor has not defined Prime macro Prime" というエラーが出てしまいます。 XSによって生成されたのはPrimeというディレクトリで、その中にあるPrime.pmに、Perlから第一引数として数字を渡すものでした。 Perlのほうからは、 Prime::Prime($ARGV[0]) として呼び出しましたが、何がいけなかったのか、教えていただきたく思います。 よろしくお願いします。 |
|
AIXに付いて教えて! AIXマシンでは、gettimeofday()関数が使えない! よくよく調べると、コンパイル時、XOPEN_SOURCEを指定している為 である事が判ったが、XOPEN_SOURCEを外す訳にもいかず困ってます。 gettimeofday()関数と同じ機能で、置き換えられる関数ってないでしょうか? |
|
>>3529 kai Volume ってなんですか? 音量のことですか? であれば わかりません (ioctl とか使うんですかね)。 >>3530 momo 1. cron から実行するスクリプト内でファイルに時刻を記録する 2. * * * * * date>>/foo/bar/log; command とする。 3. /var/cron/logs などにあるログを見る。 >>3531 ken XS はよく知りませんが、perl のバージョンも、何をどうやったの かも書かれていないので何ともいえません。 下記は perl 5.005_03 の例ですが、まずはここからでしょう。 % h2xs -A -n Prime % cd Prime int Prime(num) int num; CODE: RETVAL = 2*num; OUTPUT: RETVAL % perl Makefile.pl % make hoge.pl を作成 % cat hoge.pl use ExtUtils::testlib; use Prime; print Prime::Prime(123),"\n"; % perl hoge.pl 246 >>3532 Hiro なぜ XOPEN_SOURCE が指定されていると gettimeofday が使えない のかよくわかりませんが、古い形のプロトタイプ宣言が〜とかいう 話ではないかと思うので、mygettimeofday.c を作って、 #include <sys/time.h> int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE int mygettimeofday (struct timeval *Tp, void *Tzp){ return gettimeofday(Tp, Tzp); } とするとか。 |
|
>>3533 68user > int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE int gettimeofday (struct timeval *, void *); #undef XOPEN_SOURCE のタイプミスです。 |
|
さきほどXSのことを質問させていただいたのですが、なんとか解決しました(汗 どうやら、根本的に思い違いをしていたのが原因のようで...。 わざわざのご回答、ありがとうございます。 もう少しぼくが早く解決して書き込んでいれば良かったのですけどね。 |
|
>>3528 68user The symbolic linkでしたか。 ぜんぜん気がつきませんでした。有難うございました。 |
|
はじめまして。タカと申します。 Perl関連について御教授ください。 Windows端末にてActivePerl-5.8.2.808-MSWin32-x86をインストールし Perlを作成しております。 そこで、PerlでExcelファイルに出力するプログラムを 作ろうと思っております。 その為、Spreadsheet-WriteExcel-0.42モジュールを、 ダウンロードしました。 本モジュールはWindowsでも機能すると表示されているのですが、 どうやって使用すればいいのか分かりません。 Spreadsheet::WriteExcel version 0.33(日本語訳)の HPを見ているのですが、私の知識不足で不明です。 もしご存知であれば御教授いただきたいのですが、 よろしくお願いいたします。 |
|
>>3537 タカ http://member.nifty.ne.jp/hippo2000/perltips/module_install.htm によると、ActivePerl の場合は PPM なるものを使うそうです。 # わたしは使ったことはありません。 |
|
ありがとうございました。 ちょっと試してみます。 |
|
クッキーに関する↓の冒頭でRFCに盛り込まれていないとありますが、 どうも2109で触れているそうですよ。 http://x68000.startshop.co.jp/~68user/webcgi/cookie.html 参考にさせていただいたサイト: http://www.nonki.net/technical/report/http-cookie/ http://www.ietf.org/rfc/rfc2109.txt |
|
>>3540 has ありがとうございます。とりあえずそこだけ直しておきます。 > どうも2109で触れているそうですよ。 RFC 2109 は obsolete で、今は RFC 2965 です。 http://www.studyinghttp.net/rfc_ja/rfc2965_ja.html でもまぁ、Set-Cookie2 は全然流行っていませんけどね。 |
|
はじめまして 右院堂 と申します。 いきなり質問で エゴ丸出しで申し訳ないですが ASP には Response.Buffer = True というのがあって、 ある html の form から 呼ばれた asp が 呼び元へ 自分の form を Response.Redirect で 返す時、Response.Redirect が実行されるまで HTMLヘッダーの出力を引き伸ばすことが出来ます。 これをやらないと HTMLヘッダーが 自分自身として Redirectされる前に出力されてしまうからです。 Perl では これに相当する記述はあるんでしょうか。 |
|
>>3542 右院堂 ASP はよく知りませんが、素の perl を使う場合は (そういう機能を 持つモジュールを使わない限りは) 相当する機能はないです (そういう 機能を持つモジュールの存在は知りません)。 $buf .= "出力文字列1"; $buf .= "出力文字列2"; ... print $buf; や、 open(STDOUT, "> /foo/bar/tmp.$$"); print "出力文字列1"; print "出力文字列2"; ... close(STDOUT); open(IN, "/foo/bar/tmp.$$"); print <IN>; close(IN); などと自分でバッファに保存し、最終的に出力するのが よいと思われます。 |
|
ポートに関しては初心者です。 すいませんが、ポート番号について教えて下さい。 Solarisを使用していますが、ポート番号は任意の決め事ですか? 現在使用しているSolarisは下記設定になっているようです。 WEBサーバはポート=80、FTP=20、プリントサーバ=9100 これらは、標準で決まっているのでしょうか? また、相手側を意識せず勝手にきめてもよいのでしょうか? 他に、ポートの設定をみる方法とかありましたらご教授下さい。 宜しくお願いします。 |
|
>>3544 yuki > Solarisを使用していますが、ポート番号は任意の決め事ですか? おおまかな指針はありますが、任意です。 > WEBサーバはポート=80、FTP=20、プリントサーバ=9100 デフォルトではそのような設定になっていますが、ほとんどの 場合は (サーバソフトウェアが対応していれば) ポートは変更 できるでしょう。ポート変更方法は各サーバソフトウェアの マニュアルに書いてあるはずです。 > また、相手側を意識せず勝手にきめてもよいのでしょうか? 標準的でないポートを使用するよう設定変更してもいいですが、 利用者に通知しないと使うことができません。 例えば web サーバであれば http://www.example.co.jp/ ではなく http://www.example.co.jp:8080/ にアクセスするようアナウンスしないといけませんし、プリンタで あれば自組織の環境設定手順書に 「プリンタの設定時に、ポート xxxx を使用するように設定してください」 と書いておく必要がある、といった感じです。 というわけで、標準的でないポートを使うことはできますが、 なにかとめんどくさい、という感じです。また、外部向けの サービスであれば、ファイアウォールで弾かれたりする危険性は 高まりますね。 |
|
irix使ってますが、ls -lでfileの詳細を見ると、拡張子の後に*が表示されてます。これはなにを意味するのでしょうか? |
|
>>3546 yosi 実行ファイルと思われます。ls の -F オプションの説明を読んでください。 |
|
UNIXのCシェル2点につてい教えて下さい。 1点目 以下の、a.txtファイルから第1フィールドの値を 先頭の'0' or "> 0 "のゴミを取って、10桁(先頭0なし)だけを また、第1フィールドの文末の半角スペースや’|’を取ってとり だしたいのですが、第1フィールはawkを使って取得できますが、 その後に編集ができません。たしか、sedの何かを使えば数字のみ だけを取り出せたと思うのですが、浮かんできません。 教えていただけないでしょうか。 cat a.txt | awk -F"," '{ print $1 }' | sed a.txt 09012345678,aaaa 07055593850,bbbb 9098765432,cccc 7012345678,ddddd > 07012345679 | ,eeeee 07012345670 ,ffff 出力結果 9012345678 7055593850 9098765432 7012345678 7012345679 7012345670 2点目 Cシェルで定義ファイルに設定してある項目を読み込むには どうしたらよいのですか。 定義ファイル MN=ABCDEFG FILE=/work/temp.txt set PARM1 = `grep ^MN 定義ファイル| awk -F"=" '{ print $1 }'` set PARM2 = `grep ^FILE 定義ファイル| awk -F"=" '{ print $1 }'` と繰り返すかないのでしょうか。 また、何も、タブとか半角スペースから始まっている場合もあると思うの ですが、どうすればよいのですか。 |
|
>>3548 つくも 1点目はawkのみで可能。 (古いawkではダメとかあるかも知れないけど。) ------ awk 'BEGIN { FS = "," ; } { i = match($1,"[1-9]"); print substr($1,i,10); }' a.txt ------ 2点目は、こんな事が許されるのか判りませんが ------ eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 " " $2}' param.txt` ------ 大人しく定義ファイルで「set A=val」と書いて sourceすべきだと思いますが・・・ |
|
>>3549 zsh 2点目は以下の間違い。 ------ eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 "=" $2 }' param.txt` ------ >68user様 半角カナ失礼しました。 |
|
>>3549 zsh >>3550 zsh ありがとうございました。 両方ともできました。 ただ、2点目については、定義ファイルでの変数名とシェル内での設定 する変数名がことなっていたので最初は誤ってしまいました。 |
|
はじめまして、恵美といいます。 いろいろ検索していましたら、このページにたどり着きました。 私は某会社のSE見習いなのですけれど、perlのリファレンスでつまづき悩んでいます。 ハッシュのリファレンスを上手にコピーする方法がよく、...いえ...さっぱりわからないです。 会社の人にきいたら、リファレンスは知らないと言われ、ダブルショックでした。 リファレンスを、1つ1つコピーすると $hash->{'str'} = $hash2->{'str'}; これだけなのですが、複数の値を同時にコピーするといつも失敗してます。 普通のハッシュでスライスを使うと、 my %hash = (a=>1,b=>2,c=>3); my %hash2 = (x=>11,y=>12,z=>13); @hash{'a','c'} = @hash2{'x','z'}; print $hash{'a'},$hash{'c'},"\n"; 11 13 となるのですけれど、同じことをリファレンスでやると失敗するんですよ。 $hash = {a=>1,b=>2,c=>3}; $hash2 = {x=>11,y=>12,z=>13} このとき、 print $hash->{'a'},$hash->{'c'},"\n"; の答えはどうしたら、 11 13 になるのでしょうか。 よろしくお願いします。 |
|
>>3552 恵美 - ($x{'k1'}, $x{'k2'}) は @x{'k1','k2'} と等価 (*1)。 - ハッシュのリファレンス $y のデリファレンスは $$y{'k1'} ($y->{'k1'} と同じ)。 をふまえた上で、今回は ($$y{'k1'}, $$y{'k2'}) を代入したい ので、*1 を素直に置き換えると @$hash{'a','c'} = @$hash2{'x','z'}; となります。 てゆーか、ハッシュスライスは使わない方がいいですよ。配列と 間違えやすいので、可読性低すぎです。わたしなら 2 項目であれば $hash->{'a'} = $hash2->{'x'}; $hash->{'c'} = $hash2->{'z'}; と 2行で書きます。 どうしても短く書きたい場合でも ($hash->{'a'}, $hash->{'c'}) = ($hash2->{'x'}, $hash2->{'z'}); とします。 項目数が多いなら my %map_table = ('x'=>'a', 'z'=>'c'); while (my ($fromkey, $tokey) = each %map_table){ $hash->{$tokey} = $hash2{$fromkey}; } とか。長くはなりますが、項目の対応がもっともわかりやすく、タイプ ミス ($hash と $hash2 を書き間違えるとか) の可能性も減ります。 |
|
こんにちは恵美です。 どうもありがとうです(^^)v すっかり解決して嬉しいです。 リファレンスはいまいちよくわかってないけど... 複数行で記述するのを1行でって思ってずっと悩んでいたんだけど、心の中を読まれちゃったかな... なんか、すごすぎるページなのでちょくちょく見に来ます。 おやすみなさい。 今日はありがとう(^^) |
|
はじめまして、瀧上と申します。 現在UNIX環境でのバッチ処理方式・環境設計を行っています。 開発経験はあるのですが、環境構築からやるのは初めてで頭を悩ましています。宜しければ下記の点についてご教授下さい。 デバッグメッセージの出力有無の切替について教えて下さい。 開発言語はCシェル&Cです。 以前のプロジェクトではC言語におけるデバッグメッセージを出力するしないを、環境変数で設定してしました。おそらく、これを見る事によりデバッグメッセージ出力用の共通関数にデバッグのON/OFFを切り替えさせていたのだと思います。 もし、上記以外に一般的な(適切)な方法があるなら教えて下さい。 レベルの低い質問で申し訳ないのですが、よろしくお願い致します。 ※UNIXの環境構築や、ジョブスケジューラにおけるNET設計の参考となる URLをご存知であれば教えていただきたいです。 |
|
>>3555 瀧上 > 上記以外に一般的な(適切)な方法があるなら教えて下さい。 しょせん決め事なので、一般解はありませんが、 - コマンドオプション (--debug や -d など) を指定する - make debug で、デバッグ用バイナリを生成する - make install すると ~/bin/ に通常バイナリを、~/bin/debug/ にデバッグ用バイナリを格納する などの方法があります。 どれでもいいので、いずれかをプロジェクトのルールとして決定して おくのがよいでしょう。 わたしの場合、 「デバッグモードは開発時のためのモードではなく、通常運用時や 後々のバグ追及時にこそ有用なもの」 という考え方なので、わたしが好む方法は以下の通りです。 - デバッグモードを実装する。デバッグモードの場合、rollback するなどして、データを一切更新しないようにする (まわりの環境に 一切影響を与えない) - デバッグモードとは別に、冗長なメッセージを出すだけの冗長 モード (verbose モード) を実装する。冗長モードの場合は、 通常どおりデータを更新する。 - エラー発生に気づきやすいよう、ログに吐いたメッセージは 標準出力・標準エラー出力にも吐くようにする。 - オプションでデバッグモード・冗長モードを切り替えられること。 例えば --debug でデバッグモード、--verbose で冗長モード、など。 デバッグモードの場合、自動的に冗長モードも有効にするようにする。 コード例は以下の通り。 int debug_flg = 0; int verbose_flg = 0; for ( i=1 ; i<argc ; i++ ){ if ( strcmp(argv[i], "--debug") == 0 ){ debug_flg = 1; verbose_flg = 1; } if ( strcmp(argv[i], "--verbose") == 0 ){ verbose_flg = 1; } } /* こんな感じで各種情報を出力 */ verbose("ほげほげ foo=[%d]", foo); .... if ( debug_flg ){ EXEC SQL ROLLBACK RELEASE WORK; } else { EXEC SQL COMMIT RELEASE WORK; } void verbose(char *fmt, ... ){ va_list ap; char buf[8192]; /* verbose モードでなければ、何もしない */ if ( ! verbose_flg ){ return; } va_start(ap, fmt); vsnprintf(buf, sizeof(buf-1), fmt, ap); va_end(ap); fprintf(stderr, "debug: %s", buf); } 使い方としては、 - 単に詳細なメッセージを表示したい場合は冗長モードを使う。 - まわりの環境に影響を与えず、とりあえずうまく動くか確かめたい 場合はデバッグモードを使う。 となります。 > UNIXの環境構築 UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。 > ジョブスケジューラにおけるNET設計 これは何でしょうか? JP1 とかの話? |
|
大変参考になります。 方式だけでなく、考え方とコードまで載せていただいたのは恐縮です。 参考例を深慮して方式を定めます。 ありがとうございました。 > UNIXの環境構築 UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。 →そうですね、すみません、主にUNIX環境でのバッチ処理におけるShellの置き場所や構成の最適な方式を調査できるHPを探していました。「コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが好ましいのか」、、とか、「バッチ処理起動shellでsourceする環境設定ファイルにディレクトリとOracleSIDを考えているが、これが最適なのか?」等です。。。開発、本番時に必要な要件を洗い出していけばおのずと出てくると思うので、考えてみます。 開発とUNIXでの開発経験が乏しいので、自分の知っている方式を、プロジェクトの標準として使っていいのか不安なのです(^^;) > ジョブスケジューラにおけるNET設計 これは何でしょうか? JP1 とかの話? そうです。本日書籍購入しました。上記と同じで、もし有効なHP等ご存知であれば教えてもらいたいと思ったので。。。。 |
|
>>3557 瀧上 > 主にUNIX環境でのバッチ処理におけるShellの置き場所や > 構成の最適な方式を調査できるHPを探していました。 そういうことを書いている web は見たことないですね。基本的に趣味で やってる人には関係ないし、それを知ってる企業は「ノウハウ」として 隠してしまいますので。 # しょーもないやり方を「ノウハウ」などと称しているところも # 多いわけですが。 ちょっと長くなりますが、まぁひととおり書いてみます。 まず、ユーザを複数作ります。例えばユーザ名が hoge なら、 hogedevel (開発環境) hogesi (SI (結合テスト) 環境) hogert (RT (受入テスト) 環境) の 3つくらい。それぞれのホームディレクトリは /home/hogedevel, /home/hogesi, /home/hogert などとします。 さらに DB が必要であれば、これも 3つ (hogedevel, hogesi, hogert) 作ります。 通常の開発は hogedevel を使います。hogesi や hogert は テストの段階で初めて使います。 「開発者は基本的に hogedevel しか使ってはいけない」 というシバリを入れるのもよいでしょう。 各ホームディレクトリの下には src/ ソース置き場。CVS などでソース管理すること。 conf/ 手で管理する設定ファイルなどを置く場所。 bin/ バイナリ置き場。src で make install すると作成される。 lib/ バイナリ以外の設定ファイルやデータファイルなど。 src で make install すると作成されるものに限る。 log/ ログファイル置き場 dat/ 生成するデータファイル・他から送られてきたデータファイル とします。 つまり src/ で make install すると bin/, lib/ が作成される わけなので、bin/ や lib/ は消しても src/ を元に再作成する ことができます。 しかし conf/ は手動管理の設定ファイル群なので、こちらは 消してはいけません (conf/ も CVS などで管理するのがよい でしょう)。 lib/ には、プログラムで生成する雛型のファイルとか、SQL*Loader 用に喰わせるファイルなど、devel, si, rt で共用のファイルを置き ます (実行形式のバイナリではないけど、プログラムの一部と見なして よいものを置く)。 で、環境変数は /home/hogedevel/conf/env.sh /home/hogesi/conf/env.sh /home/hogert/conf/env.sh に ORACLE_SID=hogedevel HOME=/home/hogedevel PATH=/home/hogedevel/bin ORACLE_HOME=... 書きます。 これを source して各アプリが起動し、 - DB の接続先は $ORACLE_SID とする - $HOME/log/ にログを吐く - $HOME/data/ にデータファイルを作成する とします。 というわけで、基本的には > バッチ処理起動shellでsourceする環境設定ファイルにディレクトリと > OracleSIDを考えているが、これが最適なのか? それでよいと思います。 > コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが > 好ましいのか どういうファイルのことを指しているのかよくわかりませんが、 $ORACLE_HOME/precomp/lib/env_precomp.mk とかですか? 基本的に、この辺は共通でよいのではないでしょうか。もし、一部の プログラムで特殊なことをしたければ Makefile 内で上書きすればよい わけで。 あと、いくつか気をつけるポイントをあげておきます。 - ディレクトリやファイルは絶対に手で作成しない。 手で作成するとかならずミスするので、全て Makefile に 記述する。 - CVS などのソース管理ツールを活用する。 /home/hoge{si,rt}/src/ に手でソースを配置し、手で make install する、というやり方は極力避ける。CVS などでマスタ管理し、 毎日朝 AM6:00 に、自動的に ~hoge{si,rt}/src にソースを checkout し、make install などと、全てを自動化するのがベスト。 この他に何か質問があれば、もう少しポイントを絞って、具体例を あげてください。 >> これは何でしょうか? JP1 とかの話? > そうです。本日書籍購入しました。 非オープン系なアプリの場合、web 上からの情報収集は厳しいかと 思います。 JP1 は使ったことがないのでわかりません (わたしは cron の代替品、程度の 認識しかありませんが)。やっぱり便利なんですかねぇ。 |
|
>>3558 68user > しかし conf/ は手動管理の設定ファイル群なので、こちらは > 消してはいけません (conf/ も CVS などで管理するのがよい > でしょう)。 lib/ との違いがわかりづらい気がするので補足。 hoge{devel,si,rt} で異なる設定ファイルは conf/ に、そうでない ものは lib/ に置く、という意味です。 もちろん make 時に環境によって異なるファイルを lib/ にインス トールできれば conf/ などいらないのですが、それを実現するためにMakefile に複雑な細工をしなければいけないケースがあったりするので。 |
|
おひさしぶりです。困ったときばっかり登場してすみません。 たぶんあけましておめでとうございます。 ここ5年ぐらいメンテしてる CGI なんですが、 根本的な改革を迫られました。 A.cgi が生成するページにおいて、 ボタンを押したら(可変パラメータ付きで) B.cgi が生成するページに進み、 リンクを押したら(可変パラメータなしで) C.cgi が生成するページに進むという実装になっています。 ところが、ここで C.cgi にも A.cgi で選択入力する可変パラメータを渡さなければ ならなくなったのです。 A、B、C 非常に肥大化していて、安易な解決法が欲しい状況です。 CGI のみで解決できればうれしいですが、 場合によっては JavaScript でもかまいません。 なにかあればご教示願えれば幸甚です。よろしくお願いします。 |
|
>>3560 ふくし これを機にリファクタリングした方が、のちのち幸せになれると 思いますよ。 …というのは十分承知しておられると思うので、その場 しのぎな案を 2つばかり。 1. B.cgi で受けたパラメータを print qq(<input type=hidden name="param_from_a" value="$ENV{QUERY_STRING}">\n); などとまるごと C.cgi に渡す。 2. 隠しフレームを作っておいて、A.cgi で選択されたら onClick などでフォーム内容を隠しフレームに転記して おき、(B.cgi は無修正で) C.cgi がその隠しフレームを読む。 |
|
アクセスが遅くなり申し訳ありません。瀧上です。 丁寧なご回答ありがとうございます。 工程別のユーザの切り分けは私の方でも近い形で考えており、ご回答に近い形で定めようと思っています。→開発環境ではユーザを分けますが。 とりあえず考え方に大きなずれが無い事が判明してほっとしています。 ディレクトリですがConfの概念は無くこれはこちらを参考に構成を考えようと思います。CVSはシステム標準で構成管理ツールとして使用することが決定しています。デバッグモードの考え方は、色濃く方式に出そうです(^^;) ところで申し訳ないのですがもう少し勉強させてもらいたい事がありまして、お言葉に甘えていくつか質問させてください。 →たとえばログイン時に「.cshrc」から「環境変数設定ファイル」をSourceしたとして、この時「環境変数設定ファイル」から設定した環境変数は、サーバDOWNかそれを書き換えるまで確実に保証されるのでしょうか? →LIBがmakeInstall時に取り込まれるものだとしたら、 動的なライブラリはUNIXにおける開発ではあまり使用しないものなのですしょうか?システム共通部品等は動的ライブラリから呼び出すのが一般的かなと思っているのですが。 /COMMON/bin/xxxxx.so←拡張子も「.so」一般的なのか疑問ですが、 dllでは無いと思うので。。。 もしくは実行ファイルとしてbinに持つ? |
|
>>3651 68user すいません、題意を間違えて伝えたかもしれません。 これでよかったです。 A.CGI start_form(action="B.CGI"); フォーム要素1; end_form; start_form(action="C.CGI"); フォーム要素2; end_form; 要は B と C に別の可変要素を渡すのなら、これでできたんですね。 昨日それでできるんじゃないカナと思ってたんですが、 コードにバグをつくっていました。 なお、ボタンを submit にしないで、name をつけ、 name を JavaScript で読み取って切り分ける、という方法も あるようです。これならフォーム要素を共有できるな。 http://webmaster.hatena.ne.jp/1069376628 ★ 事情を説明すると、5年越しということでおわかりいただけると 思いますが、FileMaker で作っていた経理システムが 2000 年問題で 止まる(私製のテンプレートがダサくて)という話があり、 その時個人的に見積書を CGI で出していたことがバレ、 2000 年の 3 月にはちゃんとした業者ウェアを入れるから それまでそれっぽいものを動かしてよ、と言われました。 で、2000 年の 3 月に、業者ウェアの日本語対応ができないと分かり (ガイシ系なんで・・・) その年いっぱい動かすことになりました。 以下、同じことが 200年、2001年、2002年、2003年に起こりました。 いよいよ今年の5月にこのシステムが正式に引退させることが 決定した(・・・)のですが、その前にどうしても大きな山を 乗り越えるためにプログラムを改造することになったのです。 でも「どうせ5月に引退すると決まっているシステムに大金を 投じるわけにはいかない」ので、それだけに長い時間を避けないんです。 人生いろいろですね:) |
|
教えてください。 指定したポートを開放するために必要なinetd.confの設定方法を教えてください。また、他に必要な設定が必要でしょうか。 ご教授お願い致します。 |
|
>>3562 瀧上 > たとえばログイン時に「.cshrc」から「環境変数設定ファイル」を > Sourceしたとして、この時「環境変数設定ファイル」から設定した > 環境変数は、サーバDOWNかそれを書き換えるまで確実に保証される > のでしょうか? setenv で更新したら変更されます。.cshrc を更新しても、 明示的に source したり、ログインしなおさないと反映 されません。 よって、プログラムの先頭で source するか、cron であれば * * * * * . /home/hoge/env.sh && /home/hoge/bin/foo としておくのがよいでしょう (JP1 でも何かしら環境変数を 指定するような設定があるのではないかと想像します)。 > LIBがmakeInstall時に取り込まれるものだとしたら、 そういう意図ではなく、実行時に必要ないろいろなファイルの 置き場所、として書きました。 もし動的ライブラリを使うなら lib/ に置くことになる でしょうね。 でなくて、静的にリンクするなら、ライブラリは src/ の 下だけ置いて、アプリのmake install 時にリンクしmasu. ライブラリ自体は lib/ に make install しません (実行時 には必要ないので)。 で、それはそれとして > 動的なライブラリはUNIXにおける開発ではあまり使用しない > ものなのですしょうか? についてですが、わたしの場合は静的にリンクする方法を 好みますが、別に動的リンクがダメと言うほどではないです。 業務系では多少のメモリ使用量の多寡ははどうでもよいので、 構成管理のやりやすさだけを考慮すれば構わないと考えます。 で、例えば、 1. ライブラリ関数 func をプログラム A・B・C が使用している。 2. プログラム A に不具合が発生。すぐに修正版をリリース しなければならない。 3. 原因は func であることが判明。しかし func の呼び出し方の 違いから、プログラム B・C ではこの現象は発生しない。 という状況を考えます。 静的にリンクしている場合、もし人的リソースに余裕があり、 func 修正時にプログラム A・B・C のテストをすることができる なら、修正版 func のリリース時にプログラム A・B・C を再 コンパイルすることができます (これが最も望ましい)。 しかし、プログラム B・C をテストする余裕がない場合、 func を修正して再コンパイルし、プログラム A を再コンパイル とすることで、プログラム B・C に影響を与えず func を修正 するという選択肢をとることができます。 ただしこれは プログラム A が使用している func と、プログラム B・C が使用している func が異なる という管理しづらい状況になるため、次期リリース時に全てを 再コンパイルするまでの時間かせぎです。 つまり、静的リンクの場合、 目の前のリスクを少なくしたいなら → プログラム A のみを再コンパイル 構成を単純にしたいなら → プログラム A・B・C を再コンパイル と、状況に応じた選択が可能です。 しかし動的ライブラリだと、動的ライブラリを入れ替えて、 プログラム B・C に不具合が出るかもしれないリスクを負う という選択肢しかありません。 よって、わたしは静的にリンクする方を選びます。 ただし静的リンクの場合、再コンパイル忘れなどで各プログラムが 使用しているライブラリのバージョンが異なる、という状況が発生 する可能性がありますが、この対策として、定期リリース時に商用 環境の - 全ソース・全プログラムを削除 - 最新版のソースを全て再コンパイル - 全プログラムを make install とすれば OK でしょう (最上位ディレクトリで make && make install すれば全アプリ入れ替え完了)。 # 仮に動的リンクを選択したとしても、上記の「定期リリース # ごとに全部インストールしなおす」というやり方は強く # おすすめしておきます。 |
|
>>3564 たけ > 指定したポートを開放するために必要なinetd.confの > 設定方法を教えてください。 質問が曖昧すぎて答えられません。inetd のマニュアルと /etc/inetd.conf にある他の設定例を見てください。 それでもわからなければ、何がしたいのかを明記した上で 再度質問してください。 |
|
はじめまして。初心者ですが、コマンドはどこに打てばいいんですか? |
|
以下のようなファイルからaddとmodとdelのerrrorがある行を 取り出したいのですが、 ------ ここから ----------- ---- server1 ---- add:yamada:success add:saito:error mod:yamamoto:success mod:ikeda:error del:yamaguchi:success del:butou:error ---- server2 ----- add:yamada:success add:saito:error mod:yamamoto:success mod:ikeda:error del:yamaguchi:success del:butou:error ------ ここまで ---------- grep -v "\-\-\-" ファイル名 | grep -v success で一応とりだせるのですが、改行の2行が含まれて しまいます。空改行を含まず1回の処理でやりたいのですが どうすればよいのですか。 |
|
>>3568 すすむ 環境を書き忘れました。 SunOSで、Bシェルです。 |
|
>>3568 すすむ errorを取り出したいなら素直に grep ":error" filename とすれば良いのでは? まぁ名前にerrorが含まれる人がいると引っかかってしまうので 正規表現使うべきなんだろうけど。 |
|
>>3568 すすむ 賢いかはわかりませんが、 grep -v "\-----" ファイル名 | grep -v success | awk '{ if(NF != 0) print $0 }' でできませんか。 |
|
>>3568 すすむ 「success」と「error」と簡単に書きましたが、 成功の場合は、「success」で、失敗の場合は、エラーメッセージが でます。 「error」だけでは、引っ掛けられません。 |
|
>>3567 うこん あなたが置かれている状況がわからないので、回答できません。 >>3568 すすむ わたしなら egrep '^(add|mod|del):' | grep -v ':success$' とします。 |
|
>>3572 すすむ であれば、 egrep -v '^(-|$|.*:success$)' filename とか? |
|
>>3573 68user >>3574 zsh zshさん、68userさん ありがとうございます。 egrepですか。 使用したことがないのですが、 「'^(-|$|.*:success$)' 」 の使い方につてい教えてください。 |
|
>>3561 68user > 1. B.cgi で受けたパラメータを > print qq(<input type=hidden name="param_from_a" > value="$ENV{QUERY_STRING}">\n); > などとまるごと C.cgi に渡す。 「などと」と書いてあるので, 細かいところは省略してあるのでしょうが このままの記述ですと, パラメータの区切りが「&」という前提にて パラメータの名前が「copy」や「reg」だった時に悲しい結果が待ってます。 理由はこのへん http://www.ne.jp/asahi/minazuki/bakera/html/opinion/ampersand |
|
>>3565 ご回答ありがとうございます。 ライブラリの考え方は参考になります。 要件が無ければ原則禁止にしてしまおうかななんて。。。検討中です。。 ところでshellでバッチを走らせる時はユーザ設定を行わないようにするのがいいのですね。UNIXの部屋にある↓を見て気づきました。 「#!/bin/csh -f というのをよく見かけるが、その場合ユーザ独自の ~/.cshrc は読まれないので、エイリアスやシェル変数は使用できなくなる。」 なので今回はshellの構成は下記の様にするつもりです。ご報告まで。。。 ---------------------------------- #!/bin/csh -f #------------------- #shell # #------------------- source COMMON.src #→システム共通のパス(oracle等)や文字指定(LANG等) source 環境.env #→システム共通環境変数設定等 処理・・・・ ----------------------- |
|
Makeの環境について教えて下さい。 現在下記のディレクトリを作成して開発環境としようと考えていました。 /src /* makefileとsrcを保管 */ /obj /* make時の中間ファイルを保管 */ /bin /* 実行ファイルを保管 */ するとあるガイドに「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの比較が困難になるのでやめるべきだ」、と書いてありました。 「個々の依存関係をいちいち指定しなければならない。」ともあり、「いちいち」等と書かれると非常に非効率な事の様に感じるのですが。。。 「.cと.oは同一ディレクトリに持つ」が一般開発業務で用いられる主要な方式なのでしょうか? 単体環境だと不特定多数の人間が多様なsrcファイルを作るのであまり余計なファイルを置いてごちゃごちゃさせたくないと言うのが理由で分けてるだけなので同一ディレクトリも特に問題は無いのですが。。。(消されても問題は無いファイルですし。。) 依存関係をmakefileに指定して別ディレクトリ管理と言うのはやらないのですかね? |
|
No.3568さんに似たような質問なんですが、 ファイルが以下のようにあったとします。 _________________________________________ aaa bb ccc 02/22 ddd e1.3 fff _________________________________________ その時に、実行するたびにe1.3の数字をe1.4、e1.5と実行 するたびに数字を0.1ずつ変更したいんですがCシェルで そのような事をしたいのですが、どうしたらいいのでしょうか。 ご教授お願いします。 |
|
>>3579 UNIX10ヶ月目 例えば、0.0から9.9まで表示するには以下のような方法があります。 ------ @ i = 0 while ( $i < 10 ) @ j = 0 @ n = $i * 10 while ( $j < 10 ) @ m = $n + $j set cnt = `echo "scale=1; $m/10" | bc` printf "0.1f\n" $cnt @ j++ end @ i++ end ------ ※:シェル変数cntに代入してprintfしているのは、0.0を出力するためです。 >>3575 すすむ 申し訳ありませんが、正規表現について解説された書籍を見るか Webサイト等を探してください。 自分で回答しておいてなんですが、68user様の方法が良いと思います。 自分のはコマンドを強引に1つにまとめただけですので。 |
|
Bシェルにつてい教えて下さい。 Bシェルで一次元配列を使用しているのですが、 HP-UX11.00で動いていたシェルスクリプトをSunOS5.8に移して 動かしたのですが上手くうごきません。 MONTHES[0]=Dec: 見つかりません。 MONTHES[1]=Jan: 見つかりません。 : 置換が正しくありません。 となります。 どうのように修正すれば、動きますか。 ------------------ #!/bin/sh # MONTHES[0]="Dec" MONTHES[1]="Jan" MONTHES[2]="Feb" MONTHES[3]="Mar" MONTHES[4]="Apr" MONTHES[5]="May" MONTHES[6]="Jun" MONTHES[7]="Jul" MONTHES[8]="Aug" MONTHES[9]="Sep" MONTHES[10]="Oct" MONTHES[11]="Nov" i=0 while [ $i -le 11 ] do echo ${MONTHES[$i]} i=`expr $i + 1` done |
|
これなら動く筈。(未確認) ------------------ #!/bin/sh # MONTHES0="Dec" MONTHES1="Jan" MONTHES2="Feb" MONTHES3="Mar" MONTHES4="Apr" MONTHES5="May" MONTHES6="Jun" MONTHES7="Jul" MONTHES8="Aug" MONTHES9="Sep" MONTHES10="Oct" MONTHES11="Nov" i=0 while [ $i -le 11 ] do eval echo $"MONTHES$i" i=`expr $i + 1` done |
|
>3582 zshさん ありがとうございます。 上手くいきました。 |
|
>3582 UNIXといってもHP-UXとSunOS(Solaris)で違うのだから Bシェルだからといって同じ機能jが使えるわけではない のですね。 |
|
>>3584 つとむ HP-UXは知らないのですが、配列使えるあたりがkshっぽいですね。 他の部分(スクリプト)がどうなっているかにもよりますが kshに変えたほうが修正が少なくて済むかも知れません。 下ののシェルだったら、 一行目を「#!/bin/ksh」に変えるだけで動きそうです。 |
|
はじめまして。本日暗号化について調べていたらこのホームページにたどり着きました。暗号化したいのは会社でPOPメールの受信ができないためメールを受信して暗号化し、Webメールなどに投げるようなプログラムでも作ろうかと思い立っていたため、こちらのホームページの内容は非常に役に立ちました。ありがとうございます。 |
|
>>3577 瀧上 > 「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの > 比較が困難になるのでやめるべきだ」 かどうかは知りませんが、とりあえずわたしは .o と .c を別にするやり方を知りません。 # *BSD などは .c と .o が別になっているので、やろうと # 思えばできるとは思いますが。 で、分ける必要があるかどうかですが、 > あまり余計なファイルを置いてごちゃごちゃさせたくない という理由であれば、cvs add しなければリポジトリに 登録されないので、「*.o は cvs add してはいけない」 という教育さえしておけば十分ではないでしょうか。 時間が経つにつれソース置き場にゴミがたまるのが嫌だ ということであれば、定期的にソース置き場を削除し、 checkout することをお勧めします。 わたしは開発環境であっても、毎日ソース置き場を削除、 checkout、make、make install して、まっさらにする 方法が好みです。 # メンバ全員のアカウントをあらかじめ作成しておき、 # 開発は、各メンバのホームディレクトリで行わせる。 >>3585 zsh > HP-UXは知らないのですが、配列使えるあたりがksh > っぽいですね。 /usr/xpg4/ に POSIX 系を集めている Solaris とは 違い、HP-UX は OS 全体として POSIX を重視している ような印象を受けます。sh と ksh は別コマンドに なってはいますが、sh はかなり POSIX 寄りです。 Bourne shell は /usr/old/bin/sh にあったりします。 >>3575 すすむ > 「'^(-|$|.*:success$)' 」 'a(x|y|z)' は ax か ay か az にマッチするので、 '^(-|$|.*:success$)' は ^- か ^$ か ^.*:success$ にマッチします。後は正規表現を勉強してください。 |
|
>>3586 まさどん ありがとうございます。 ついでと言ってはアレですが、掲示板の名称を 「UNIX、CGI、ネットワーク、Java Servlet についての掲示板」 改め 「UNIX、CGI、ネットワーク、暗号技術についての掲示板」 としました。 ついでに今日調べたことのメモ。OpenSSL を使って RSA で暗号化 & 復号化。 --------- ここから --------- #include <stdio.h> #include <openssl/rsa.h> #include <openssl/engine.h> int main(){ unsigned char plain_str[]="hogehoge"; unsigned char crypted_str[200]; unsigned char decrypted_str[200]; char errbuf[1024]; RSA *rsa; int n; ERR_load_crypto_strings(); rsa = RSA_generate_key(1024, 65537, NULL, NULL); printf("rsa->n = 0x"); BN_print_fp(stdout, rsa->n); putchar('\n'); printf("rsa->e = 0x"); BN_print_fp(stdout, rsa->e); putchar('\n'); printf("rsa->d = 0x"); BN_print_fp(stdout, rsa->d); putchar('\n'); printf("rsa->p = 0x"); BN_print_fp(stdout, rsa->p); putchar('\n'); printf("rsa->q = 0x"); BN_print_fp(stdout, rsa->q); putchar('\n'); /* printf("RSA_size(rsa)=%d\n", RSA_size(rsa)); */ /* 暗号化 */ n = RSA_private_encrypt(strlen(plain_str), plain_str, crypted_str, rsa, RSA_PKCS1_PADDING); if ( n == -1 ){ printf("in encrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf)); goto ERR; } /* printf("%s\n", crypted_str);*/ /* 復号化 */ n = RSA_public_decrypt(n, crypted_str, decrypted_str, rsa, RSA_PKCS1_PADDING); if ( n == -1 ){ printf("in decrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf)); goto ERR; } /* 検証 */ if ( strncmp(plain_str, decrypted_str, n) == 0 ){ printf("OK! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str); } else { printf("NG! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str); goto ERR; } return 1; ERR: RSA_free(rsa); return 0; } --------- ここまで --------- 実行例: rsa->n = 0xCA0CBEC6C0384F0387557A9E27A60A9039AB9FAC4D4AE1DA1E08F00093632FAA734AF75E86632E7AFC660A00BF1D703902B57B64CFACD0069314A105295F7624157D3A484C6E1FEBA5A46047E6AE91161DCD51BA7D75B83358F3506D069AEB987D183C0FC21C1BE1F2DF5A0BFF991DB13EFD1E9F079E92BE25CB2BB7D7AD703F rsa->e = 0x10001 rsa->d = 0x35DA87CEF9D5085A6C6C002EBF6AA64E22D0F7D23917C87316A653321416CFD1A2C14C85C9540E43819AC0F7C9F8D2BC9F5837F77AD318EF67AC8BEE90447D7C4F705C57130095BFB51697ECB64CF686414980E1BC814F6AD3EDB3BC2232F88D32892592093E6103AAF89C23B9544254386611B145B9327AA074398D15E60A41 rsa->p = 0xE4A4D51718E83BF3CF91E0C187EB910FFAED34C37858667A6C27F83020DCF7D2DABA5D0B2CD0FAD0A075E06938420F09111F0A5DEA9B443CAAF6674C343944E7 rsa->q = 0xE2395BC32DAA75945F637F88F9BB7C05157464C99168E229E5ED86A3A1EE19498BC357E849505F3C2CA7DC868068880E14FA7ADA01B7BD9897A18FB3573336E9 OK! plain_str=[hogehoge] decrypted_str=[hogehoge] RSA_generate_key() で RSA 鍵を生成できる。 引数: 鍵の bit 数 (この例では 1024 bit)、e (3,17,65537 など)、その他 鍵長についてはよくわからない。上記の例 (平文が hogehoge) では、bit 数を 145 以上にしないと encyrypt 時にエラーになる。なぜ 145? 平文を m として、 m<n ならよいのではないの? 戻り値は typedef struct { BIGNUM *n; BIGNUM *e; BIGNUM *d; BIGNUM *p; } RSA; 的な構造体のポインタ。これが RSA 鍵。詳細は rsa(3)。 それぞれ、以下のような感じ。 e: encryption exponent (OpenSSL 的には public exponent。暗号化指数) ここでは 65537 (=0x10001)。 n: RSA-modules (OpenSSL 的には public modulus と表記) d: decryption exponent (OpenSSL 的には private exponent。復号化指数) p,q: 素数のペア 公開鍵は e,n。秘密鍵は d,n。ただし、「秘密鍵は d」と定義している web・本も散見される。どちらが正しい? まぁ n は公開するわけなので、 どっちでもいいのか? BIGNUM は OpenSSL 付属の多倍長整数ライブラリ。上記の例のように BN_print_fp などを使うことで、内容を確認できる。詳細は bn(3)。 ちなみに BIO は OpenSSL 付属の I/O 抽象化レイヤ。詳細は bio(3)。 crypto 関係のエラーコードは unsigned long ERR_get_error(void) を 使うことで取得できる。そのコードを ERR_get_string() に喰わせると error:0407006A:lib(4):func(112):reason(106) という文字列が得られるが、これではわけがわからん。そこで、あらかじめ ERR_load_crypto_strings(); としておけば、ERR_get_string() の結果が error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01 という文字列になる。ちなみに % openssl errstr 0407006A error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01 とすればコマンドラインからでも取得可能。 RSA の秘密鍵による暗号化は RSA_private_encrypt() を使う。 第四引数はパディング方式。ここでは RSA_PKCS1_PADDING として いるので、PKCS#1 の方式で勝手にパディングしてくれる。 RSA_NO_PADDING を選ぶとパディングが行われないので、呼び出し側が 平文を適切な長さにパディングする必要がある。RSA_private_encrypt の 戻り値は暗号文の長さ。 復号化は RSA_public_decrypt() で。戻り値は復号化した結果の 長さ。復号化されたデータの文字終端などが自動でセットされる わけではないので、printf("%.*s") などと自分で長さを管理すること。 上記の例では、暗号化した文字列を unsigned char crypted_str[200] に入れているが、正しくは RSA_size() で得た長さ分の領域を確保して おくこと。 参考: http://www.cybersyndrome.net/rsa/ |
|
RSA で暗号化してみよう (1)・(2) を作成しました。間違いや わかりにくい部分の指摘は大歓迎です。 http://x68000.startshop.co.jp/~68user/net/rsa-1.html http://x68000.startshop.co.jp/~68user/net/rsa-2.html しかし暗号はおもしろい。何かリクエストがあれば (わたしの レベルを見極めた上で) 書いてください。 |
|
暗号技術大全を持ってらしているのですね。奇遇ですね、僕もこの間 購入してしまいました。僕はハードっぽい図と数学っぽいところに惹 かれて、立ち読みじゃ飽き足らず、買ってしまいました。 #眠いときは枕代わりになるし、持って動かせば筋トレにもなるし、 #一冊三鳥にもなる、良い本です。←冗談です・・・ 今のところリクエストはありませんが、確かに暗号技術は面白いの で、そのうちあるかもしれません。その節は宜しくお願いいたします。 それに、妖精現実フェアリアルも参考にされているのですね! 僕は 双方向処理で行き着いたところは異なりますが、これも奇遇ですね。 というか、そのサイトは凄すぎです。作者は何者なんだ?と思いつつ、 読んでいます。 #全く関係ないですが、Java Servletは興味から外れたのですか? ご存知だとは思いますが、妖精現実フェアリアルから引用しますので、 ご参考までに。 このウェブサイトは、まもなく終了します。 このページに書いてあった 情報は、特に断り書きがない限り、自由に使ってください(コピー、 改変を含む)。 転載先においても転載自由にしてかまいません。 |
|
>>3590 へにか > 暗号技術大全を持ってらしているのですね。 まぁ理解できていませんけどね。 理論を学びたいと思って、他にも以下の本を買ってみました。 理解できたかどうかは聞かないでください。 暗号理論入門 http://www.amazon.co.jp/exec/obidos/ASIN/4320120442/249-3448296-8649958 暗号の代数理論 http://www.amazon.co.jp/exec/obidos/ASIN/4431708472/249-3448296-8649958 代数と数論の基礎 http://www.kyoritsu-pub.co.jp/series/21seiki/01561-4.html 暗号は技術的にも非常に面白いですが、暗号として強いのか 弱いのかが第三者からはっきり評価される世界ですので、 やじうま的視点で見ても、とてもおもしろいです。 http://x68000.startshop.co.jp/~68user/net/crypt-1.html で紹介した すずきひろのぶ氏の AES 選定にまつわる話も そうですが、IPA の CRYPTREC http://www.ipa.go.jp/security/enc/CRYPTREC/ に応募したものの、門前払いをくらった暗号がどんなものなのか 調べると、非常に興味深いものがあります。 こんなおもしろい世界を学者のモノだけにしておくのは もったいない。ぜひ興味を持っていただけると幸いです>All > このウェブサイトは、まもなく終了します。 これは前々から気になっています。終了されると非常に困る んですが、webarchive.org (正式にはWayback machine って いうのかな?) があるから まぁ大丈夫かな、と思っています。 # http://web.archive.org/web/*/http://www.faireal.net/articles/7/01/ > Java Servletは興味から外れたのですか? 諸般の事情から、このサーバでは Java Servlet が動かないのです。 そして仕事でも Servlet はやっていないので、遊べる場所がないのです。 今のわたしの興味は 暗号 > 逆転裁判3 > 質の高い業務系システムを構築する方法 >>>> WEB > UNIX > Java です。 |
|
メモ。blowfish による暗号化 & 復号化。 #include <stdio.h> #include <openssl/blowfish.h> int main(int argc, char *argv[]){ BF_KEY key; unsigned char keybuf[]="SECRETKEY!"; unsigned char plain[128]="This is plain!"; unsigned char encrypted[128]; unsigned char decrypted[128]; unsigned char ivec[8]; BF_set_key(&key, strlen(keybuf), keybuf); printf("plain=[%s]\n", plain); memset(ivec, 0, sizeof(ivec)); BF_cbc_encrypt(plain, encrypted, strlen(plain), &key, ivec, BF_ENCRYPT); printf("encrypted=[%s]\n", encrypted); memset(ivec, 0, sizeof(ivec)); BF_cbc_encrypt(encrypted, decrypted, strlen(plain), &key, ivec, BF_DECRYPT); printf("decrypted=[%s]\n", decrypted); return 0; } |
|
ちゃんと読んでません、と書かれているのに突っ込みを入れるのは 失礼かもしれませんが・・・ #こんなこと言っておきながら、嘘だったらごめんなさい。 http://x68000.startshop.co.jp/~68user/net/crypt-1.html で紹介している http://www3.sympatico.ca/wienerfamily/Michael/MichaelPapers/TwokeytripleDES.pdf ですが、確かに2つの鍵を使う3DESは攻撃方法がある、ということも 書いていますが、どっちかって言いますと、既存の方法、すなわち、 §2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、 という論文のような気がします。 恐らく、Merkle-Hellman Attackの方法はA=0となる解を2の56乗用意 して、何とかするけれど、この論文の方法はKnown-Plaintextを用いると、 もっと早く解析できますよ、といっているような。 #そのKnown-Plaintextがなんじゃらほい、というところまでは #精査していませんが。 それ以降はハードウェアのインプリメンテーションの話ですね。 |
|
>>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; } |
|
>>3587 68user ご回答ありがとうございます。 .oがsrcと同一ディレクトリに存在するのは基本なのですね。 検討した結果、下記の様な仕様にしました。 単体環境:make終了後*.oは自動削除する。単体で1プログラムを対象(実際には共通ライブラリも含まれますが。。)にmakeするのにタイムスタンプを管理する必要は無いと言う結論です。 結合環境:全コンパイルが必要となる結合以降はsrcファイルと同一ディレクトリに.oを保管する。単体完となっているはずなので、修正のあったファイルをupdateするのみとする。 以上結論報告です。(報告されても。。。と思われるかも知れませんが。。(^^;)) |
|
質問するのはお久しぶりです。 つかぬ事をお伺いしますが、VineLinux起動中の停電後の再起動で、 非常に冷や汗モノのメッセージが出現しました。 Mounting proc filesystem: mount /proc/: can't read superblock これがそのメッセージですが、HDDのブート関連の情報が消えたと言う 事になるのでしょうか・・・(死刑宣告?) もしその最悪の状態の場合に、その他のパーティションのデータ復旧は 望めないでしょうか。 ちなみになぜかCDブートも出来ない状態です。 ファイルシステムはex3です。 神様仏様どうか最悪の状態では無いように・・・アーメン 何でこんな時に・・・ |
|
追加情報ですが、df の表示は /dev/hda6 としか表示されません。 fdisk /dev/hda の結果は、Unable to open /dev/hda です。 う〜ん・・・ |
|
>>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 復旧」などでぐぐると、いくつか ヒットするようです。 |
|
早速の御返答ありがとうございます。 /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のモノだと前記の通りです。 |
|
>>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 も 見えないのですか? |
|
ごめんなさい、どんな情報が必要かわからなかったのと、自分でも 何が問題なのかよく判らないもので・・・ >再マウントできませんか? いろいろと指定を変えて試しています。 ただ、パーティンション情報が間違っている時に rw で書き込んで 大丈夫でしょうか? A1 HDDはIDEが一台のみです。 A2 メッセージをかいつまんで見る感じでは、superblock が読めない と表示されているように思いました。 A3 シングルモードで試してみましたがROでマウントされている状態が 変わりません。 A4 起動中に /proc へのアクセスが出来なくてエラーとなっているようです。 /boot /var /usr /proc のマウントが失敗しているようですが、 / に /usr /var というファイルが存在しますが、/proc というファイルは 存在していません。 関連サイトをあさって情報を探していますが、ファイルシステムは(も) よく判らない状態です・・・ ログは /var へアクセスできないのでお手上げです。 |
|
"Merkle-Hellman" DESと、Googleで検索をかけたところ、 http://info.isl.ntt.co.jp/~ohta/BOJ-Seminar.pdf を見つけました。21枚目あたりが参考になるかも知れません。 #なんだか、いらない突っ込みしてしまって、余計な苦労を #かけてしまったとしたら、申し訳ないです。 #お忙しいでしょうし、僕の意見も間違っている可能性大い #にあるでしょうから、その内気が向いたらで結構です。 |
|
>>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 などの下の ファイルを操作してもらっては困るので、そういう意味でも 「シングルユーザモードで起動」をお勧めします。 |
|
結果から書くと諦めました。 教えてもらった事と、考えられる事を幾つか試してみましたが、 何らかのエラーのオンパレード・・・ 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のシステムは、大きなト ラブルも無く今だ健在なのにたった一度の不正終了で・・・。 運が悪いといえばその通りなんでしょうが・・・(涙) お付き合いありがとうございました。 |
|
インストーラーで、前のパーティションを残してインストールする選択 肢が有ったので、/home を残して再インストールしたところ、ラッキー な事にデータを残せたようです。 /etc は全滅なので全て再設定を行う必要が有りますが、一番重要なデ ータが残せた事でよしとします。 また、今回のトラブルでファイルシステムのキーワードを沢山見つけま したが、自分はシステムを作るヒトじゃなく使うヒトなので、あまり 深入りするつもりは有りません。 しかし、バックアップの重要性は友人にあれほど言っている自分が今回 の様なトラブルにあった事でよい戒めとなりました。 ジャーナルシステムを過信するとワタシの様な目に遭いますので、皆さ まご注意を(^^;;;; お騒がせいたしまして申し訳有りませんでしたm(_ _)m |
|
英語と格闘させてしまってるところ、申し訳ないのですが、 暗号技術大全§15.2をご覧ください。 #ごめんなさい。手元にあるのに気が付かなくって。 しかも、Merkle-Hellmanの論文はacmに登録しないと読めない ようなので、僕が一人相撲をとっていたようですね。 #間抜けなことをしでかして、すみません。 |
|
色々と調べたのですが、どうしても分かりません。 以下の機能のスクリプトを作成中です。 1.ユーザーに入力を促し、ユーザーID、パスワードを入力させる。 2.入力されたパスワードの整合性チェック 文字数、英文字数、数字文字数、ユーザーIDと不一致etc. 3.正しいパスワードであった場合、passwdコマンドを実行し該当ユーザーのパスワードを変更。 問題は、上記の「3」です。 ユーザーが入力したパスワードをそのままpasswdコマンドに渡し、パスワード変更を行いたいのですが、入力されたパスワード文字列をpasswdコマンドに渡すことが出来ません。 通常時のpasswdコマンド実行時の様に旧パスワード/新パスワード/新パスワード(再入力)を促さずに、変数として持っているパスワード文字列をpasswdコマンドに渡すことは出来ないでしょうか? 環境はAIX 5.2でシェルは出来ればkshで実現したいと考えています。 |
|
>>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 は人間が操作することを前提としたコマンドなので。 |
|
>>3607 バンガード passwdコマンドは端末からの入力しか受け付けないため シェルからpasswdコマンドへ直接値を渡すことは出来ません。 expectを使うのが一般的?かなと思います。 (Solaris以外はさっぱりなので参考程度に。) >>3608 68user AIXにはpwdadmというコマンドがあるのですね。 HP-UXのshの話といい、色々と参考になります。 |
|
>>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 の方は紹介しなくていいかな。 論文も見つからないし」 と思ったわけです。もしこの認識が誤りであればご教示願います。 |
|
>>3610 68user > つまり Merkle-Hellman Attack の選択平文攻撃よりも既知 > 平文攻撃の方が脅威であるため、 > 「Merkle-Hellman Attack の方は紹介しなくていいかな。 > 論文も見つからないし」 当時の僕は論文の意図しか見ておらずこの、「論文も見つからない」 ということ、特に誰でも容易にハイパーリンクを辿ることによって 確認できる方法が無い、というところまで、頭が回っていませんでした。 > と思ったわけです。もしこの認識が誤りであればご教示願います。 いえ、少なくとも現在の僕の認識とは同一です。 #僕の勇み足だったと思います。お詫び申し上げます。 |
|
>>3610 68user バンガードです。 この掲示板を使うのが初めてなので、うまくコメント出来ていなかったら御免なさい。 >UNIX 一般の話であれば、そうでもありません。Linux では > % ( echo oldpasswd ; sleep 3 ; \ > echo newpasswd ; sleep 3 ; \ > echo newpasswd ) | passwd >でできました。Solaris8 だと不可でしたが、本当に端末が >ない状況 (cron からとか、CGI からとか) でやるとうまく >いったりするかも、とか思ったりします。 at コマンドで試してみましたが、残念ながら駄目でした。 引き続きpwdadmについて調査致します。 また、結果を報告させていただきます。 |
|
>>3608 68user >ただしプログラムで制御するなら、pwdadm を使った方が >よいような気がします。 pwdadmについても確認しましたが、残念ながらpasswdと動作は変わらない様です。 (もう少し、細かい設定が出来はしますが) やっぱり、旧/新パスワードを聞いてきて、それぞれの入力が必要であると言う部分では、全く変わりませんでした。 >>3609 zsh expectについては、昨日も調査を致しました。 しかしながら、expectおよびTclの導入が必要ですので、採用を躊躇しています。 |
|
>>3613 バンガード 3608 でも書いたように、root 権限で実行したら 旧パスワードは聞かれないと思いますが、どうですか? |
|
>>3614 68user はい。この件は返事が抜けていましたね。 申し訳ございません。 仰る通り、root権限であれば確かに古いパスワードは聞かれません。 ですが、結局は新パスワードに入力が必要であり、ここでユーザーの介在が必要なことに変わりはありません。 やっぱり、expectを導入するしかないのだろうかと考え始めています。 |
|
>>3615 バンガード > やっぱり、expectを導入するしかないのだろうかと考え始めています。 もし AIX の passwd が、どうしても端末からしか読んでくれないなら、 expect などに頼るか、PAM を使ったパスワード変更プログラムを 書くことになるかと思います。 |
|
LinuxASからsolaris9に乗せ替えるのですが、 クーロンはどのように移行できるのでしょうか? まだ実機が来ていなくて何も環境が見えません。 これまでの設定ファイルやスクリプトファイルが そのまま使えるのか、シェルの変更をしないと使えないのか、 どこに配置するのか・・・少しでも事前に解っていれば助かるかな〜って思ってます。 |
|
>>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 の便利な機能を活用しまくって いるなら苦労するでしょう。 |
|
>>3618 68user 参考にさせていただきます。 実機の搬入が来週なので、結果報告はその時にします。 |
|
>>3616 68user 現在expectで対応する方向で準備中です。 ありがとうございました。 |
|
度々申し訳ございません。 今度は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関数を使用するしかないでしょうか? 本当に基本的なことで申し訳ございませんが、よろしくお願い致します。 |
|
>>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 |
|
>>3622 68user > prefix=${line%-r[0-9]} > if [ "$prefix" = "aix4" ]; then これだと、私が例で示させていただいたパターンにしか対応できませんよね。(そういう意味では私の示した例が悪かったですね) これを「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか? たとえば、以下のようなif文は無理でしょうか? if [ $line = "aix4"* ]; then |
|
>>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 |
|
>>3624 68user >aix4* では aix-r4x3 はマッチしないように見えますが、 >またしても不適切な例ではありませんか? おっしゃるとおりです。 重ね重ね申し訳ございません。 >if ではできませんが、case ならできます。 なるほど、caseでなら「aix4*」が可能ですか。 助かりました。 |
|
初めまして、裏方と申します。 WinSockを用いたウィンドウズネットワークプログラムで、インター ネットを介して、私のマシン名からIPアドレスを取得する方法に ついて悩んでいます。言語はC言語を扱っております。 ローカルネットワークではマシン名からIPアドレスを取得するには Gethostbyname関数で取得できるのですが、インターネットを介した 遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま せん。(私のはサーバマシンでは無いので当然なのですが・・・) 私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに 動的なIPアドレスが割り当てられるのですがサーバプログラム等を 私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え なければならないので非常に不便です。 どうにかして、私のマシン名からIPアドレスを取得する方法が あるのでしょうか?どなたかアドバイスをお願いします。 |
|
>>3626 裏方 - 逆引きできないから困っているの? (もしそうなら「マシン名」というのは何?) - IP アドレスがころころ変わるから困っているの? (もしそうなら「マシン名」は関係ないのでは?) - そもそもマシン名って何を指しているの? FQDN? - DHCP で振られる IP アドレスには FQDN が設定してあるが、 外部向け DNS サーバには登録してなくて、内部からしか逆引き できない、という状況? などなど疑問はつきませんが、http://www.dyndns.org/ などの DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。 ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて いる IP アドレスに結びつけるということです。管理者が寛容である ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。 |
|
始めまして、UNIX使い始めです。 この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。 そこでお聞きしたい事がるのです。 awkコマンドのifなどの中で変数は使えないのでしょうか? 現在、全ファイルに作成日付が付加されており、 指定日より前の物を削除したいいのです。 シェルの前半で指定日付を変数へ代入し、 lsとawkをパイプで繋いで削除しようとしています。 awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており、判別できないのです。 (ifを削除しprintで変数を表示させて確認) 出来ないのであれば何か別の方法を考えなくてはいけないのですが、 何方かお答えください。 |
|
>>3628 Tangerine 具体的にどのようなスクリプトなのか見せて頂けませんか? (そもそもawkを使う必要があるのでしょうか?) |
|
返信遅れてすいません。 えっと、確かに自分も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じゃなくて別の方法で行えるのであれば、 御教授いただけると嬉しいです。 |
|
>>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 |
|
>>3631 zsh おおっ!!有難う御座います(T▽T) なるほど、forですね。なんとも勉強不足でした(^^; やはりawkでは変数をそのまま引き継げないのですね。 awk内で更に変数に入れ込まなければいけないとは(^^; 有難う御座います。 教えていただいた方法で作成していきます。 本当に助かりました(w |
|
>>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 オプションを付け、変数が狙い通り展開されているかどうか チェックする癖をつけましょう。 |
|
なるほど〜、ややこしい事になっていたのですね〜 おかげさまで希望の日付以前のファイルを削除することが出来ました、 有難う御座います。 追伸 >% sh -x hoge.sh 使うようにしてみます(^^; |
|
>>3633 68user その方法があることをすっかり忘れてました。 (というか使った試しが無い・・・反省) いつもながら勉強になります。 |
|
初めまして、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); |
|
>>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 は、ホスト名も受け付けるように機能拡張されているわけです。 |
|
また初歩的なことで申し訳ありません。 以下のプログラムで、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 最初のプログラムの様に、最初のループの結果を変数にセットする 場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう か? |
|
>>3638 バンガード バッククォーテーションでくくると別プロセスになるから 変数を保持することはできないと思いますが・・・ |
|
>>3638 バンガード > このプログラムの3行目から10行目を以下の様に修正すれば この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。 |
|
>>3640 68user 3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。 これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。 |
|
>>3641 バンガード > while文の出力は標準出力へ出て行くだけ それは echo しているからでは? echo しなければ OK かと思います。 > while文の出力を変数に格納したいと考えています 修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。 また、ループを抜けた後でも参照が可能だと思います。 |
|
>>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から抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか? |
|
>>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 行分だけの出力が得られました。 |
|
>>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 |
|
>>3645 バンガード > 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出ます。 そうでしょうね。 > 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力されなくなります。 そうなりますね。`〜` とするとサブシェルが起動されますから、 $CMD が設定されるのはサブシェルだけで、親のシェルには反映 されません。 質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641 の希望を満たしているように見えますが違うのですか? まだ説明して いない理由があって、>>3644 は採用できないのですか? |
|
>>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文の出力をファイルに格納するしかないかと考えています。 もし、それ以外の方法があるのであれば、お教えいただけると助か ります。 |
|
>>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 |
|
>>3649 バンガード なるほど、全ては私の質問の書き方が原因だったのですね。 本当に申し訳ありません。 今回御指摘いただいた様な表現を最初からすべきでしたね。 御提示いただいたスクリプトで目的が達成できました。 重ね重ね誠にありがとうございました。 |
|
awk(正規表現?)でちょっと行き詰まってしまったので質問します。 OS:Solaris8 やりたいこと 環境変数の内容で awk を使ってテキストファイルの検索を行う。 検索に使用する環境変数を HOGE として awk '/ENVIRON["HOGE"]/ {print}' FILE_NAME を行っても検索されませんでした。 ちなみに {print ENVIRON["HOGE"]} とした場合には値が返りませんでした。 何か根本的なところで間違ってるかもしれませんが・・よろしくお願いします。 #grep $HOGE FILE_NAME とすれば出来るのですが・・awk で実現したいのです。 |
|
>>3650 m16 awk はよくわかりませんが、 % awk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME ですかね。 |
|
>>3650 m16 /usr/bin配下のawkでは環境変数を参照できなかったと思います。 /usr/xpg4/bin/awkかnawkを使ってください。 % nawk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME |
|
68user さん zsh さん レスありがとうございます。 まだうまくいきません。 確認のため /usr/bin/awk 、/usr/xpg4/bin/awk 、 /usr/bin/nawk で { print ENVIRON["HOGE"] } としても空白しか出てきません。 もうちょっと修行してみます |
|
>>3653 m16 HOGEはちゃんとexportしてますよね? |
|
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です。 |
|
>>3655 すすむ すみません リストのファイル名は、 YYYYMMDDHHMMSSdata_tar.gz ↓ YYYYMMDDHHMMSSdata.tar.gz です。 |
|
>>3656 すすむ tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz ではどうでしょうか? |
|
>>3657 バンガード >tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz 上手くいきません。 |
|
>>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 展開の時点でエラーになります。 メタキャラクタは必ずエスケープしましょう。 |
|
>>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 で試しましたが、結果は同じです。 |
|
>>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 の一読をお勧めします。 |
|
>>3661 68user まず最初にお断りさせていただきたいのですが、私が3660の投稿を行ったタイミングでは まだ3659の発言はありませんでした。 ですので、3660投稿の時点では3659の発言は読んでいませんでした。 ただ、どちらにしても私のテスト自体に思い違いがあった様で御指摘は大変参考になり ました。 御指摘誠にありがとうございました。 この投稿を送信次第御提示いただいた資料を参照してみます。 |
|
>>3659 68user >HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用 >できないようです。 > - 全部 tar xf で展開し、狙いのファイルを拾う > - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する > - GNU tar をインストールする >などの方法を検討するのがよいかと思われます。 tar tvf の結果をgrepで拾って、tar xvf に対して完全なファイル名を 指定する方法でできました。 ありがとうございました。 |
|
はじめまして。Naokiと申します。 皆さんに教えていただきたいことがあり、書き込ませていただきます。 レンタルサーバーを借りてホームページを開設しようとしているのですが、 最初に読み込まれるトップページを指定したいのですが、どのようにしたらよいのでしょうか? 具体的には、アクセス元がパソコンor携帯かによって、それぞれのトップページを振り分けるCGI をトップページにしたいと考えています。(ファイル名はindex.cgi) サーバー会社に問い合わせたところ、『index.cgiやindex.phpをトップページにする方法として、 .fowardファイルにて操作可能』と言われ、それ以上はサポート外なので対応できないということです。 そこで、どのように設定したらよいのか教えてください。 以上、よろしくお願いいたします。 |
|
こんばんは。 皆様のようにきっちり回答できる自信がなく、時折の書き込みで恐縮ですが、 たまたま一部知っている内容だったので回答させていただきます。 >>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 |
|
こんにちわ。 Perlについてのごく初歩的な質問なんですがファイルデータを保存する時の方法についてなんですが CSV形式なら open(OUT,">data.dat"); print OUT "$FORM{'fld1'},$FORM{'fld2'},$FORM{'fld3'},$FORM{'fld4'}\n"; close(OUT); だと思うのですが固定長の場合はどうしたらよいのでしょうか? よろしくお願いします。 |
|
>>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 を超えるのであれば、出力フォーマットの定義 ファイル化などを検討しましょう。 |
|
ありがとうございます。 助かりました。 また、質問があれば投稿しますのでその時はよろしくお願いします。 |
|
だから私を見て! http://sgldwssr.hp.infoseek.co.jp/otp.html |
|
awkについての質問です。 Solaris7上で、nawkを実行する際、 "cat text.txt" | getline var という構文があるとvarに "cat text.txt" の結果が入るのですが、 同じことを /usr/xpg4/bin/awk で実行すると var に値が 入らないようです。 このあたりの事情をご存知の方、教えてくれませんか? |
|
下記の件ですが、awkをかける対象のテキストの行数が、 getlineで取り込まれるテキストの行数より少ない場合に 発生することがわかりました。 つまり、getlineで取り込まれるテキストの方が短い場合、 nawkでは最後の行の内容が保持されて、それを利用した置換処理が 行われるが、 /usr/xpg4/bin/awk では行われないということです。 |
|
>>3671 tmr なるほど。そういう違いがあることは知りませんでした。一般論としては、 getline の戻り値チェックをしっかり行ないましょう、てな感じでしょうか。 |
|
誰かハイホーネットにメールを送信するアプリをくれましたか?(w |
|
はじめましてvmと申します。 UNIXのコマンド処理で質問があるのですが、 何行かあるテキストファイルの指定のカラム位置に文字列を行単位に挿入 するという処理を、UNIXのコマンドだけでやりたいと思っています。 自分で処理を考えてみたのですが、 1. cutコマンドを使用して、指定カラム位置を境にして、 「指定カラム位置より前の文字列が入ったファイル」と 「指定カラム位置より後の文字列が入ったファイル」に分割する。 2. paste コマンドを使用して、セパレータを元のファイルが使用していない文字を指定して、 1で作ったファイルを結合する。 3. sedコマンドでセパレータ文字を挿入したい文字列に置き換える。 ワークファイルができてしまって、UNIXっぽくないので、 これ以外にもっと簡単なやり方がないか探しているのですが、 もしご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。 よろしくお願いします。 |
|
>>3674 vm やりたいことがよくわからないので、入力と出力のサンプルを 提示してください。 |
|
>>3675 68user 多分このような事を考えているのだと思います。 ■入力ファイル aaaa,bbbb cc,ddd eeeeee,ffff ■挿入文字列 00 ■出力ファイル aaaa00bbbb cc00ddd eeeeee00ffff >>3674 vm で、やりたい事が上記の通りだとすると、 perlとかawkで出来ると思います。 |
|
こんにちはvmです。 説明不足でした。 入力データは1ファイルで、 AAAABBBCCCCC DDDDEEEFFFFF GGGGHHHIIIII : という感じで項目間の区切り無しのレコードが いくつか入っているという状態で、 AAAABBB****CCCCC DDDDEEE****FFFFF GGGGHHH****IIIII : 1行目で見ると、BBBとCCCCCの間に****を挿入するということを、 シェルかUNIX標準コマンドでやりたいと考えています。 先に書いた私の手順ですと、一度cutコマンドで AAAABBB DDDDEEE GGGGHHH : CCCCC FFFFF IIIII : 2つのワークファイルを作るので手順も多くて面倒なため、 他にやり方がないものかと考えている次第です。 もっと単純化できる方法がありましたら、ご教授ください。 お願いいたします。 |
|
>>3677 vm 区切り文字なしだとすると、文字列の挿入個所は何を基準に判断するのでしょうか? 下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか? 後気になった点はUNIXの標準コマンドというのは どこまでを指すのでしょう? インストール時点でインストールされるコマンドは、 OS・インストールオプションによって異なると思いますが・・・ |
|
こんにちはvmです。 >下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか? すみません。そのとおりです。 >後気になった点はUNIXの標準コマンドというのは >どこまでを指すのでしょう? POSIXに準拠しているコマンドのことを指していました。 あれからちょっと調べてみたのですが、 awk '{printf("%s%s%s\n", substr($0,1,2), "TUIKA", substr($0,3));}' target.txt > result.txt awkコマンドであれば、私のやりたいことがワークファイルを作らずに 実現できそうなことがわかりました。 どうもお騒がせしました。 これより良い方法がございましたら、ご教授ください。 |
|
gfg |
|
宜しくお願いします。 tarコマンドを実行した際に以下のメッセーシ゛が出たんですが、 何を意味しているかわかりません。 ご教授ください。 -------------------------------------------------- cd / tar -cvf /dev/rmt0n ./usr/* tar -rvf /dev/rmt0n ./var/* ← メッセーシ゛が出ます -------------------------------------------------- 表示メッセージ tar:blocksize=0 tar:backspace over record failed -------------------------------------------------- ご教授ください。宜しくお願いします。 |
|
mailxコマンドに関してですが 件名がベース64で本文がJISコードのメールを読む時、 以下の状態になってしまいます。 直す方法を知っている方おりましたらお教えください 1.件名が日本語の長文だと、以降の画面が文字化けします 2.JISコードの本文を開くと 「---Executing: kterm sh: kterm: 見つかりません」 とでてしまい表示できません |
|
>>3679 vm > これより良い方法がございましたら、ご教授ください。 awk より良い方法かどうかはわかりませんが、 sed 's/^\(..\)/\1TUIKA/' < target.txt > result.txt というのもあります。 >>3681 馬場 すでにアーカイブ済のファイルが出現したため、前に戻って 置き換えようとしたが、テープドライブのため前に戻る機能が なかった、ということではないですかね。 >>3682 ryo Solaris2.6 ではその症状は出ませんでした。 |
|
こんにちは。Phantomと申します。 ネットで色々調べた結果ちょっと、見当たらなかったので質問させてください。 アクセスログの話なのですが、Web/FTPサーバのアクセスログでは有りません (Web/FTPのアクセスログの情報は腐るほど有りました。また、情報が全く無か ったと言うのは嘘で、高いソフトウェアやASPぐらいの情報しか出てこず、個人 の私としては手が出ません。)。 ローカルのLinux環境内でアクセスされたファイルのログを取りたいと考えて いるからです(Unix系OSで実現するのが難しいから情報が少ないのでしょうか?)。 当然、アクセスログなのでアクセスしたユーザ名、時間、アクセス先などの情報を 見たいと思っています。 セキュリティの事もあるのですが、私自身が何時ファイル(特に設定ファイル)の 編集を行ったかという履歴を見たいからです。 それで、これに見合った(フリー)ソフトウェアやシェルスクリプト等が存在しまし たら、紹介していただければ幸いです。(それとも、もしかしてすごく簡単にPerl とかで組めちゃったりするんでしょうか?) |
|
>>3684 Phantom 履歴や変更点の確認をしたいということなら、cvs や subversion などのバージョン管理ツールを使うのがよいでしょう。 履歴を何段階でもとることができ、細かい修正点を記録できるという 利点がありますが、その一方でファイル更新とバージョン管理とが 密に連携しているわけでないので、バージョン管理ツールへの登録 忘れが発生する可能性がある、という欠点があります。 あるいは > ユーザ名、時間、アクセス先 だけの情報だけでよいなら、 - ユーザ名、時間、ファイル名を記録する - エディタを起動する - (必要なら) 編集前と編集後のファイルをどこかに保存する というファイル編集用スクリプトを作成し、それを使うように すればよいでしょう。もちろん、このスクリプトを使わずに直接 ファイルを修正してしまうとアウトです。 もっと厳密にやりたいならシステムコールをフックするタイプ のものが必要です。たとえば Linux Security Module (LSM) や Sysrace: http://www.citi.umich.edu/u/provos/systrace/linux.html など。 しかしこれらの主目的はシステムコールを許可するかしないかを 決めるためのものなので、ログを記録できるような仕組みがある のかどうかはわかりません。 > Unix系OSで実現するのが難しいから情報が少ないのでしょうか? Windows なんかだと API のフックが簡単にできますが、UNIX は そこらへんの機能が弱いのです。 |
|
>>3685 68user 凄く素早いレス有難う御座いました。 沢山の情報を与えてくださって感謝しております。 > cvs や subversion 成る程。バージョン管理ツールという手が有りましたか。 > ファイル編集用スクリプトを作成 作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル 編集しちゃって失敗しそうです。 > LSM や Sysrace 私には難しいみたいですが、一つの手として調べてみます。 |
|
>>3686 Phantom >作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル >編集しちゃって失敗しそうです。 エディタコマンドと同じ名前のスクリプトを作成し、 スクリプトを格納したディレクトリを環境変数PATHの先頭に追加しては如何なでしょうか? |
|
Solaris7にて/dev/consoleに出力しているログを横取りして ファイルに落としたいんですが、なにかいい方法はありますか? ありましたらご教授願います。 |
|
こんにちは。 ある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 |
|
>>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 ならどこを見ればよいですか? |
|
>>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]で検索→到達です。 # 本当はもっといろいろ遠回りしてますが… |
|
僕は某高専2年の電気科なんですが,C言語の授業があって学校のPCのOSがunixなんですよね〜。 Windowsで作成した文書ファイル(拡張子.c)をFDでunixに送る場合,文字化けしますよね? それを防止する方法を教えて下さい。メールで返答していただければ幸いです。 |
|
>>3692 流離のカメソらいだ〜 一般的にはWindowsの標準文字コードがS-JISで、UnixがEUCだからそうなります。 FDに保存する際にエディタでEUCに変換しておくか、 エディタにその機能がないかUnix上で変換かける場合は、nkfコマンドを使ってください。 |
|
texの文書で、dviのファイルをpdh形式に変換したいのですが、人に聞いた ところGhostscriptを使ってできるとのことで、早速GSを落としてみたので すが、具体的な操作など教えてもらえれば幸です。 |
|
68userさん、ありがとうございます。 >x.y.z.255 などのブロードキャスト宛に ping したいので >あれば、-b オプションを付けなさい、ということです。 x.y.z.0もブロードキャスト宛ということになるのでしょうか? |
|
>>3691 has なるほど、ありがとうございます。Debian の ping は、 Do you want to ping broadcast? Then -b というエラーは出さないようですね。 >>3695 MM > x.y.z.0もブロードキャスト宛ということになるのでしょうか? x.y.z.0/255.255.255.0 はネットワークアドレスです。 ただ、BSD 系・BSD 系を元にした実装 (Solaris・Linux など) は ネットワークアドレスに対する ping に対して返事を返します。 Windows 系はたしか返事を返さないはず (ネットワークアドレスに 対する ping だけでなく、ブロードキャストへの ping も返さない)。 だから、ネットワークアドレス宛の ping であっても、ブロード キャスト宛の ping と同等に機能する環境もあります。 ただし ping は 「この宛先はブロードキャストアドレスだから `Do you want to ping broadcast? Then -b' というメッセージを出そう」 などと判断しているわけではなく、 >>3690 68user に書いたとおり、connect して errno が EACCES ならこのメッセージを 出力して終了しているだけです。しかしこの connect の意味がさっぱり わからないので、「ネットワーク設定がおかしいのでは?」以上のアドバイス はできません。 てゆーか、どなたか >>3690 の意味を教えてください。 >>3694 abc > texの文書で、dviのファイルをpdh形式に変換したいのですが pdh は pdf の typo ですか? gs 付属の ps2pdf はいまいちで、今どきは dvipdfm を使うと 聞いたことがありますが、最新情報や細かなノウハウは知りません。 よって、「dvi pdf 変換」などで検索してみるか、2ch の UNIX 板 などで質問してみてはいかがでしょうか。 |
|
はじめまして、こんばんは。 LINUX, Apache, PHP, MySQL、HTMLでのシステムを考えているのですが、 ちょっと行き詰まってしまって、、、よろしくお願いいたします。 ページがジャンプした瞬間に、あるフィールドをいきなり入力待ち状態にしたいのです。 通常はページに移動後マウスなどで入力したいフィールドを一度クリックする必要があります。 現在フィールドはフォーム<input>タグで作成しています。 カスタマーは(バーコードを使って>マウス1クリック無しで) いきなり入力したい!というのがご要望です。 関連のページのご紹介でも何でもかまいませんので、 是非、よろしくお願いいたしますm(_ _)m |
|
>>3697 うほほ たとえば http://www.google.co.jp/ がその技を使っています。 ソースを見ていただければわかりますが、 <body onload="document.hoge.fuga.focus()"> <form name=hoge> <input type=text name=fuga> </form> </body> とします。 |
|
>>3696 68user >なるほど、ありがとうございます。Debian の ping は、 > Do you want to ping broadcast? Then -b >というエラーは出さないようですね。 そーゆーことですか、了解です。ならredhat9では次の通りになりました。 % strings /bin/ping | grep Then Do you want to ping broadcast? Then -b % |
|
ファイルをダウンロードするスクリプトを作成していますが、 ファイルサイズが大きいとファイル内容は一部しかダウンロードできません。 sysreadの戻り値$Ret_Lenは、正しい値が返ってきます。 最後のprint文で、全てを出力していません。あるいは、$INBUFに全てが 格納されてないかです。 全ての内容をダウンロードするには、どうすべきなのでしょうか? $size = -s $dl_file; open(INF, $dl_file) or &CgiError( "Error: Unable to open file $dl_file: $!\n" ); binmode(INF); $Ret_Len = sysread(INF, $INBUF, $size); if (defined $Ret_Len) { #エラーではない if ($Ret_Len >0) { #読み取りの成功 ; } else { #EOF close(INF); } } elsif ($! == EAGAIN) { #ブロックエラー $Ret_Len = sysread(INF, $INBUF, $size); } else { die "sysread() error: $!"; } $NowMime = substr( $f_name, rindex($f_name, ".")+1, length($f_name) ); $NowMime =~ tr/a-z/A-Z/; $RetMime = ""; # 2001.12.19 added by ishikawa -> #$mimeMach = 'dummy'; # 2001.12.19 added end ishikawa <- if( $NowMime ne "" ){ if( open(CB, "./lib/mime.types") ){ @mimein = <CB>; close( CB ); foreach( @mimein ){ if(/^[^#\n\r]/){ s/[\t]+/\t/; ($MimeHead,$MimeBody) = split(/\t/); # 2001.12.19 added by ishikawa -> if( defined $MimeBody ){ # 2001.12.19 added end ishikawa <- foreach $mimeMach ( split( /\s/, $MimeBody ) ){ $mimeMach =~ s/\s//g; $mimeMach =~ tr/a-z/A-Z/; if( $mimeMach eq $NowMime ){ $RetMime = $MimeHead; last; } } # 2001.12.19 added by ishikawa -> } # 2001.12.19 added end ishikawa <- if( $RetMime ne "" ){ last; } } } } } if( $RetMime eq "" ){ print "Content-Type: application/octet-stream\n"; print "Content-Disposition: inline; filename=\"$f_name\"\n\n"; } else{ print "Content-Type: $RetMime\n"; print "Content-Disposition: inline; filename=\"$f_name\"\n\n"; } binmode(STDOUT); print $INBUF; |
|
>>3700 sagara - 「ファイルサイズが大きい」とは具体的に何バイトですか? - あるバイト数以上のファイルの場合、常にダウンロードできないのですか? - 大きいファイルを処理するのに何秒かかりますか? - length($INBUF) の値は? - $INBUF の内容をファイルに出力すると、正常に出力できますか? - 「sysreadの戻り値は正しい」というのは「正常にダウンロード できなかった場合でも、sysread の戻り値は正しい」ということ ですか? - sysread ではなく read を使うとどうなりますか? - OS 名・OS のバージョン・perl のバージョンは何ですか? あと、コメント部分や関係ない箇所は極力削ってから投稿しましょう。 仕事のソースであれば特に。 |
|
>68USER様 早々のお返事をありがとうございました。 やってみたら、ばっちりでした〜! 本当にありがとうございました♪ |
|
はじめまして。よろしくお願いします。 環境:NetBSD1.5.2、Apache2.0.49 以下に示す接続が、4日くらいたっても消えません。 これは、クライアントがhttpで何かをダウンロード中の状態の1つということでしょうか? ずっとこの状態のままなのはどういう原因が考えられますでしょうか? Apacheのログには、このクライアントからのアクセスログは存在しませんでした。 FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか? %netstat -an (一部抜粋) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 15964 210.*.*.*.80 133.*.*.*.15241 FIN_WAIT_1 tcp 0 16460 210.*.*.*.80 133.*.*.*.6322 FIN_WAIT_1 tcp 0 16500 210.*.*.*.80 133.*.*.*.19339 FIN_WAIT_1 |
|
>>3703 lock サーバ側から close すると (正確にはアクティブクローズ すると) FIN_WAIT_1 になります。普通はこの後にクライアント から ACK・FIN が帰ってきて FIN_WAIT_2 に遷移しますが、 この辺がうまくいっていないものだと思われます。 > ずっとこの状態のままなのはどういう原因が考えられますでしょうか? わかりません。普通は FIN_WAIT_1 のままにならないように タイマか何かがあると思いますが、FIN_WAIT_1 タイマって 存在するのかな? (FIN_WAIT_2 タイマはあるけど) > FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか? これまたわかりません。apache のソースを読みましたが、どこで ログを吐いてるのかすらわかりませんでした。 とまぁ何の役にも立たない回答になってしまいましたが、 数日様子を見てはいかがでしょうかね。 |
|
数日前、FreeBSD 5.2Rをインストールしたのですが、起動時(ログイン前)に Configuring syscons: keymap blanktime と表示され、長時間とまってしまって困っています。 その後ログインプロンプトが表示され、ログイン可能ですし、 その他の操作に問題も無い感じなのですが、毎度の事なので釈然としません。 解決方法は無いものでしょうか?それともこういうものなんのでしょうか? よろしくお願いいたします。 |
|
>>3705 hash > Configuring syscons: keymap blanktime の後の sendmail 起動時に固まっているものと思われます。 内容は若干グダグダですが、こちらをどうぞ。 http://home.jp.freebsd.org/cgi-bin/thread?mesid=%3c200308030422%2eAA02439%40nt%2em8%2edion%2ene%2ejp%3e てゆーかうちのマシンも sendmail 起動時に固まりますが、 めんどくさいので止まったら Ctrl-C を押してます。 |
|
>> 3706 早速のお返事ありがとうございます。 ご指摘頂いた通り、原因はメッセージの後のsendmailの起動でした。 > Configuring syscons: keymap blanktime のメッセージから検索しても、解決法が見つからないのはあたりまえでしたね。 ご紹介いただいたウェブサイトに目を通すのに時間がかってしまいましたが、 解決することができました。 私の場合はDNSサーバの指定部分で、ADSLモデムの提供しているDNSで解決しようとしていたのですが、 モデムのDNSサービスがIPv6に対応していない為、名前解決できずTime outを待っていたようです。 DNSサーバの指定をプロバイダーのアドレスにしたら解決しました。 起動する度に気になっていたので、すっきりしました。 どうも、ありがとうございます。 |
|
DESについて質問させて下さい。 OpensslコマンドでDESを使っているのですが、間違った鍵で復号しようとすると bad decryptというエラーがでます。パリティチェックはOKとします。 これはDESの仕様上、エラーが検出できるということなのでしょうか? DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが ちょっと不思議です。 TripleDESの中ででも、いきなり関係無い鍵で復号したりしてますから、さらに 不思議です。 なにか根本的に理解が違っている気もするので、宜しければご教授ください。 |
|
>>3708 Sjr `bad decrypt' を出しているのは多分 rypto/evp/evp_enc.c の int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl){ b=ctx->cipher->block_size; n=ctx->final[b-1]; if (n > b){ EVPerr(EVP_F_EVP_DECRYPTFINAL,EVP_R_BAD_DECRYPT); だと思います。PKCS#5 で定義されている操作に矛盾が発生すると このエラーが発生すると思っています。 ところで PKCS#5 の日本語訳のありかをご存知の方いらっしゃい ませんか? (解説している書籍でも可) 以前自分で訳してみたものの、 よく理解していないため何が何だかわからない日本語ができあがって しまいました。 |
|
68userさん、ご回答有難うございました。 恥ずかしながらPKCSというのは知りませんでした。PKCS#5というのは、 簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか? 頂いたソースやPKCS#5を斜め読みしてもまだ今一つピンときていません。 勉強したいと思います。 今のところなんとなく、PKCS#5でのPS(Padding String)についての記述を 見て、Padding ruleによってはエラーが検出できるのではと予想しています。 やっぱりアルゴリズムを見ていくしかないですねぇ… |
|
>>3710 Sjr > 簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか? 決まりごとというか、RSA が作った決めごとですね。 DES は 64bit のデータを暗号化・復号化する機能しか持っていません (だから DES は 64bit ブロック暗号)。 これでは 64bit を超えるデータを暗号化できないので、データを分割して 暗号化する方法の一つが CBC モード (FIPS PUB 81 で規定)。一方、データ 列が 64bit に満たない場合のパディング方法などを規定しているのが PKCS#5 です。 PKCS#5 でのパディングは データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化 データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化 : データ7バイトの場合: A B C D E F G -> A B C D E F G 01 としてから暗号化 データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化 としていますね。 と書いているうちにわかったような気がしますが、 http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/crypto/openssl/crypto/evp/evp_enc.c?rev=1.1.1.1.2.4 の EVP_DecryptFinal_ex が呼ばれるときの流れは 残りブロックサイズ = ctx->cipher->block_size; if (残りブロックサイズ > 1){ /* 残りはパディング部分のみ */ n=ctx->final[b-1]; /* 最後の 1バイトを読む。その値はパディング長であるはず */ if (n > b) /* パディング長が残りブロックサイズを超えているならエラー */ for (i=0; i<n; i++) パディング部分の値が全て n であることをチェック /* ここまできたら、パディング部分が正しいことがわかる */ n=ctx->cipher->block_size-n; /* パディング部分を除いたブロックサイズを取得 */ for (i=0; i<n; i++) /* パディング部分より前のデータについて出力バッファに書き出す */ out[i]=ctx->final[i]; てな感じでしょうか。 |
|
一応補足。 >>3708 Sjr > DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが > ちょっと不思議です。 DES 自体は、鍵に含まれるパリティを以外の誤り検出機能はない、という 理解で正しいと思います。 しかし、PKCS#5 においては誤った鍵を使うと >>3711 68user > データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化 > データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化 この最後のデータ列 (06 06 06 06 06 06 など) がめちゃくちゃになって しまうため、パディングチェック時にエラーとなる、ということですね。 なお、PKCS#5 は DES に限らず、ブロック暗号一般に適用できます。ただし PKCS#5 は 64bit 暗号に特化した書き方がされているので、64bit 超暗号に 一般化したものが PKCS#7 に規定されています。 # と言っても、mod 8 とか書いてあるか、mod k と書いてあるかの違いしか # ないような気がしますけど。 |
|
x168userさん、詳細な説明ありがとうございます。 誤りの検出については、ほぼ理解できたと思います。 >データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化 のところは意外でした。データが増えてしまうのでしょうか。 確かにこうしないとパディングされているのかされていないのかが 分からない、ということなのでしょうけど。 よくよく見ていくと色々と考えられていて面白いですね。 |
|
初歩的な質問です。 複数ファイルを1ファイルにcatで結合しようとしたところ次の問題が発生しました。 各ファイルのファイル名は20文字程あり、それら10ファイルをまとめて作成したい ファイル名も20文字程あります。cat以下コマンドを入力していくと、255文字で 入力不能となります。環境はSolarisへのTelnet接続、シェルはkshを使っています。 また、結合したい10ファイルは1つのディレクトリにある全てのファイルです。 ファイル名を短くするとか一度にやらないとか方法はあるでしょうが、画期的な方法が あれば宜しくお願いします。 |
|
>>3714 SS さん、 ファイル名に共通点ありますか? $ cat aaa.txt a b c $ cat bbb.txt 1 2 3 $ cat ccc.txt x y z $ cat *.txt a b c 1 2 3 x y z |
|
>>3714 SS Solaris8 では sh・ksh・csh いずれも 255 文字の制限があるようで、極めて 不愉快ですね。 ワイルドカード (glob) を使う以外の別解としては、文字数の制限がある のはコマンドラインからの入力時だけのようなので、シェルスクリプト内で #!/bin/ksh cat file-a file-b ..... > result などとすれば OK なようです。 あとは、tcsh や bash を使うとか。 |
|
シェルスクリプトで実現することにしました。ありがとうございました。 |
|
>>3717 SS 3716で68user様もさらっと書いてますが、ワイルドカードをを使用する事でも回避可能です。 % cat * > outfile それにしてもこんな制限があるとは知りませんでした。 で、確認してみたところ、255文字ではなく257文字まで入力できました。 ・・・・・・なんでこんなに中途半端なんでしょう? |
|
>>3074 68user 返事遅れて申し訳ありません。 回答ありがとうございます。 状況は、全く変化せずFIN_WAIT1の状態のまま残っています。 タイマーはないようです。 OSを再起動すればなくなるのでしょうが、それは出来ないので困っています。 強制的にクローズする方法はありませんでしょうか? apacheを再起動しても変化なしでした。 |
|
>>3719 lock であれば、NetBSD のバグだと思われます。 http://www.netbsd.org/Misc/query-pr.html#search と http://www.netbsd.org/MailingLists/ で検索してみましたが、 それっぽいものはありませんでした。 # FIN_WAIT_1 が残るというメールはありましたが、NetBSD 1.3.1 # 以前の問題のようです。 これ以上はわたしには全くわからないので、netbsd.org の メーリングリストで質問してみてはいかがでしょうか。 |
|
初めてメールします。CGIを用いてGREE.jpのようなものを作りたいと考えているのですが、何かいい案はございませんか? |
|
>>3721 大谷 現状何が問題なのかを提示せずに いきなり「何かいい案は?」と 問われても、何と答えればよいのかわかりません。 |
|
シェルスクリプト内の変数の使い方について教えて下さい。 環境は、HP-UX11.00で、Cシェルです。 a.cshとb.cshの2つのシェルがあり、 b.cshは、a.cshから呼ばれる動きです。 この時、a.csh内で設定した変数を、b.csh内でもしたいのですが 上手くいきません。 - a.csh ----------- #!/bin/csh set title = "test log" ./b.csh - b.csh ------ #!/bin/csh echo "Subject: $title" >> kekka.log echo "" >> kekka.log というように使いたいのですが、上手くできません。 よろしくお願いします。 |
|
>>3723 つる setenvしてください。 |
|
留学歴を調べててわかったんですが、 あべ晋三さんって Mac のノート(G4 パワーブック?)で Unix を使って日本を動かしてるらしい。 http://www.s-abe.or.jp/image/pc_desk.gif 「./configure; make new_japan; make install」ってのがすごいですね。 実装が知りたい (^^) ★ さて質問です。tcup という有名なレンタル掲示板に 「プログラム書き込みを禁止する」という設定項目があり、 これを有効にするといわゆるエロ広告がカットできるようなんですが、 どういう実装になってるんでしょうか。 HTTP-AGENT 環境変数とかだったらフツー偽装しますよね。 (いぜん PC を docomo の携帯に偽装して「グリコの抽選の応募」を 連続応募する裏ワザというのがあった) ていうか、Internet Explorer だってコンピューターのプログラムには 違いないわけで。どうやって判別できるんでしょう? |
|
>>3275 kotaro > 「./configure; make new_japan; make install」ってのがすごいですね。 何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で なくて && でつなぐべきだとか、いったい何を grep してるんだとか、パス ワード入力時に何で * がエコーバックされるんだとか。 http://www.s-abe.or.jp/ の web も XOOPS を使っているようで、ページ 運営者がそういう系統の人なんでしょうね。 > 「プログラム書き込みを禁止する」 http://www.teacup.com/gbbs/l1new.shtml の「プログラム投稿(迷惑投稿)禁止」 のことですね。 http://8520.teacup.com/pon/bbs あれれ? 投稿者:PON 投稿日:10月10日(金)00時00分26秒 以降の発言を見るに、cookie を食べてくれるかとか、referer を 渡してくるかとか、Javascript を正しく解析してくれるかとか、 そういう感じの判定をしているものと思われます。 |
|
質問です。 Solaris8で、バックアップからのフルリカバリを行う際、 パーティションを作成した後にnewfsでファイルシステムの作成を行いますが、 このときSWAP領域にも、newfs /dev/rdsk/.....というようにファイルシステムを 作成するものなのでしょうか? vfstabファイルによると、SWAPはファイルシステムがufsでなくswapですので、どうなのかと思いまして。 googleで解説ページを検索すると、SWAPにnewfsを行っているサイトもあるのですが、 自分の持っている書籍では行っていません。 ちょっと分からなくなってしまったので、宜しくお願い致します。 |
|
>>3727 tt ufs ファイルシステムを作るわけではないので、newfs は不要です。 ファイルを swap として追加する場合も、 # mkfile 512m /foo/bar/swap512m # swap -a /foo/bar/swap512m と、ゼロ埋めのファイルを用意して swap -a するだけですので。 |
|
>>3728 68user様 ご回答ありがとうございます。 やはり不要なのですね。 ただ、それでもnewfsを行った場合、何か不具合が出るのでしょうか? 「不要」とは、「行っても問題無いが、する必要が無い」と言った意味になりますでしょうか。 swapをnewfsしている方は、その後問題無いのかなと思いまして。。 |
|
>>3729 tt newfsしても問題ないと思います。 ただし、実際にswapを使い始めると(書き込みが行われると) ufsとして書き込みに行かないので、結局ファイルシステムは破壊はされます。 よって、newfsする意味がありません。 |
|
C言語版FTPクライアントを実行させたところ、RETR後、レスポンスが2回続けて ありますが(150、226)、226のレスポンスが異常に遅いです(6分後)。 Solaris8、ProFTP(関係ないとおもいますが。。。)の構成です。 |
|
HP-UX11.00で、Bシェルなのですが、 awkで表示された内容をある数分出力したら別ファイルに 入れたいのですが、 --------------------------------------- #!/bin/sh # FILE="test.txt" OUTPUT="output.txt" awk -F" " ' BEGIN { count = 0+0 ; } function func() { if (・・・・) { printf("%s\n",$0) ; printf("\n") ; return 0; } else { return 1; } } { if (NF == 0) next ; if (NF == 2 && $1 == "dn:") { ret=func() ; if (ret == 0) count++ ; } if (count == 1000) { count = 0+0 ; } }' ${FILE} > ????? ------------------------------------ 1000件ごとに出力するファイル名を変えたい 「output_nnn.txt」ということはできるでしょうか。 |
|
>>3731 marlboro ご報告ありがとうございます。 調べてみますが、 - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?) - OS 付属の FTP クライアントでは問題ないのか - (インターネット上に公開されているサーバであれば) 相手のサーバ名 を教えていただけると助かります。 >>3732 すすむ HP-UX11.11 の /bin/awk で、 out="output_nnn.txt"; print "hoge"> out などと出力ファイルを指定できるようです。後は out の内容を 動的に変えていけばよいでしょう。 対象ファイルを切り替えるときは close(out) すればリソースの 無駄が省けてよいかもしれません。 |
|
>>3733 68user ありがとうございます。 >HP-UX11.11 の /bin/awk で、 > out="output_nnn.txt"; > print "hoge"> out >などと出力ファイルを指定できるようです。後は out の内容を >動的に変えていけばよいでしょう。 >対象ファイルを切り替えるときは close(out) すればリソースの >無駄が省けてよいかもしれません。 確認できる環境が近くにないので確認ができませんが、 以下の様なことなのでしょうか。 ------------------------ #!/bin/sh # FILE="test.txt" OUTPUT="output.txt" awk -F" " ' BEGIN { count = 0+0 ; num = 1; output="output_num.txt" } function func() { if (・・・・) { printf("%s\n",$0) >> output ; printf("\n") >> output ; return 0; } else { return 1; } } { if (NF == 0) next ; if (NF == 2 && $1 == "title:") { ret=func() ; if (ret == 0) count++ ; } if (count == 1000) { count = 0+0 ; num++ ; output="output_num.txt" } }' ${FILE} |
|
>>3731 marlboro 手元の複数の環境で実験した限りでは再現しませんでした。 >>3733 68user をご参照の上、より詳細なご報告いただければ幸いです。 >>3734 すすむ ご自分で動作確認して、わからなければ再度質問してください。 |
|
>>3735 68user >ご自分で動作確認して、わからなければ再度質問してください。 失礼しました。 ありがとうございました。 希望通りの動きをしました。 |
|
>> 「./configure; make new_japan; make install」ってのがすごいですね。 > 何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で > なくて && でつなぐべきだとか、 ごめんなさい、教えてください。 ;ではなく&&でつなぐとどうなるのですか? |
|
>>3737 kentarou 例として、「cmd1 && cmd2」とした場合は、 cmd1の戻り値が0の場合のみcmd2を実行します。 |
|
>>3738 zsh そして、make は成功時には 0 を、失敗時には 1 を返します。 # http://x68000.startshop.co.jp/~68user/unix/glossary.html#%CC%E1%A4%EA%C3%CD よって && でつなぐことで、 - configure でこけたら make 以降は行なわない - make でこけたら make install は行なわない という効果があるわけです。 |
|
Perl&CGIで授業の出席フォームを作成しようとしています。Perlは初心者です。 サーバーは、Windows2000+IIS+ActivePerl5.6.0で、ブラウザはIE6.0です。 クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。 inet_aton、gethostbyaddr、inet_ntoaの各関数を使ってIPアドレスを取得する コードを試しましたが、ブラウザIE6.0のプロキシ設定をしていれば、プロキシ のIPアドレスが取得でき、クライアントのIPアドレスが取得できません。もちろん プロキシの設定を外せば、クライアントのIPアドレスが取れます。プロキシを設定 した状態で、クライアントのIPアドレスを取得できる方法がありましたら、ご教示 ください。 |
|
>>3740 瓜倉 茂 > クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。 IP アドレスは $ENV{REMOTE_ADDR} で取得できますよね。FQDN (ホスト名) の 取得が目的ですか? それはそれとして、 > プロキシを設定した状態で、クライアントのIPアドレスを取得できる方法が > ありましたら、ご教示ください。 については >>3450 68user の「理屈的には、100% の精度の proxy 判定は不可能です」のくだりを 読んでください。 100% は無理と書きましたが、学内限定でなおかつあなたが管理者の立場なの であれば、必ず HTTP_X_FORWARDED_FOR を設定させるように proxy サーバの 設定変更するなどの手はあります。 ただ、根本的に信頼性がないので「web で出席を取る」という仕組みが妥当か どうかは微妙な気がします。 |
|
>>3733 68user 遅くなりました。すでに確認していただいているのですが。 >調べてみますが、 > - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?) > - OS 付属の FTP クライアントでは問題ないのか > - (インターネット上に公開されているサーバであれば) 相手のサーバ名 >を教えていただけると助かります。 あて先は、同じネットワーク内に存在するサーバです。同じくSolaris8です。 UNIXのftpコマンド、Windowsのツール(FFFTP)では問題なく動作します。 #ftpコマンドでPASVで送受信する方法を知らないんですね。。。 サーバ側の問題とも考えにくいです。 |
|
コマンドを&&でつなぐ件、勉強になりました。 ありがとうございます。 |
|
68user様 早速のご回答ありがとうございます。Perlの使い方で問題が解決するのかと 思ってましたが、ネットワーク経由だと他のところも絡んでくるのですね。 Webにこだわらないで、出席を取る問題を再考してみます。 |
|
marlboro様 先ほどのNo.3744の内容は、No. 3742のmarlboro様へのお礼でした。 あて先を間違い失礼しました。改めてmarlboro様の回答にお礼申し 上げます。 |
|
>>3742 marlboro ProFTPD を相手にすると再現することがわかりました (一番 最初に試すべきことでしたね)。 % time ./ftp-client -d anonymous foo@example.com ftp.proftpd.org /MIRMON.PROBE <-- 220 ProFTPD 1.2.10rc2 Server (proftpd.org Project) [81.223.20.36] --> USER anonymous <-- 331 Anonymous login ok, send your complete email address as your password. --> PASS foo@example.com <-- 230 Anonymous access granted, restrictions apply. --> PORT aaa,bbb,ccc,ddd,16,36 <-- 200 PORT command successful --> RETR /MIRMON.PROBE 1085749801 <-- 150 Opening ASCII mode data connection for /MIRMON.PROBE (11 bytes) (ここで6分待たされる) <-- 226 Transfer complete. --> QUIT <-- 221 Goodbye. 0.000u 0.005s 6:03.75 0.0% 0+0k 0+0io 0pf+0w 対策ですが、 http://x68000.startshop.co.jp/~68user/net/c-ftp-1.html の while (1){ int read_size; read_size = read(data_socket, buf, BUF_LEN); ... } の後に close(data_socket); を入れることで直るようです。 データコネクションはサーバ側から切ってくれると認識して いたのですが、間違いなのかもしれません。調査します。 ご指摘いただきありがとうございました。 > #ftpコマンドでPASVで送受信する方法を知らないんですね。。。 Solaris8 の ftp はカスなので、passive モードにできない と認識しています。GNU モノや BSD モノなら、passive でできます。 |
|
はじめまして。 ミラーリングの質問をさせていただきたいの ですが、solaris8 10/01で 内蔵ディスクをRAID1は一般的でしょうが、 RAID1+0(ミラー+ストライピング)を構成 するのはアリなのでしょうか? そもそもできるのでしょうか?? 危険・・・? ソフトはVeritasCSです。 VxVM VxFSも購入予定 標準内蔵DISKは73GBが6個で、 現状下記で振り分けようとしています。 disk1スライス: /(usr opt含む) , swap disk2スライス: /export/home , /work disk3,4でRAID1ミラーを予定だが、 RAID0+1が実は実現できそう・・・ |
|
LAN内だけで有効なドメイン名(hogehoge.example等)を使いたいのですが、 そういったことは可能でしょうか? 具体的にはLAN内のWEBサーバに名前でアクセスしたり、 LAN内のメールアドレスを作りたいのです。 なんだか、漠然とした質問で申し訳ありません。 このようなことができるのであれば、解説しているサイトや、 検索に有効なキーワードでも教えていただけると幸いです。 サーバ構成は以下のようになっています。 ・OS RedHat Linux8 ・MTA sendmail 8 ・DNS bind 9 ・MUA OutLook Express 6(Windows2000, XP Pro) WEBサーバにはローカルIPアドレスでアクセスし、 メールはWEBアプリからpostmaster@host.localdomainのように送信して、 POPはOutlook Expressで受信しています。 |
|
>>3748 hash > WEBサーバにはローカルIPアドレスでアクセスし、 > メールはWEBアプリからpostmaster@host.localdomainのように送信して、 > POPはOutlook Expressで受信しています。 度々すいません。 なんだか、意味のわからない文章になっていました。 現在は引用部分のように利用しているということです。 いろいろと面倒なので、何とかしたいと思って色々調べているのですが、 今のところ手がかりも見つからず質問させていただいた次第です。 |
|
>>3746 68user 興味があったので調べてみました。 現状のftp-client.cはデータコネクションでのデータ転送終了時にソケットのcloseを行っていないため、 サーバー側からのFIN-ACKパケットに対してFIN-ACKを送り返しません。 このため、データコネクションの切断について、クライアントからのFIN-ACKパケットを待つProFTPDと、 FIN-ACKパケットを特に待たない他のFTPDとの実装の差が、今回の問題であるプログラムの動作の差になっている ようです。 >データコネクションはサーバ側から切ってくれると認識していたのですが、間違いなのかもしれません。 データコネクションの切断はサーバー側から行います。原理的に考えても、ファイルやファイルリストのサイズを 送信前に調べることはできませんので、これは間違いありません。 「サーバー側から切断」とはつまりサーバー側からFIN-ACKパケットが送信されるということです。 この際にreadが0を返すので、プログラムはwhileループを抜けます。 ここにclose(data_socket);を追加するとFIN-ACKを返信するようになり、ProFTPDはデータコネクションの切断が 正常に行われたと考え、処理が進みます。 つまり、close(data_socket);を追加することは「切断をクライアント側から行う」ことにはなりません。 以上、まとまりがなく申し訳ありませんが、参考になれば幸いです。 |
|
初めて投稿します。 現在、sendmail 8.12.9 でSTARTTSLコマンドを有効にしてSSL接続を行っています。 デフォルトでは、SSLプロトコルバージョンは3.1です。これを、SSLプロトコル バージョン3.0にする必要があるため、プロトコルバージョンが3.1の実行ファイル と、3.0の実行ファイルを両方作成し、必要に応じて、実行ファイルを置き換えて、 sendmail を起動しなおして、sendmail に接続しています。 プロトコルバージョン3.0のものをコンパイルし、インストールした直後では、 正常にSSLプロトコルバージョンは3.0で通信できました。しかし、一旦、 SSLプロトコルバージョン3.1の実行ファイルに置き換えて起動し、数時間後に、 再度プロトコルバージョン3.0の実行ファイルで起動したところ、プロトコルバー ジョン3.0では通信できないというおかしな状況になってしまいました。 プロトコルバージョン3.0で、通信できずにエラーとなった時の、 /var/log/syslog に出力された、sendmail のエラーメッセージは以下の とおりです。 Jun 4 13:52:27 xxxx sm-mta[7195]: STARTTLS=server: 7195:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:290: プロトコルバージョン3.0にする方法は、SSL_CTX_new() の引数に、 サーバの時はSSLv3_server_method()、クライアントの時は、SSLv3_client_method()を指定するという方法で行っています。 SSLライブラリは、OpenSSL 0.9.6c[engine] を使用しています。 どなたか、原因や対応方法などわかる人がいたら、ご教示していただきたいと 思います。 よろしくお願いします。 |
|
お世話になります。 solaris9のx86版で、syslogの設定について質問なのです。 inetdから起動されるデーモンで、 クライアントのIP等の情報を/var/adm/messagesに出力させるには、 /etc/init.d/inetsvc内の最後を、「/usr/sbin/inetd -s -t」として、 マシンを再起動すれば良いらしいのですが、そのようにしてからtelnetで試したところ、 どうしてもログに出力されません。 /etc/syslog.confの設定はデフォルトのままで、 「*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages」 の設定はコメントアウト等されていません。 他に何か設定すべき場所等ありますでしょうか? 宜しくお願い致します。 |
|
>>3752 bon /etc/default/inetdに ENABLE_CONNECTION_LOGGING=YES の指定が必要です。 |
|
>>3748 hash >WEBサーバにはローカルIPアドレスでアクセスし、 >メールはWEBアプリからpostmaster@host.localdomainのように送信して、 >POPはOutlook Expressで受信しています。 これが今の運用だとすると、 postmaster@host.localdomain と指定している時点でローカルのドメインを使えているように見えますが・・・ クライアントからホスト名でアクセスするだけだったら hostsファイルに指定してやれば良い気がします。 |
|
>> 3753 zsh様 やっと動きました! ありがとうございました。 |
|
>>3746 68user ありがとうございました。 動作確認できました。やはり6分待たされるんですよね。 >ProFTPD を相手にすると再現することがわかりました (一番 >最初に試すべきことでしたね)。 最初にお伝えするべきでした。 |
|
>>3747 kouzu > RAID1+0(ミラー+ストライピング)を構成するのは > アリなのでしょうか? わかりません。RAID1 しかやったことがないです。 システム領域は RAID1 しか対応していないミドルウェアも あるようですのでね。どう考えてもお仕事なようですから、 素人のアドバイスなど聞かず、まずは Veritas 社に問い 合わせることをお勧めします。 >>3750 金床 なるほど、勉強になります。サーバプログラムの書き方の違いとしては、 クライアントの FIN-ACK を待たない ⇒ close か、shutdown(fd, SHUT_RDWR) クライアントの FIN-ACK を待つ ⇒ shutdown(fd, SHUT_WR) して、read が 0 を返すのを待つ てな感じなんでしょうかねぇ。 >>3751 TSURU 単に 3.0 サーバに 3.1 プロトコルでお話しているということは ないですよね? tcpdump や ethereal などでプロトコルバージョンを 確認しても間違いはありませんか? SMTP over TLS は使ったことがないため、たいしたことは言えなくて 申し訳ないです。 |
|
>>3751 TSURU こんばんは。 V3.0で通信できない、という件ですが、設定方法を変えたら、正常にV3.0で通信 できるようになりました。 具体的には、sendmail.cfにて、CipherList を設定する方法で、できるように なりました。 お騒がせしました。 68userさん、レスをいただきありがとうございます。 ありがとうございました。 |
|
>>3758 TSURU V3.0 と V3.1 で sendmail.cf を共用にしていたため、 V3.1 でしか使用できない Cipher を V3.0 で使おうとして エラーになっていた、ということでしょうか? |
|
>>3759 68user いや、それはないと思います。 sendmail.cfファイルも、V3.0用とV3.1用で別々に作成して、置き換えて使っています。 僕も、それほどSSLについて詳しいわけではありませんが、 SSLプロトコルバージョンと暗号化アルゴリズム(Cipher)は、直接は関連性はないように 思います。 おそらく、この認識で合っているとは思いますが。 |
|
>>3760 TSURU SSL3.0 と TLS1.0 (≒SSL3.1) の仕様上は、使用できる暗号 スイートに違いがあります。たとえば SSL3.0 では FORTEZZA が使用できましたが、TLS1.0 では削除されました。また、AES 関連の暗号スイートについては、TLS のみに追加されました。 今後も新規暗号スイートは TLS のみに追加されていくでしょう。 http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt http://www21.ocn.ne.jp/~k-west/SSLandTLS/draft302-Ja.txt http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc3268-Ja.txt # ただし実装においては SSL3.0 と TLS1.0 はコードを共有して # いるでしょうから、もしかしたら SSL3.0 で AES が使用できる # ような実装もあるのかもしれません。 よって、暗号スイートの違いから接続がうまくいかなかったのでは ないかと考えた次第です。 後学のために教えていただきたいのですが、 >>3758 TSURU > sendmail.cfにて、CipherList を設定する方法 何と書くとうまくいかなくて、何と書くとうまくいったのか お教えいただけますか? |
|
>>3761 68user 1.通信できなかった場合 sendmail.cfで、CipherList は特に設定していない。 また、SSL_CTX_new() の引数にSSLv3_server_method()、 又は、SSLv3_client_method()を指定する。 この方法だと、通信できなくなった。 2.通信できた場合 sendmail.cfで、CipherList に、DEFAULT:+SSLV3 を指定する。 また、SSL_CTX_new() の引数にSSLv23_server_method()、 又は、SSLv23_client_method()を指定する。 (つまり、sendmail のソースコードをいじらないままの状態です。) この方法で、正常に通信できるようになりました。 |
|
どなたかご教授下さい。 すでに動いているSolaris8の機器に新規Diskを追加し、Formatコマンドでパーティション切って、 labelしたあとにリブートする必要はありますか? リブートしないと反映しないのですかね? リブートは必要ないと思っていますが。。 |
|
>>3762 TSURU ありがとうございます。暇を見つけて試してみたいと思います。 >>3763 aits リブートして /etc/vfstab の内容が正しいことを検証しておく 方がよいと思われますが、リブートが必須かどうかと問われれば、 必須ではありません。リブートせずに、そのまま mount できます。 |
|
>>3757 68user >サーバプログラムの書き方の違いとしては、 > クライアントの FIN-ACK を待たない > ⇒ close か、shutdown(fd, SHUT_RDWR) > クライアントの FIN-ACK を待つ > ⇒ shutdown(fd, SHUT_WR) して、read が 0 を返すのを待つ > てな感じなんでしょうかねぇ。 ProFTPDのソースを見てみました。ご指摘の通り、 shutdown(fd, SHUT_WR) になっていました。 #実際にはSHUT_WRはハードコーディングされて1になっていましたが shutdown後にreadしているかどうかまでは追えていません。 時間があるときにコードを書いてshutdownの動作を確かめてみたいと思ってます。 ちなみにProFTPDのこの部分を shutdown(fd, SHUT_RDWR) に変えてみたところ、closeを追加しないftp-client.cでも処理が止まらずに進むことを確認できました。 |
|
unix上でzip圧縮した際にパスワードを設定したいのですが、 どなたかご存知な方いらっしゃいいますか? windowsだと基本的にzip圧縮の際にパスワードを設定できるように なっているのですが・・・。 一応manコマンドで調べると-eという暗号化のオプションが存在する ようなのですが出来ません。 環境はsolarisです。よろしくお願いします。 |
|
>>3754 zsh > クライアントからホスト名でアクセスするだけだったら > hostsファイルに指定してやれば良い気がします。 お返事ありがとうございます。 全クライアント(Win2000)のhostsファイルを変更するのは 大変(そんなに数はないのですが)なのでDNSにローカルのbindを指定して使っています。 ということは、bindのゾーン設定が悪いんですね。 とりあえず切り分けができたのでもう少し試行錯誤してみます。 報告できるようなことがあれば、また報告させていただきたいと思います。 ありがとうございました。 |
|
>>3766 初心者 $zip -e out.zip target.o Enter password: Verify password: adding: target.o (stored 80%) で出来ました。 RedHatですが、同じだと思います。 |
|
>>3766 初心者 > unix上でzip圧縮した際にパスワードを設定したいのですが、 Solaris 標準の zip は、おそらく暗号化ライブラリなしで コンパイルされていると思うんですよね。たぶん。 FreeBSD の ports http://www.jp.freebsd.org/cgi/cvsweb.cgi/ports/archivers/zip/Makefile?rev=1.29 を参考に、zcrypt29-exportable.zip を持ってきたり、 -DUSE_CRYPT を指定したりして自分でソースからコンパイル すれば大丈夫でしょう。 もしかしたら SunSite http://sunsite.tus.ac.jp/sun/solbin/ のバイナリパッケージが暗号化機能付きでコンパイルされて いるかもしれません (試していません)。 |
|
>>3769 68user Solaris標準・SunSiteのバイナリパッケージ共に暗号機能なしのようです。 |
|
Servlet を C の exe からソケットを使って起動させようとしているのですが うまく起動しません。 どなたかわかる方はいませんか? |
|
>>3771 den 情報不足です。 http://www.hyuki.com/writing/techask.html を読んでください。 |
|
日記。 今日は http://www.amazon.co.jp/exec/obidos/ASIN/475614389X/qid%3D1087134585/249-1275008-5298706 プログラミングテクニック - UNIXコマンドのソースコードにみる実践プログラミング手法 (UNIX MAGAZINE COLLECTION) を買いました。UNIX MAGAZINE に連載されていた記事をそのまま まとめただけですが、これでたまっていた UNIX MAGAZINE を捨て られるので、部屋が狭い人にはお勧めです。 ただ、この人の書く文章にはおもしろみのかけらもなく、全く読む 気にならないのが残念なところ。プログラミングって こんなに つまらないものだったかなぁ、と思えることうけあいです。 |
|
日記 2。 久々に whois.cgi なぞを触っていたら、FreeBSD 5.2.1-RELEASE の /usr/bin/whois は、いちいち NIC (Network Information Center) を 指定しなくても、 % whois u-tokyo.ac.jp で情報を参照できる。昔は % whois -h whois.nic.ad.jp u-tokyo.ac.jp としなくてはならなかったはずなのに何故? と思ってソースを読んだ 結果、 xxx.whois-servers.net (例えば TLD が jp だったら jp.whois-servers.net)。 の CNAME を引っ張ると、whois.nic.ad.jp が返ってくるので、 そこに再接続すればよいらしい。 あるいは % whois -h jp.whois-servers.net u-tokyo.ac.jp とすると whois-servers.net が proxy となって whois.nic.ad.jp から勝手に情報を取得してくれるようだ。 whois-servers.net に対応したのは、FreeBSD 4.0-RELEASE・ FreeBSD 3.4-RELEASE から。 http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/whois/whois.c |
|
dateコマンドでは、最大何日前までの日付計算が行えるのでしょうか? 教えてください。 |
|
Solaris(UNIX)でフォルダの削除が行えません。 rmdir フォルダ名のコマンドでは「ディレクトリが存在しません。」 のメッセージがでます。CPコマンドで同じフォルダを同じ場所にコピーすると 同じ名前のファルダが2つできてしまいます。 このフォルダの消し方をどなたか教えていただけないでしょうか。 |
|
>>3776 yoko こんばんは。 rm -r <ディレクトリ名> で削除できませんか? |
|
ソースを載せます。 //*************************************************************** // From the book "Win32 System Services: The Heart of Windows 95 // and Windows NT" // by Marshall Brain // Published by Prentice Hall // // Copyright 1995, by Prentice Hall. // // This code implements a TCP sender. //*************************************************************** // ssipsend.cpp #include <windows.h> #include <iostream.h> #include <winsock.h> #define NO_FLAGS_SET 0 #define PORT (u_short) 8080 #define DEST_IP_ADDR "127.0.0.1" #define MAXBUFLEN 256 INT main(VOID) { WSADATA Data; SOCKADDR_IN destSockAddr; SOCKET destSocket; unsigned long destAddr; int status; int numsnt; char toSendtxt[3][256]; int numrcv; char buffer[MAXBUFLEN]; strcpy( toSendtxt[0], "GET http://localhost:8080/example00/HitTime?userid=1207&date=20004/06/11%2008:30:00 HTTP/1.1\r\n" ); strcpy( toSendtxt[1], "Host: localhost:8080\r\n" ); strcpy( toSendtxt[2], "\r\n" ); /* initialize the Windows Socket DLL */ status=WSAStartup(MAKEWORD(1, 1), &Data); if (status != 0) cerr << "ERROR: WSAStartup unsuccessful" << endl; /* convert IP address into in_addr form */ destAddr=inet_addr(DEST_IP_ADDR); /* copy destAddr into sockaddr_in structure */ memcpy(&destSockAddr.sin_addr, &destAddr, sizeof(destAddr)); /* specify the port portion of the address */ destSockAddr.sin_port=htons(PORT); /* specify the address family as Internet */ destSockAddr.sin_family=AF_INET; /* create a socket */ destSocket=socket(AF_INET, SOCK_STREAM, 0); if (destSocket == INVALID_SOCKET) { cerr << "ERROR: socket unsuccessful" << endl; status=WSACleanup(); if (status == SOCKET_ERROR) cerr << "ERROR: WSACleanup unsuccessful" << endl; return(1); } cout << "Trying to connect to IP Address: " << DEST_IP_ADDR << endl; /* connect to the server */ status=connect(destSocket, (LPSOCKADDR) &destSockAddr, sizeof(destSockAddr)); if (status == SOCKET_ERROR) { cerr << "ERROR: connect unsuccessful" << endl; status=closesocket(destSocket); if (status == SOCKET_ERROR) cerr << "ERROR: closesocket unsuccessful" << endl; status=WSACleanup(); if (status == SOCKET_ERROR) cerr << "ERROR: WSACleanup unsuccessful" << endl; return(1); } cout << "Connected..." << endl; int idx = 0; while(1) { Sleep(1000); cout << "Sending..." << endl; numsnt=send(destSocket, toSendtxt[idx], strlen(toSendtxt[idx]) + 1, NO_FLAGS_SET); if (numsnt != (int)strlen(toSendtxt[idx]) + 1) { cout << "Connection terminated" << endl; status=closesocket(destSocket); if (status == SOCKET_ERROR) cerr << "ERROR: closesocket unsuccessful" << endl; status=WSACleanup(); if (status == SOCKET_ERROR) cerr << "ERROR: WSACleanup unsuccessful" << endl; return(1); } idx++; if(idx>2){ break; } /* Wait before sending the message again */ //Sleep(4800); } /* while */ return 0; } それほど難しいことはしていないはずなのですが... よろしくお願いします。 |
|
>> 3771 Servletって、JavaのServletのことですよね? なぜ、わざわざCのプログラムからServletを起動する必要があるのですか? そこが分かりません。 |
|
>>3776 yoko ディレクトリを作成した時にディレクトリ名にスペースとか コントロールコード(^hとか)が入ってしまったってことはないですか? とりあえず そのディレクトリ上位の階層でls -l > hoge.lst としてvi hoge.lst を表示もしくはod -x hoge.lstあたりで 確認されてみてはいかがでしょうか? 外してしたらスミマセン |
|
>> 3779 TSURU なぜ、わざわざといわれるとどう答えていいのかわからないのですが。 サーブレットは、起動されるとデータベースに時刻を登録するようにできています。 それでタイムカードのように出社時間と退社時間を記録してゆこうとしているのです。 そのときにわざわざブラウザを立ち上げてフォームのボタンを押してサーブレットを 起動するのは面倒らしいので、スタートアップにEXEをと登録して、 パソコンが起動するとサーブレットを呼び出すようにしようとしています。 という回答でよいでしょうか。 よろしくお願いします。 |
|
>> 3779 TSURU ちなみになぜ、Cでやろうとしているかというと、Java だと各パソコンに JREをインストールしてやらなければならないかなと思っているので それが面倒なのでCを使おうとしています。 |
|
>>3775 kiyo > dateコマンドでは、最大何日前までの日付計算が行えるのでしょうか? FreeBSD の date は 1900 年まででした。他の OS でも、time_t の仕組みに のっけているなら、同じでしょうね。てゆーか OS 名くらい書きましょうね。 >>3776 yoko > Solaris(UNIX)でフォルダの削除が行えません。 ファイルの特定方法もいろいろあるので参考にしてください。 http://www.jp.freebsd.org/QandA/HTML/1671.html >>3778 den > ソースを載せます。 どこでどういうふうにエラーになるんですか? 「うまく起動しません」 とはどういう意味ですか? OS は? ブラウザで該当 URL を見ると正しく 記録されるのですか? …などという点が情報不足なのですよ。期待した結果と実際の結果を書けと http://www.hyuki.com/writing/techask.html にもあったはずです。 ソースをざっと見た感じでは怪しげなところはないように見えますが、 わたしの手元に Windows 開発環境がなくコンパイルできないので、 どなたかコンパイルして検証できる環境をお持ちの方がいらっしゃい ましたらよろしくお願いします。 >>3779 TSURU > なぜ、わざわざCのプログラムからServletを起動する必要があるのですか? C で HTTP クライアントを作るって話なので、別に変ではないです。 |
|
OS は、クライアント、サーバともに Windows 2000 Professtional 又は Windows XP Professtional です。 Tomcat は、Tomcat/4.1.27 です。 サーブレットに動作したことがわかるようにコンソールへの出力が組み込んであるので 起動したことは、コンソールを見るとわかるようになっています。 ブラウザでサーブレットの URL をたたいた場合は、ちゃんとコンソールへの 出力がでて、起動していることがわかります。 |
|
>> 3783 HTTP は、ここで改行しないとダメだとかこういう順番でテキストを 送らないとダメだとかどういうルールがあるのでしょうか? |
|
>> 3783 改行を入れるようにしたらレスポンスは返すようになってのですが、 やはりサーブレットは起動しません。 OS は、サーバ、クライアントともに Windows 2000 Professtional か Windows XP Professtional です。 Tomcat は、Apache Tomcat/4.1.27 です。 起動するというのは、コンソールに文字が出力されるということです。 ブラウザで同じことをした場合は、ちゃんと起動します。 |
|
>> 3783 レスポンスは、 HTTP/1.1 505 HTTP Version Not Supported Content-Type: text/plain Date: Tue, 15 Jun 2004 06:24:28 GMT Server: Apache Coyote/1.0 Connection: close ・・・・・・ です。 |
|
>> 3783 リクエストの2行目の strcpy( toSendtxt[1], "Host: localhost:8080" ); を削除したらうまく行きました。 どうもありがとうございました。 |
|
>>3786 den > 改行を入れるようにしたらレスポンスは返すようになってのですが、 全くついていけません。具体的にどこをどういうふうに修正したんですか? ふと思いましたが、 >>3778 den > numsnt=send(destSocket, toSendtxt[idx], > strlen(toSendtxt[idx]) + 1, NO_FLAGS_SET); この +1 は不要では? |
|
はじめまして。まだ初めて1ヶ月の初心者です。 すいませんがどうしてもエラーメッセージの意味がわからないので、教えていただかないでしょうか? OSはSolarisの5.8です。 -------------------------------------------------------------------------------- ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS 6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます 。それ以外は無視されます ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 -------------------------------------------------------------------------------- というものでした。特にldというものがいまいち理解できないのですが、ぜひとも教えてただければと思います。よろしくお願いします。 |
|
>> 3786 HTTP 1.0 以降では、ヘッダと本文を空行で分けているらしく、その空行が ないためにレスポンスがないことがわかりました。 その後、HTTP Version Not Supported というレスポンスが返されるだけ だったのですが、リクエストを "POST <<URL>> HTTP1.1" と空行だけに したところちゃんとしたレスポンスを返すようになりました。 |
|
>>3783 68user >C で HTTP クライアントを作るって話なので、別に変ではないです。 いえ、僕は、サーバ上にある、Servletのプロセスを起動する処理を Cのプログラムの中で実装する話だと思ってしまったので、 おかしいと思ったんですよ。 |
|
denさんへ 根本的な話をしていいですか? >>3781 den の発言を読むかぎりでは、denさんのやりたいことは、 出社時間と退社時間を記録したいということですよね。 それだけのために、なぜサーブレットが必要になるんですか? そこが分からないんですよ。 出社時間と退社時間を記録するだけだったら、別にサーブレット を使わなくても、方法はいくらでもありますよね。 どうしてもサーブレットじゃないとだめなんですか? でも、もうできたんですよね。 だったら、無理に他の方法でやれとは言いませんが、 ただ気になったので、書いてみました。 |
|
denさんへ >>3793 TSURU の書き込みは、べつにあげあしとりとか、意地悪をするために書いたのではありません。 あくまで、単に疑問に思ったことを書いただけですので、くれぐれも誤解なきよう お願いします。 |
|
>> 3793 話がややこしくなりそうなのであまり追求しようとは思わないのですが、 サーブレット以外にもやり方はあると思います。 ただインターネットエクスプローラから時間の記録ができたら便利かなと思って そのようにしました。 でも仮で運用しているとそれでは使いづらいといわれてしまったので、 既存のサーブレットを利用して、C で起動する処理を作って済まそうと 思ったわけです。 サーブレットは、HTTPのリクエストをサーブレットコンテナが受信すれば 起動されるのでサーブレットを起動するには、HTTPクライアントとして リクエストを送るだけでいいのです。 どうもありがとうございました。 |
|
>>3795 den なるほど。 細かい事情は分かりませんが、サーブレットを起動することで 済ませたかった訳ですね。 ゼロから実装するより、既存のもので済ませた方がずっど楽ですからね。 分かりました。 |
|
>>3776 yoko 返事遅くなりました。No.3776 yokoです。 No. 3783 # 68user No. 3780 # とーりすがり No. 3777 # TSURU さん、レスありがとう。 ls -l > hoge.lst で調べるとtest^Mといった(^M)がついていました。 原因は分かりましたが、まだ格闘中です。 rm -r test^M rm -r 'test^M' rmdir 'test^M' でも消えないんですよね。 rm-r |
|
>>3776 yoko 3776で投稿した yokoです。 rm -r test^Mで消えませんでしたがrm -r test*で消す事ができました。 皆さん、 ありがとうございました。 |
|
RSA暗号についての質問なんですが、公開鍵とモジュロは分かるんですよね。 それならば、どういう頻度で循環しているか分かってしまうのではないでしょうか? 循環する頻度と公開鍵があれば秘密鍵も分かってしまうのでは・・? |
|
>>3790 どら まず、以下の質問に答えてください。 - gcc をインストールしていますか? - Sun のコンパイラをインストールしていますか? (/opt/SUNWspro/bin/cc などが存在しますか?) - which cc と which ld の結果は? - echo $PATH の結果は? - 「あなたは」どのコンパイラを使ってコンパイルしようとしていますか? (gcc or Sun の cc) - 実際に使用されていると思われるのはどのコンパイラですか? また、その根拠は? >>3797 yoko > ls -l > hoge.lst で調べるとtest^Mといった(^M)が > ついていました。 ^M はエスケープシーケンス \r (0x0d) です。シェルから 入力する場合は sh なら % rm test(Ctrl-v Ctrl-m) tcsh なら % rm test(Ctrl-v Ctrl-j) とします。csh はどっちだか知りません。 ところでなぜ tcsh は Ctrl-j が ^M で、Ctrl-m が ^J なんでしょうね? >>3799 kou > RSA暗号についての質問なんですが、公開鍵とモジュロは分かるんですよね。 > それならば、どういう頻度で循環しているか分かってしまうのではないでしょうか? えーと、そういうことはないんですが、何と説明すればよいか わかりません。 秘密鍵: e, n 公開鍵: d, n 暗号化: (平文^e)%n 復号化: (暗号文^d)%n として、今、平文と e が不明だとします。何をどうすると、 何がどういうふうに循環すると考えておられますか? なお、(平文^e)%n という操作は単射です。つまり異なる平文が 同じ値になることはありません。 もし数学的に厳密な証明を期待しておられるなら、わたしには その能力がないので、 http://www.faireal.net/ での質問をお勧めします。 |
|
>>3800 68user 68userさん、レスありがとうございます。 質問に答えさせていただきます。 (1)gcc をインストールしていますか? gccというもの自体はわかりませんが、fccとccはインストールしてあるみたいです。(すいません、学校のものなので・・・) (2)Sun のコンパイラをインストールしていますか? (/opt/SUNWspro/bin/cc などが存在しますか?) /opt/SUNWspro/bin/ccはディレクトリの中にありました。 (3)which cc と which ld の結果は? which cc:/usr/ucb/cc which ld:/usr/ucb/ld という結果でした。 (4)echo $PATH の結果は? /bin /usr/bin /usr/ucb /etc /opt/SUNWspro/bin /opt/FSUNf90/bin /disk2/user/md/gnuplot という結果でした。 (5)「あなたは」どのコンパイラを使ってコンパイルしようとしていますか? (gcc or Sun の cc) いままでの練習ではccでコンパイルしていました。これからもccでコンパイルするつもりです。 (6)実際に使用されていると思われるのはどのコンパイラですか? また、その根拠は? 上にも書きましたが、いままではccのコンパイラでコンパイルしていたので、ccのコンパイラだと思います。 さきほどgccについて調べた所、GNUが関連しているみたいでした。これから先にGNUplotを使用してグラフも書きたいと思っているのですが、 それについても何かアドバイスをいただければありがたいと思います。よろしくお願いします。 |
|
>>3801 どら あらそうですか。予想と外れていたのでもうひとつ追加で質問。 >>3790 どら > ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:... ここだけでなく、コンパイルしてからコンパイルが終わるまで全ての 部分を見せてください。Makefile を使っているにせよ、自分でタイプ したにせよ、とにかく全部見せてください。 > これから先にGNUplotを使用してグラフも書きたいと思っているのですが、 紛らわしいですが、gnuplot は GNU とは関係ありません。 GNU というのは、フリーなソフトウェアが大好きな FSF という団体が提唱するソフトウェアのライセンス方式の ことを指します。gcc も GNU ライセンスで配布されています。 しかし gnuplot はそうではありません。 あと、gcc と gnuplot は関係ないです。gcc はコンパイラ。 gnuplot はグラフ描画ソフト。 |
|
はじめまして、こんにちは。いきなりで非常に申し訳ないのですが、socketのインクルードファイルはどこでダウンロードしたらいいのでしょうか?もしくは、どのOSになら入っているのでしょうか? |
|
>>3803 鼈 わたしの知る限りでは、UNIX 系であれば標準で入っています。 Windows 系であれば、VC++ や C++ Builder などのコンパイラに 添付されているのかな? |
|
UNIXの<sys/socket.h>の様なファイルは windowsでどこにあるのですか windowsで<sys/socket.h>をインクルードしてもファイルが開けない というようなメッセージがでてしまいます。 |
|
> 秘密鍵: e, n > 公開鍵: d, n > 暗号化: (平文^e)%n > 復号化: (暗号文^d)%n > >として、今、平文と e が不明だとします。何をどうすると、 >何がどういうふうに循環すると考えておられますか? nを生成するのがp,qで、それらの最小公倍数がe,dだという私の認識自体が間違っていたのでしょうか^^; 一定の頻度で循環しているから、それ以内の適当な数eでべき乗しても補完関係にあるd(最小公倍数-e)で復号化できる。 平文に「1,2,3・・」といった具合に数を代入していけば循環周期が分かるのでは?と思ったのです |
|
>>3805 蒲鉾 > UNIXの<sys/socket.h>の様なファイルはwindowsでどこにあるのですか winsock.h ですが、Windows の場合は他にもいろいろと書き方が 異なります。「winsock」で検索して、よさそうなサンプルを 探してください。 もっとも信頼できると思われるサンプルは http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/ でしょうが、ライブラリ化してあるのでわたしは初心者には わかりやすいとは思いませんが、もし理解できるならこれを 参考にするのがよいでしょう。 >>3806 kou > nを生成するのがp,qで、それらの最小公倍数がe,d 誤りと思われます。 http://x68000.startshop.co.jp/~68user/net/crypt-2.html の「RSA の本当のところ」を読んでください。 もう少し正確に、かつ数学的に書くと、 p,q: 素数 n: n=pq e: 1<e<(p-1)(q-1) かつ gcd(e, (p-1)(q-1))=1 を満たす自然数 d: 1<d<(p-1)(q-1) かつ de≡1 (mod (p-1)(q-1)) を満たす自然数 として求めます。 # gcd(e, (p-1)(q-1))=1 は、e と (p-1)(q-1) が共通の約数を持たないということ。 # de≡1 (mod (p-1)(q-1)) は、d*e を (p-1)(q-1) で割った余りが 1 であるということ。 |
|
>>68user 何度もありがとうございます。 “ex3-2.c”というファイルを“keisan3-2”としてコンパイルした結果を載せさせていただきます。 -------------------------------------------------------------------------------- tds1% cc -o keisan3-2 ex3-2.c ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS 6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます 。それ以外は無視されます "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 --------------------------------------------------------------------------------- 以前実行した時はうまくいったのですが、いつの間にかできなくなりました。 あと、上の文章の中で“16行目:〜ありません”という警告文もどのプログラムにも発生するみたいです。(この警告も以前はありませんでしたし、ファイルの中身はかえてないはずです。) 一応、簡単な文章でもうしわけないのですが、プログラムも載せさせていただきます。(教科書のコピーです…) --------------------------------------------------------------------------------- /* 【例題3.2】 rei3_2 */ #include <stdio.h> main() { int a,b; printf("異なる2つの整数を入力してください--->"); scanf("%d %d",&a,&b); if(a > b) printf("%d --- BIG\n",a); else printf("%d --- BIG\n",b); return(0); } ----------------------------------------------------------------------------------- よろしくお願いします。 |
|
>>3808 どら たびたびすみませんが、 % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.c の結果 (全文) を教えてください。 あと、env の結果も教えてください。ホスト名やログイン名などを 公開するのが嫌なら、適当に削ってから提示してください。 これ以上引っ張ると怒られそうなので、一部回答しておきますが、 > ucbcc: 警告: ld が起動される場合は、... 無視されます > ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 これは警告なので、実行には支障がないはずです。keisan3-2 が 生成されていませんか? > "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません これは文字通り、ファイルの最終行が改行コードが付いて いないのでしょう。ファイルの最終行の末尾で改行してください。 ファイル末尾に改行がないとその行を読んでくれないプログラムも あるので、改行をつける癖をつけておくことをお勧めします。 |
|
>>3809 68user 何度もありがとうございます。このミスが見つからないと先に進みづらいので、教えていただけるのなら、どれだけ質問されても怒ったりしません。むしろどれだけでも聞いてください。お願いします。 % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.cの結果を下に書きます。 ------------------------------------------------------------------------------ + [ -f /usr/ccs/bin/ucbcc ] + [ 4 -eq 0 ] UCB_LIB_DIR=/usr/ucblib CCS_LIB_DIR=/usr/ccs/lib USR_LIB=/usr/lib TYPE= dopt= cgdir= + [ x = x ] LD_RUN_PATH=/usr/ucblib + export LD_RUN_PATH + [ = -Bstatic ] LIBS=-lucb -lsocket -lnsl -lelf -laio + + awk/usr/bin/ls -ln /usr/ccs/bin/ucbcc{print $11} cclink=/opt/SUNWspro/WS6U2/bin/acc + /usr/bin/dirname /opt/SUNWspro/WS6U2/bin/acc ccdir=/opt/SUNWspro/WS6U2/bin + [ != ] nccdir=/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin LD_LIBRARY_PATH=/usr/ucblib:/usr/ccs/lib:/usr/lib + export LD_LIBRARY_PATH + /usr/ccs/bin/ucbcc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SU NWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude -lucb -lsocket -lnsl -lelf -laio ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS 6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます 。それ以外は無視されます ### コマンド行ファイルおよびオプション (展開済み): ### -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude -lucb -lsocket -lnsl -lelf -laio ### ucbcc: 注釈: LM_LICENSE_FILE = (null) ### ucbcc: 注釈: NLSPATH = /opt/SUNWspro/WS6U2/bin/../lib/locale/%L/LC_MESSAGES/ %N.cat:/opt/SUNWspro/WS6U2/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat /usr/ccs/lib/cpp -undef -D__SunOS_5_8 -D__SUNPRO_C=0x510 -Dunix -D__unix -Dsun - D__sun -D__BUILTIN_VA_ARG_INCR -D__SVR4 -Dsparc -D__sparc -I/usr/ucbinclude ex3- 2.c >/tmp/cpp.20856.0.i /opt/SUNWspro/WS6U2/bin/acomp -Qy -y-o -yex3-2.o -I/usr/ucbinclude -g "/opt/SUNW spro/WS6U2/bin/acc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNW spro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -I/usr/ucbinclude -c" -b -y-fbe -y/opt/ SUNWspro/WS6U2/bin/fbe -y-xarch=generic -y-xmemalign=4s -y-verbose -Xs -D__SunOS _5_8 -D__SUNPRO_C=0x510 -Dunix -Dsun -Dsparc -D__unix -D__sun -D__sparc -D__BUIL TIN_VA_ARG_INCR -D__SVR4 -y-s -I/opt/SUNWspro/WS6U2/include/cc -i /tmp/cpp.20856 .0.i "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません rm /tmp/cpp.20856.0.i ### ucbcc: 注釈: LD_LIBRARY_PATH = /usr/ucblib:/usr/ccs/lib:/usr/lib ### ucbcc: 注釈: LD_RUN_PATH = /usr/ucblib ### ucbcc: 注釈: LD_OPTIONS = (null) /usr/ccs/bin/ld -o keisan3-2 /opt/SUNWspro/WS6U2/lib/crti.o /opt/SUNWspro/WS6U2/ lib/crt1.o /opt/SUNWspro/WS6U2/lib/values-xs.o -Y P,/opt/SUNWspro/WS6U2/lib:/usr /ccs/lib:/usr/lib -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/ WS6U2/bin:/usr/ccs/lib:/usr/lib ex3-2.o -lucb -lsocket -lnsl -lelf -laio -lc /op t/SUNWspro/WS6U2/lib/crtn.o ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 rm ex3-2.o ret=0 + exit 0 ------------------------------------------------------------------------- envの結果も書かせていただきます。 ------------------------------------------------------------------------- HOME=/disk2/user/md PATH=/bin:/usr/bin:/usr/ucb:/etc:/opt/SUNWspro/bin:/opt/FSUNf90/bin:/disk2/user/ md/gnuplot:. LOGNAME= HZ=100 TERM=vt100 TZ=Japan SHELL=/bin/csh MAIL=/var/mail/md LANG=ja _INIT_NET_STRATEGY=none _INIT_PREV_LEVEL=S _INIT_RUN_LEVEL=3 _INIT_RUN_NPREV=0 _INIT_UTS_ISA=sparc _INIT_UTS_MACHINE=sun4u _INIT_UTS_NODENAME= _INIT_UTS_PLATFORM=SUNW,Sun-Blade-1000 _INIT_UTS_RELEASE=5.8 _INIT_UTS_SYSNAME=SunOS _INIT_UTS_VERSION=Generic_108528-27 PWD=/disk2/user/md USER=md LD_LIBRARY_PATH=/opt/FSUNf90/lib:/opt/SUNWspro/lib MANPATH=/opt/FSUNf90/man:/opt/SUNWspro/man ------------------------------------------------------------------------- という結果でした。 >>ucbcc: 警告: ld が起動される場合は、... 無視されます >>ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 >これは警告なので、実行には支障がないはずです。keisan3-2 が >生成されていませんか? はい、ファイルはできています。実行すれば結果も出力されています。ただ、毎回この警告文がでていて、どれぐらい問題なのかどうかもわからないので、できるかぎり問題を取り除くことと、その理由が知りたいので… >ファイル末尾に改行がないとその行を読んでくれないプログラムも >あるので、改行をつける癖をつけておくことをお勧めします。 初めてしりました。ありがとうございます。気をつけます。 あと、もしお手数でなければ、今までされた質問の意図を教えていただければありがたいと思うのですが…手間がかかるようでしたら全然かまいませんので、よろしくお願いします。 それではまたよろしくお願いします。 |
|
>>3810 どら 結局、よくわかりませんでした。 Solaris の /usr/ucb/cc はシェルスクリプトで、/usr/ccs/bin/ucbcc を起動しています。/usr/ccs/bin/ucbcc は /opt/SUNWspro/WS6U2/bin/acc へのシンボリックリンクになっているはず。ですから、 ucbcc: 警告:... というのは acc が出力しているわけです。 コンパイラは http://x68000.startshop.co.jp/~68user/unix/pickup?gcc にあるように、プリプロセス・コンパイル・アセンブル・リンクという ステップを踏みます。提示していただいた例だと、最初に /usr/ccs/bin/ucbcc (実体は /opt/SUNWspro/WS6U2/bin/acc) が実行され、それが /usr/ccs/lib/cpp (プリプロセッサ) /opt/SUNWspro/WS6U2/bin/acomp (コンパイラ) /usr/ccs/bin/ld (リンカ) を順次起動しています。 # この場合、アセンブルはコンパイラの中で行われています。 で、 ucbcc: 警告: ld が起動される場合は、オプション .. は ld に渡されます。... というのは、最初に起動された ucbcc が -YP,.. というオプションを 理解できなかったため、 「わたしの知らないオプションだけど、今から起動する ld ならこの オプションを理解できるかもしれないので、ld に -YP を渡します」 と言っているわけです。ただし、cc に -c オプションをつけたりすると リンクは行われないため、そういうときに備えて 「ld を実行しないようなオプションを指定された場合は ld が 実行されないので、結果的に -YP オプションは無視されます」 とも言ってます。 で、 > ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 についてですが、-YP オプションは ld に渡されます。実行結果を 見るとなぜか /usr/ccs/bin/ld に -YP が 2つ渡されてしまって います。-YP オプションは、ライブラリを検索するディレクトリを 指定するものなので、ld は 「ライブラリを検索するディレクトリが 2つ指定されているので、 後の方を無視して、最初の方を使います」 と警告しています。 なぜ -YP オプションが複数渡されるのかを知りたいため、-v オプションを つけてもらったり、env で環境変数を見せてもらったりしましたが、怪しげ なものを見つけることはできませんでした。 > 特にldというものがいまいち理解できないのですが ld はリンカです。例えば >>3868 jeiu で printf や scanf などの関数を使っていますが、これらの関数は OS の機能として用意されているものではありませんし、コンパイラが 内蔵している機能でもありません。 /usr/lib/ の下に *.a や *.so などのファイルがあると思いますが、 ここにコンパイル済の printf や scanf が入っており、それと結合 しているわけです。それらのライブラリ関数と、あなたが作った プログラムを結合するのがリンカの仕事で、コンパイル済の printf や scanf はどのディレクトリに置いてあるかを指定するのが -YP オプションです。 だらだらと書いてきましたが、ぶっちゃけて言うと一般的な解決方法は Solaris では /usr/ucb/cc を使わず、/opt/SUNWspro/bin/cc を 使う。できれば PATH から /usr/ucb/cc を削除した方がよい というもので、これはよく知られたノウハウです。/usr/ucb は SunOS4 時代 (20年くらい前) との互換性のためのディレクトリで あって、今どき積極的に使う必要性はありません。 ただ、わたしは根本的な原因を知りたかったので しつこく聞いて みたのですが、実を結ばなかったようで誠に残念です。 以下は余談ですが、あなたの環境のコンパイラはおそらく Forte C update 2 という Sun の製品です。わたしの手元には Solaris2.6 + Sun Workshop (Forte C の前バージョン。Sun の製品) がありますが、いくら頑張っても 同じエラーメッセージを出すことができませんでした。 よって、多分 Forte C の不具合ではないかと予想しています。 |
|
>>3811 68user >>3810 どら 富士通のコンパイラも入っていそうだという事が気になるのですが・・・ /usr/ccs/bin/ucbcc は Forte へのシンボリックリンクになってますか? |
|
>>3812 zsh > 富士通のコンパイラも入っていそうだという事が気になるのですが・・・ /opt/FSUNf90/bin とかですか? Fortran のコンパイラと見たので 特に関係はないかと判断したのですが、どうなんでしょうね。 |
|
>>3811 68user お手数をおかけしてすいませんでした。 説明がわかりやすくてうれしかったです!! PATHから/usr/ucb/ccを削除してみました。 そしたらいままでの警告文はなくなりました!!ありがとうございました。 しかし今までになかった警告文がでました。 ------------------------------------------------------------------- "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります ------------------------------------------------------------------- というものでした。今まではこんな警告もなかったし、3行目の空白も見当たりません。 この前載せたプログラムと同じものなのですが、#includeと<stdio.h>の間の空白を消してみましたが同じでした。 またなにか問題なのでしょうか?他の例題に関してもまったくおんなじ警告文がでます… この形の警告文はたいていプログラムの問題だったので、プログラムをいじれば解決していたのですが… あと、もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが… いろいろなホームページ上の例題をやってみたのですが、どれもうまくいかなくて… (特に、Cのプログラムをgnuplotに出力させたいのですが、gnuplot本体を置くディレクトリの場所とか、リンクの仕方とか…) もし時間があればでけっこうですので、少し教えていただけないでしょうか。よろしくお願いします。 |
|
>>3814 どら > "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります ソースを少しずつ削って、この警告が出る場所を特定してください。 問題の行を特定したけれども原因がわからない場合は、 % od -cx < ex3-1.c (最小限まで削ったファイル) として、変な文字が入っていないか確認してください。 > もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが… 質問がある場合は http://www.hyuki.com/writing/techask.html を熟読した上でお願いします。ただしこの掲示板ではこれまで gnuplot の話題が 出たことはないので、 Gnuplot Q&A 掲示板 http://ayapin.film.s.dendai.ac.jp/cgi-bin/trees.cgi などで聞いた方がよいかもしれません。適切な答えをもらうにはどこで 質問するのが効果的かを見極めた上でどうぞ。 それはそれとして > Cのプログラムをgnuplotに出力させたいのですが やればできるでしょうけど、gnuplot の使い方としては適切ではないような気がします。 |
|
>>3815 68user >> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります >ソースを少しずつ削って、この警告が出る場所を特定してください。 includeの文を1行全部削ってみた所、正常に動きました。 しかし、includeの文はプログラムには絶対必要なものと思っていたのですが… include文が無くても動くということはありえるのですか? 下に正常に動いたプログラムを書きます。 ----------------------------------------------------------------------- /* 【例題3.1】 rei3_1 */ main() { int a,b; printf("異なる2つの整数を入力してください--->"); scanf("%d %d",&a,&b); if(a > b) printf("%d --- BIG\n",a); } ------------------------------------------------------------------------ |
|
>>3816 どら > includeの文を1行全部削ってみた所、正常に動きました。 逆です。動くように削っていくのではなく、動かない最小限の部分を 突き止め、その原因を探る方法を教えたつもりです。 つまり #include に原因があることがはっきりしたので、 % grep include ex3-1.c | od -cx として、なぜ警告が出るのかを調べるべきです。 > include文が無くても動くということはありえるのですか? いろいろありますが、初心者のうちは include 文は書くべきと 思っておく方がよいでしょう。 |
|
>>3817 68user この前のプログラムから、#includeと<stdio.h>の間の空白を削除してみましたが、やはり同じ警告が出ました。 それで、そのプログラムにgrepをかけてみました。どこに空白文字があるのかがわかりません… あるとしても最後の“\d\n”ぐらいだと思うのですが、これは指令とは関係ないし、必要なもののはずなのですが… 下に“grep include ex3-1.c | od -cx”の結果を書きますので、終えてください。よろしくお願いします。 -------------------------------------------------------------------------- 0000000 # i n c l u d e < s t d i o . h 2369 6e63 6c75 6465 3c73 7464 696f 2e68 0000020 > \r \n 3e0d 0a00 0000023 ------------------------------------------------------------------------- |
|
>>3818 どら > 0000020 > \r \n 改行コードが CR LF になっています。UNIX の改行コードは LF です。 CR が空白文字扱いされているのでしょう。 とりあえず CR を削るだけなら tr コマンドが使えます。 http://x68000.startshop.co.jp/~68user/unix/pickup?tr Windows で作ったソースを ftp などで UNIX 上に持ってきて いるなら、アスキーモードで転送しましょう。ただし、全て UNIX 上で開発するのがスキルアップへの道だと思います。 |
|
>>3819 68user trコマンドで\r\nを\nに変えてみるとうまく作動しました。 ためしに、ftpでの転送もアスキーモードに変えると うまく作動しました。 原因が改行コードとは…気づきませんでした。 いろいろとありがとうございました。 |