@宗佑さん > "xxx@xxx.yyy.zzz"といった指定したメールアドレスを > from句に入れて自動返信したいのです。 これは、単に From ヘッダが xxx@xxx.yyy.zzz になっていれば いいのですか? それとも envelope from が xxx@xxx.yyy.zzz と なっていて、例えば転送途中でメール送信に失敗した場合、 エラーメールが xxx@xxx.yyy.zzz に送られることを意図して いますか? 前者ならただ単に From: を置換するだけなので、formail -i や formail -I でできそうです。後者なら sendmail -f xxx@xxx.yyy.zzz でしょうか。 なお、僕は formail を使ったことはありませんし、できるか どうか試してもいません。 @やままさん > MAX_CHILDRED -> ? む、typo ですね。直しました。御指摘ありがとうございました。 @ありさわさん ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で タイムアウトさせて unreachable かどうかを判断すると思いますが、 本当はどうすべきなのかは わかりません。 それはそれとして、以下は ping で判断するという前提の話。 ping は ICMP プロトコルを使いますが、これは root 権限が ないと実行できません。その証拠に ping コマンドは root に suid されています。 % ls -l /sbin/ping -r-sr-xr-x 1 root wheel 195956 Jul 27 23:31 /sbin/ping* というわけで、素直 (?) にping コマンドを使うのがいいのでは ないでしょうか。 |
>ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で >タイムアウトさせて unreachable かどうかを判断すると思いますが、 >本当はどうすべきなのかは わかりません。 OS 依存ですが、ifconfig -a とすると表示されることがあります。 下は FreeBSD の場合です。 dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::xxx:xxxx:xxxx:xxxx%dc0 prefixlen 64 scopeid 0x1 ether xx:xx:xx:xx:xx:xx media: autoselect (none) status: no carrier supported media: autoselect 10baseT/UTP <full-duplex> 10baseT/UTP none no carrier というのがケーブルが抜けたことを意味していると思っても だいたいあたっているはずです。一方、Solaris のように抜けた瞬間に /var/adm/messages などに記録されるものもあります。 Solaris がでたついでなので、 >1. /var/log/messages や /var/log/maillog に詳細なエラーは出ていないか Solaris の場合 sendmail のログは通例 /var/log/syslog に記録され、 BSD の /var/log/messages にあたるものは /var/adm/messages です。 |
No.1299の ありさわ です。 いろいろご回答いただきありがとうございます。 掲示板に書き込みしたのが初めてだったので、 返答が有ったことにチョット感激してます。 この件については結果的に、僕の技術不足で違う方法によって 対処をすることになりましたが、今後のためにこの件について 前の書き込みで説明が足りなかった分の説明をさせていただきます。 切断を検出して子プロセスをKillする一連の作業は コマンドラインからではなくPerlプログラム内で行いたいです。 ついでに何を作成したかというと、ここのサンプルプログラムを 利用してネットワーク対戦のロビーサーバーを作成しました。 Q.LANケーブルを抜いたらどうなるのか? まずこれは、クライアント側のLANケーブルを抜いた時のことです。 ※LANケーブルを抜いた時の様子 ・最初にケーブルがつながった状態でサーバーに接続をしにいきます。 ・サーバーはこのクライアントに対して子プロセスを作成します。 ・接続が確立した状態でクライアントのケーブルを引きます。 ・子プロセスはクライアントとの接続が切れたことを認識できず 残ったままになります。 ・この作業(嫌がらせ)を何度もされると子プロセスが溜まっていって 結果、サーバーがダウンするんじゃないか?って思ってます。 あたたかいご回答、本当にありがとうございました。 |
ありがとうございます。 formailによる自動返信完了しました。 errorメールに関しても、本文に細工をしてなんとか解決しています。 こういうことが、やりたかったのも、UNIXのアカウント名とメールアカウント名が、まったく一致しない仕様のシステムを使っているので、外部に対する送信者が誰であるかを混乱させないようにする目的があったからです。 ありがとうございました |
はじめまして。 GOOで検索してきました。 perlの事について質問があるのですが。。。。 perlを使ってActiveXのDLLファイルを舐めようと思っているのですが、全くもって方法が解りません。 ここの過去ログや、その他色々探して見ましたがそれらしいものは見当たりませんでした。 どうぞお解りになる方がいらっしゃいましたら御指導宜しくお願いします。 |
@rosegarden さん > OS 依存ですが、ifconfig -a とすると表示されることがあります。 なるほど、勉強になりました。どうもです。 @ありさわさん > 子プロセスはクライアントとの接続が切れたことを認識できず > 残ったままになります。 という用途なら、TCP のタイムアウトを待つか、自前で タイムアウトの機構を作るのが普通のような気がします。 @Taka さん > perlを使ってActiveXのDLLファイルを舐めようと思っているのですが 「ActiveX の DLL を舐める」の意味からして さっぱりわかりません。 google で検索すると http://www.union-net.or.jp/~cgifaq/Archive/msg13177.html Subject: [cgi:13180] Re: Perl からActiveX のDLL を呼び出すには というのが引っかかりますが、現在サーバの容量オーバーにより公開を 中止しているようで。あと perl モジュールの Win32::COM ってのが ありますが、関係あるのかなぁ…。 http://www2s.biglobe.ne.jp/~cru/library/zddbbs/cgi-bin/wwwboard.cgi に行くと、その道の偉い人が教えてくれるかもしれません。 |
初めまして。 上條と申します。 かなり困っております。 どなたかお知恵を拝借願います。 現在Windows98にFTPサーバソフトをインストールしてあり、カスタマイズチューンナップされた シェルのないFreeBSDにファイルをダウンロードさせたいのです。 FreeBSD側のコントロールはTelnetでコマンドを入力することにより、FreeBSD側は指定された IPのFTPサーバに(この場合Windows98)接続をしてダウンロードを開始する仕組みなっています。 この際のFTPサーバへの21番にどういったコマンドが流れているのか不明ですが、様々なFTPサーバソフトを 試した結果、NDMTというコマンドがFTPサーバソフト側で処理できないこと、winftpdeamonの コミュニケーションタイムがオーバーになるというエラーが出て、FTPサーバ側で切断をしてしまいます。 一度、Win98+wftpdでの成功例を聞いたことがありますが、色々設定を変えてみましたが、うまくいきません。 接続の形態としてはルータ支点に同ノード内の10BASE-T接続です。 Freebsd側とは全てのPORTで接続は出来ます。 プロトコルはTCP/IPを使用しています。 もっとも最初からLinuxやFreeBSDにFTPサーバをたてることが出きれば問題なく接続できることは マニュアルに明記してあるのですが、私がFTPをたてるだけの技術がないことと、本日中という時間の中で 手元に使用できるLINUXなどがなく、大変困っております。 詳しい説明でなくても結構ですので、何か妙案がございましたら、どなたかお教えいただけないでしょうか。 よろしくお願いいたします。 |
AnHTTPD で HTTP 使ってダウンロードするのは? FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 FreeBSD の 4.0-RELEASE 以降だと ftp クライアントの類は passive mode で動作しますが、これはチェックしました? passive mode をオフにするには /etc/login.conf の default エントリで FTP_PASSIVE_MODE という環境変数を セットしているから、そのファイルを書き換えて、NO にすれば 良いですよ。 思い付くのはこれだけですね。カスタマイズされているのだから、 これ以上答えようがないですね。 |
> FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 失礼、/usr/bin/fetch ですね。 それから wget でも良いかも知れません。 もっとも、FreeBSD がわで IPv6 の設定(デフォルト)してあると最近の wget は IPv4 のオプションつけないと no route to host って エラーを出すこともありますが。 |
> FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 失礼、/usr/bin/fetch ですね。 |
はじめまして。 時々68userさんのページ拝見させていただいてます。 いろんなことが書いてあってとてもためになります。 場違いかもしれないんですがXについて少々よろしいでしょうか? このページでHello World のソースをとってきて、 gcc -o test test_hello_world.c -I /usr/X11R6/include -L /usr/X11R6/lib -lX11 -lm とコンパイルしたところ、正常に動作したのですが、 右上のバツボタン押してもちゃんと終了してくれず、 X connection to :0.0 broken (explicit kill or server shutdown). と、怒られてしまいます。 ちなみにVine Linux2.0CRを使用しております。 あと、右上のバツボタンがそのHello Worldのみに関しておかしい 表示になってしまいます。 と、いうか自分で書いてみたやつは全部なんですが。 もし心あたりがあったらご教授いただけませんでしょうか? お願いします。 でわまた寄らせていただきます。 |
@いえろーばっくすさん > X connection to :0.0 broken (explicit kill or server shutdown). これはクライアント側の Xlib が出力しているメッセージです。 # 個人的には、あまり気にするほどのメッセージではないと # 思っています。 よくわかってませんが、多分ウィンドウマネージャの「×」を 押すと、X サーバとのコネクションが切断されるのでしょう。 X クライアントは、コネクションが切断されたので X サーバと 通信できなくなり、エラーとなって終了しているわけです つまり、「×」ボタンを押すと X クライアントのプロセスが直接 kill されるわけではないということです。 これを直したいなら、まず Atom a1,a2; アトムを宣言します。次に a1 = XInternAtom(display, "WM_PROTOCOLS", False); a2 = XInternAtom(display, "WM_DELETE_WINDOW", False); XSetWMProtocols(display, window, &a2,1); とすれば、「×」ボタンを押すと、ClientMessage イベントが 送られてきます。後は switch 文の中で case ClientMessage: if ( event.xclient.message_type == a1 && event.xclient.data.l[0] == a2 ){ XCloseDisplay(display); exit(0); } break; とすればいいでしょう。 「×」を押しても終了しないアプリや、終了する前に後始末を するアプリを作るときは、こういうふうにします。 @rosegarden さん > FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 FreeBSD なら ftp コマンドでも落とせますね。 % ftp http ://foo.bar.com/hoge.html % ftp ftp ://foo.bar.com/hoge.tgz などなど。Solaris にもこういうコマンドがあればいいのに。 @上條さん > 私がFTPをたてるだけの技術がないことと シェルがないということなので今回は無理かもしれませんが、 ftp サーバを立てるだけなら、/etc/inetd.conf に ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l と書いて、kill -HUP `cat /var/run/inetd.pid` でおしまいです。 # FreeBSD のデフォルトでは、ftpd は使用可能です。 anonymous ftp サーバなら、さらに (FreeBSD なら) jman ftpd に 書いてあるとおりにやればよいです。 「ネットワークプログラミングの基礎知識」に「HTTP の並行アクセス」 http://X68000.startshop.co.jp/~68user/net/http-parallel-1.html というページを置きました。お暇な方、ご笑覧くださいませ。 |
perl CGIの実行権限について質問させて下さい。 CGI内部でこれを調べる方法を探してて、 ここの掲示板のソースを参考にさせてもらおうと思ったのですが、 ここでは、(getpwuid($>))[0]で、実行権限が誰かを表示してますよね。 これを -o $script_name の検査で、 直接、所有者権限か(真の場合)、それとも他の権限か(偽の場合)を 検査することはできないのでしょうか? @ActiveX の DLL を舐める ウチのURLが出てるなぁ…でも、私宛じゃない(笑い) これ、単にDLLの内部データを読み出したいだけじゃないんでしょうか? (そういう、ツールがあったと思う) それなら、perlで注意するのは、binmodeを使うことくらいでしょう。 後は、DLLのバイナリ構造をどこかで調べればいい(私は知らないですが)。 |
おそらく -o $filename は $> == stat($filename)->uid ? 1 : 0 と同じだと思うので、それで問題ないと思います。 getpwuid を使ったのは特に意味はないので (強いて言えば -o の存在を知らなかったから)、今後は if ( -o $0 ){ 所有者権限 } で判別しようかと思います。 |
>と同じだと思うので、それで問題ないと思います。 UIDとかは自信がないので、ありがとうございました。 ウチもそれで行きます♪ |
> FreeBSD なら ftp コマンドでも落とせますね。 これは知りませんでした。勉強になりました。 > などなど。Solaris にもこういうコマンドがあればいいのに。 Solaris は /usr/local/bin に GNU コマンドとか BSD コマンドとか インストールしないと日常的な作業は確かに辛いですね。 |
UNIXの/var/adm/crashディレクトリについての質問です。 最近仕事でHP−UNIXを使用しているのですが、/var/adm/crash ディレクトリに、「core〜」、「bounds」のディレクトリが作成されて しまい、/var の領域が100%になってしまいます。 「core〜」については、削除しても良いと本に載っていたのですが、 「bounds」については、削除してよいか分からないです。 どなたかご存知の方いらっしゃいましたら、お教えください! よろしくお願いします! |
HP-UX は知りませんが、マニュアル savecore(1M) には > savecore saves the core image in the file > dirname/hp-core.n and a copy of dumpsystem, which contains the > namelist, in the file dirname/hp-ux.n. The trailing n in the path > names is a number that increases by one every time savecore is run in > that directory. This number is kept in the file dirname/bounds, which > is created if it does not already exist. とあるので、消してもいいんでないでしょうか。 |
「SSLプログラミング」に関する質問です。 サーバー・クライアント間でSSL通信を行っている状態のものに、 「プロキシプログラム」なるものを両者の中間に介在させた場合 について・・。 サーバー・クライアントの「メッセージのやりとり」をログファイル等に 出力したいのですが、当然この両者は「暗号」によるデータのやりとりを している為に「メッセージ」に関しては???と言った状態です この暗号を「解読」と言った事は出来ないものでしょうか? |
どうも。いえろーばっくすです。 68user様、windowの件ありがとうございました。 今やってみたところちゃんと閉じることができました。 ボタンの表示もちゃんと直りました。 これからもいろいろと質問することがあるかもしれませんが、 どうぞよろしくお願いします。 |
はじめまして。 日付,時間,なまえ,・・・ 日付,時間,なまえ,・・・ 日付,時間,なまえ,・・・ といったようなログから当日分のみを抜き出し他のファイルに保存する。 といったようなバッチを作りたいのですが、 UNIX初心者でさっぱりわかりません。どなたか教えていただけませんか? |
@みーたんさん 盗聴できるかということならば、無理です。なぜなら SSL は 公開鍵と秘密鍵を使うから。盗聴によって公開鍵を盗めても、 秘密鍵はクライアント・サーバそれぞれが保持していますので、 データは守られます。 # という説明でわかってもらえるかしら。 @M.K さん sh スクリプトで書きたいとか、perl を使いたいくらいは 書きましょうよ。こちらがサンプルを書いても、「いえ、 そうじゃなくて…」という返事はもらいたくないので。 まぁ 一言でいうと、date コマンドで現在日時を取得し、それを キーとして grep です。date と grep のマニュアルを読みましょう。 |
はじめまして。 当方cshシェル環境にてUNIXを利用しております。 その環境設定で「カレントディレクトリをプロンプトに追加」というのがありますが、 ディレクトリの移動によって「今現在どこに居るか」というのを表示させたいのです。 set prompt = "`whoami`@`hostname -s`[\!][`pwd`]%" のように `pwd` をつけてもsourceコマンドによって.cshrcを再有効に した時点でのカレントディレクトリが格納されたまま変化してくれません。 ディレクトリの移動に応じてプロンプト上に表示されるカレントディレクトリを 逐次変化させるためにはどの様に.cshrcを書き換えれば良いのでしょうか? `pwd`の部分を$cwdとかに変えてもダメだったし...ほとほと困っております。 参考までに、現在の.cshrcの内容を書いておきます。 alias dir 'ls -alF' alias less 'jless' setenv LANG japanese setenv EDITOR vi setenv PAGER less setenv BLOCKSIZE K setenv EXINIT 'set showmode' setenv LESSCHARSET japanese set prompt = "`whoami`@`hostname -s`[\!]%" なお、FreeBSD3.4R上での環境です。 どうかよろしくお願いします。 |
C言語を覚えたいのですが どなたかC言語を教えに来ていただけませんでしょうか。 兵庫県姫路市 ho-muzu@mui.biglobe.ne.jp メールください。 |
> ディレクトリの移動によって「今現在どこに居るか」というのを表示させたいのです。 とりあえず、こんなんでどうでしょうか? テストは tcsh でやったので、 断定的なことは言えませんが、古い csh と互換性のある構文を使っています。 alias sp 'set prompt=`whoami`@`hostname -s`\[`pwd`\] ' alias cd "cd \!* ; dirs -l ; sp" alias pushd "pushd \!* ; sp" alias popd "popd ; sp" ポイントは set prompt の alias をシングルクォートで囲むところですかね。 あと、cd, pushd, popd のごとに prompt の set をするということですね。 4.1-RELEASE 以降だと /bin/csh は tcsh なので、もっと簡単に出来ます。 たしか %/ とかいうのを使えば、良いだけだったと思います。 |
rosegardenさんへ> >ポイントは set prompt の alias をシングルクォートで囲むところですかね。 >あと、cd, pushd, popd のごとに prompt の set をするということですね。 なるほど。cdコマンドを使うたびにset promptするんですね。 ためしてみたところ、確かに出来ました。 >たしか %/ とかいうのを使えば、良いだけだったと思います。 これは知りませんでした。tcshの利用が可能なマシンがあるので 試してみましたが、ホントですね。うーん、こっちの方が簡単だなぁ。 でもメインのマシンはシェルの変更を許可してくれないので、 alias方式で行きます。どうもありがとうございました。 |
> でもメインのマシンはシェルの変更を許可してくれないので 僕は sh・csh のような非人間的なシェルを使うのは耐えられない ので、そういうときは勝手に tcsh を入れて、~/.cshrc に if ( ${?tcsh} == 0 ) then exec /usr/local/bin/tcsh endif などと書いてます。 前にちょっとはまったことを書いておきますと、これをするなら ~/.cshrc に setenv TERM vt100 などと書いてはいけません。 普通にログインするときはいいのですが、もし端末がない場合 (rsh を使う場合など) は、tcsh が端末があると勘違いして 入力待ちになってしまい、rsh が効かなくなるからです。 Solaris などで、デフォルトだと TERM=kterm になってしまい、 さらに /etc/termcap に kterm のエントリがないため、vi や emacs を実行すると文句を言われるので仕方なく setenv TERM vt100 と書いている人もいると思いますが、それをするなら if ( ${?TERM} ) then setenv TERM vt100 endif と書けばいいです。これなら rsh のときは TERM が設定されません。 |
はじめまして。今UNIXにおいてのプロセス間通信として、 FTPをモデルとして調べていて、ここのHPにたどりつきました。 ものすごく参考になってます。で、聞きたいことがあります。 聞きたいことは、FTPクライアントのプログラムでのことですが、 C言語版での、GET及びPUTなのですが、GETの場合は、Perl同様に soketより手に入れたデータをfopen関数を用いてのそのデータをGetしたファイルと同じ名前で保存することでGETされるのですか?PUTも同様ですか? また、FTPサーバーでは、LESTやGETやPUT のプログラム上では、どのような動きをしてるのでしょうか? 自分なりには、イメージがあるのですが自信がないので教えてもらい たいです。 こちらの勝手なお願いですが、今週中までに返事を掲示板のほうでいただけると大変助かります。 |
初歩的な質問ですが, AIXを触り始めたのですが, telnetでrootのログオンを許容しているのを やめたいのですが, 設定ファイルがわかりません。 どのファイルにその設定が書いてあるのでしょうか? あと,tcshをmakeするとEUCコードで作成されてしまいますが AIX用(SJIS)での作成方法もご存知の方,お教え願います。 よろしくお願い致します。 |
> telnetでrootのログオンを許容しているのをやめたいのですが, AIX は管理したことも使ったこともありませんのでわかりません。 init, pam, login, tty, ttys などのマニュアルを探してみてください。 FreeBSD なら /etc/ttys Solaris なら /etc/default/login Linux なら /etc/security あたりなので、/etc の下に片っ端から grep かけてみる のもいいでしょう。 cd /etc; egrep -i 'secur|root|login' * */* */*/* > soketより手に入れたデータをfopen関数を用いてのその > データをGetしたファイルと同じ名前で保存する そうです。C でも perl でもやることは同じです。 > FTPサーバーでは、LESTやGETやPUT > のプログラム上では、どのような動きをしてるのでしょうか? コマンド用コネクションから RETR hoge が送られてきたら、 データコネクションを確立し、hoge のファイルを fopen して データコネクションに hoge の内容を流します。 コマンド用コネクションから LIST/NLST が送られてきたら、 データコネクションを確立し、/bin/ls の結果 (別に ls を 使わなくてもいいけど) をデータコネクションに流します。 > 自分なりには、イメージがあるのですが自信がないので > 教えてもらいたいです。 自分なりのイメージを書いた上で、それが合ってるか間違ってるか たずねるのがスジというものでしょう。 |
質問というか、ご意見頂きたいです。 掲示板が荒らされたなら、制限したり削除できますが メールが大量に届いたり本文が最悪なタグの羅列だった場合 どうすればいいんでしょうか?明日も変なメールきそうで カナリ、不安です。これって警察に言えたりするものなのでしょうか? 迷惑防止条例とか。 http://www.alles.or.jp/~tll/toc/hino.html |
Perlの質問です。 2000/10/01の三日まえを表示したいのですが どのようにやれば良いでしょうか? 宜しくお願いします。 |
> 2000/10/01の三日まえを表示したいのですが Time::Local で time_t 形式に変換し、3日分の秒数を引いてから、 再度 localtime で年月日の形式に戻します。 use Time::Local; $time = timelocal(0,0,12,1,10-1,2000-1900); $time -= 60*60*24*3; ($sec,$min,$hour,$day,$mon,$year) = localtime($time); printf "%4d/%02d/%02d",$year+1900,$mon+1; > メールが大量に届いたり メールが何通届いていて、それぞれサイズはどれだけか、という ことは、メール本文を取得する前に調べることができます。 また、これはメールサーバにもよりますが、あるメールの先頭 何行のみを取得、ということもできます。そういう機能を持つ メーラーを探してみてはどうでしょうか。 % telnet メールサーバ名 110 USER your_user_name PASS your_password LIST (メール一覧とサイズ表示) TOP 1 3 (1通目のヘッダと本文3行のみを表示) QUIT (終了) > 本文が最悪なタグの羅列だった場合 Windows はよく知らないんですが、HTML メールが送られて きたら、HTML として開くか plain text として開くかを 確認してきませんか? 聞いてこないなら、まともなメーラーに かえましょう。 |
68userさん > こないだは説明が足りずに済みません。助かりました。 またしても質問なんですが、 sh スクリプトで2つのファイルの内容が完全に一致した場合に aというファイルに 日付,"一致"(文字列)を出力して、 一致しなかった場合には 日付,"不一致"(文字列)を出力したいんですが 全然わかりません。よろしかったら教えてください。 |
ファイルの比較には cmp か diff を使います。一致 したかどうかはコマンドの戻り値を見ればよいですが、 sh なら $? で参照できます。あとはマニュアルを よく読んでみてください。 |
No.1269で、超初心者さんがやってたのと同じように、CGIからexpectスクリプト を呼び出して、他のマシンにtelnetしてパスワードを変更するシステムを作って いるんですが、telnetで戻ってきた文字が一部うまくexpectに渡されないようで 途中で止まってしまい、上手くいきません。 そこで$|=1にして出力を見たら、以下のところで止まっている事が分かりました。 spawn telnet server Trying xxx.xxx.xxx.xxx ... Connected to server.xxx.xxx. Escape character is '^]'. ”Escape character is '^]'.”の後に、CRLFが来るんですが、それから先が上手 くexpectに渡されていない(?)ようです。 HTTPdがCRLFだから止めてしまっているんでしょうか? それってHTTPdの仕様なんでしょうか? exec 'expect';の後のprint文はexpectのtimeout後に出力されます。 どこで止めてしまってしまっているかを調べる方法や解決方法など、アイディア がありましたら教えてください。 |
僕は expect 使ったことありませんのでわかりませんが、せっかく perl を使っているんですから、Net::Telnet モジュールでやって みてはいかがでしょう。 use Net::Telnet; $t = Net::Telnet->(Timeout=>10, Prompt => '/\w+?@\w+?: /'); $t->open('hostname'); $t->login('yourname', 'password'); @lines = $t->cmd("/bin/ls -l"); print @lines; $t->close(); 言うまでもないかもしれませんが、Prompt のところは適切に 変更しないと動きません。詳しくは perldoc Net::Telnet をどうぞ。 |
うーん、むずかしい…。全然理解してないことがよくわかった。 すごく汚くて変な書き方ですがこんな感じ。 use Net::Telnet; $username='yourname'; $oldpasswd='secret1'; $newpasswd='secret2'; $t = new Net::Telnet (Timeout => 5, Prompt => '/\w*? /', Dump_Log => 'telnet-log'); $t->open("localhost"); $t->login($username, $oldpasswd); $t->prompt('/Old password:/'); $t->cmd("/usr/bin/passwd"); $t->print("$oldpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->close(); 適当に $match の結果に応じて、パスワードが違うやら、 新しいパスワードが短いやら出力すればいいのかな。 expect の方がすっきり書けるような気も。 |
やっぱ僕がやるとしたら pw コマンドの wrapper 作って、 それを root に suid するなぁ。passwd の挙動を 全て把握するのは厳しい。 |
結局、68userさんのおっしゃる通りpasswdの挙動を全て把握するのは 厳しいので、telnetされる側のServerにID,Passwordを変数として受け 取って、passwdファイルを直接編集するperlを置き、それをCGI(Perl) からtelnetして、rootで実行させるようにしました。 結局何故expectで動作しないのかは不明なままですが、要求を満たす 物は出来ました。 アドバイスありがとうございました。 |
私の場合、次のような感じのスクリプトで動きます。 一応、ログインしてコマンド実行程度なら、大丈夫のようです。 環境は perl 5.00503 + Expect-1.08 + FreeBSD 4.2-BETA です。 #!/usr/bin/perl use Expect; my $user = 'rose'; my $password = 'password'; my $prompt = 'host\{rose\}\d+\s'; my @cmdlist = ( 'ls -alF', 'ps -auxw', 'exit', ); my $telnet = Expect->spawn("telnet localhost"); $telnet->expect(30,"login: ") || die "NO login prompt"; print $telnet "$user\r"; $telnet->expect(30,"assword:") || die "NO password prompt"; print $telnet "$password\r"; my $match = $telnet->expect( 30, "closed by foreign host", "-re", $prompt ); die "refused by server\n" if $match == 1; die "NO shell prompt, ".$telnet->exp_error()."\n" unless $match; foreach $cmd ( @cmdlist ) { print $telnet "$cmd\r"; my $match = $telnet->expect( 30, "closed by foreign host", "-re", $prompt ); last if $match == 1; die "NO prompt after command\n" if $telnet->exp_error(); } $telnet->hard_close(); exit; |
最近Unixを始めたのですが、サブルーチンの作り方がわかりません。 (呼び方、書き方) 簡単な例を教えていただけると幸いです。 |
awk scriptを使って下の様なことがしたいのですが、方法を教えて下さい。 Input File1: 10 abcde 9 bcdef 12 cdefg Input File2; 3 abcde 5 cdefg 12 defgh ファイル1と2を比較し、$2の内容が同じ場合、file1 と file2 の $1 $2 を output file の $1 $2 $3 $4に出力する。 比較して見つからない 場合はスペースを出力する。 Output file 10 abcde 3 abcde 12 cdefg 5 cdefg 3 abcde 12 defgh よろしくお願いします。 |
> サブルーチンの作り方がわかりません。 言語がわからないと何とも言えません。 > awk scriptを使って下の様なことがしたいのですが #!/usr/bin/awk -f BEGIN{ while (getline< ARGV[2] >0 ){ hash[$2]=$1 } while (getline< ARGV[1] >0 ){ if ( hash[$2] ){ print $1,$2,hash[$2],$2 } else { printf "%s %s \n",$1,$2 } delete hash[$2] } close(ARGV[2]); while (getline< ARGV[2] >0 ){ if ( hash[$2] ){ print $1,$2 } } } FreeBSD の awk と Solaris の nawk では動きましたが、 Solaris の awk では動かず。 うーん、awk らしくない…(笑) まぁ awk スクリプトを 書いたのは4年ぶりくらいなので、これで勘弁して下さい。 # 見本求む。 |
すみません。 Perlです。 |
> # 見本求む。 見本かどうか分かりませんが、私は次のように書きました。 #!/usr/bin/awk -f { array[$2] = sprintf("%s %s", array[$2], $1); } END { for( key in array ){ split(array[key], tmp); if( 2 in tmp ) printf("%s %s %s %s\n", key, tmp[1], key, tmp[2]); else printf("%s %s\n", key, tmp[1]); } } 起動は % awk -f script file1 file2 としてください。連想配列に記録して、最後に出力という感じです。 ただし、次のような $2 が同じだが $1 が違う値を含む形式のデータは 仮定していません。 10 abcde 11 abcde どちらかを捨てるようになっているかと思います。実際にはデータの形式の チェックが要るかと思います。あと出力の順が不定になります。出力の 順番に依存する処理には向きません。動作チェックはしていません。 多分、本家の awk じゃ無理かな。動作チェックは gawk でやっています。 |
># 見本求む。 単なるバリエーションということで… #!/usr/bin/awk -f NR == 1 { f = FILENAME } f == FILENAME { hash[$2]=$1 } f != FILENAME { if ( $2 in hash ) { print hash[$2], $2, $1, $2 delete hash[$2] } else print $1, $2 } END { for (r in hash) print hash[r], r } |
もう他人の書いた awk スクリプトを見ても意味がわからん (笑) > Perlです。 で、どういう処理をするサブルーチンの例を見たいのですか? あと、素人とか初心者とかいうハンドルはやめてください。 それから、誰に向けて言うわけでもないですが、回答をもらっても 返事をする気がないなら、最初から質問しないでね。 |
沢山の回答、どうもありがとうございます。 あとお礼が遅くなってどうもすいません。 試してみてから出そうと思っていたのですが、家にUNixがないので 月曜になってしまいます。 このページを発見して間もないのですが、これから色々質問することもある思うので、その時はまたよろしくお願いします! |
行頭のスペース、全角スペースを に置換するように してみました。 if ( m/^(<BR>)?(\>|>)/ ){ $_ = qq(<FONT COLOR="$color{QUOTE}">$_ </font>); } の後に s|^( +)|' ' x length($1)|e; s|^( +)|' ' x length($1)|e; を追加しただけです。 現状でこれをしちゃうとまずい UA ってありますっけ? |
こんにちは、はじめての書込ですが... http://tsu.virtualave.net/TSU/whimsy.html 今週上のようなのをやることになったので お時間のある方はどうぞ。(ちなみに日本語コードが 前のようなSJIS固定から、普通の日本語チャンネルと 同様のJISになってます) GUIクライアントは、FreeBSDだとportsにGTK+使うXchat の日本語化版があるそうです。 Linuxだとhttp://dns.manabi.gr.jp/~blend/の辺りが よいかと(FreeBSDでこれrpmから出して使う場合は GNU makeが要ります)。 いずれにせよJISになったので一般に配布されている 日本語化パッチの類が簡単に使用できるようになりま した。 |
えっと、早い話が「エポ」の場所教えて下さい!! sachiyo@viola.ocn.ne.jp までメールで教えて下さいっす! |
どうも、おひさしぶりです。 > 現状でこれをしちゃうとまずい UA ってありますっけ? 現状の解釈が、わからなかったので、手元のブラウザで 調査しました。 OK win98 IE2 IE4 w3m(cygwin) FreeBSD Nestcape3 chimera w3m NG win98 Netscape3 とりあえず、こんな感じです。 ※ ディスク容量が足りなくなって、だいぶuninstall したので、この程度位までしか調査できませんでした。 |
> 68user さん > 行頭のスペース、全角スペースを に置換するように > してみました。 おかげで助かります。今まで、unexpand して投稿していましたが、 インデントが崩れるのが悩みの種でした。 どうもありがとうございます。 |
DATを初期化するコマンドって、UNIXでありますか?? |
> 行頭のスペース、全角スペースを に置換するように > してみました。 やっぱ、これが一番現実的みたいですね。 ウチでやらなかったのは、当時、使ってたWin95 NN4.1 が カット&ペーストで全角スペースに変換してたからだけど、 今のNN4.73では、ちゃんと半角になります。 ところで、 タブ も変換して貰えると助かるんですが… |
> NG win98 Netscape3 なるほど。よく知らないんですが、 が中黒になる んでしたっけ? UNIX 系の NN3 も表示できないと思って いたんですが、OK なんですね。では、Win+NN3 環境は 残念ながら泣いていただく、ということにします。 > ところで、タブも変換して貰えると助かるんですが… tab stop はいくつがお好みですか? (僕は4です) でもこれをやるなら、書き込み時に置換しないと いけないので、 TAB が発見されました。tab stop=4 だと以下のように表示されます。 [OK TAB=2にする TAB=8にする] てな感じ? (笑) ところで行頭以外のスペースを に置換するのって 意味ありますかね? > DATを初期化するコマンドって、UNIXでありますか?? テープ関係はよく知りませんが、mt erase あたりではダメでしょうか。 > http://tsu.virtualave.net/TSU/whimsy.html 僕も何度かおじゃまさせていただきました。お暇な方はどうぞ。 |
> が中黒になる そうです。目も当てられないです。 >UNIX 系の NN3 も表示できないと思って 少なくとも、Version 3.04 [ja_euc]はそうでした。 |
すいません、追加です。 winで確かめたNetscapeは、Version 3.01です。 .01と.04の差か(不明)? ←信じられん ※ win+NN3は、サポート外でいいと、思います。 ほとんどNN4/IE4以上だろうし・・・ |
どなたかP内部のCPUやメモリーやモデムなどに詳しい方 色々教えて下さい。 仕事上、自らバージョンアップをしたいと考えていますのでよろしくお願いします。 またこのURLは現在の仕事上のものです。 興味がある方はアクセスしてください。 |
No.1343,1345、1346の例を参考にやってみたのですが、SolarisのAwkでは動きませんでした、、、、 そこで、InputFile1の$2だけをInputFile3にcopyして、InputFile2の$2を、InputFile4にCopyし、単純にINputFile3、と4を比較し、同じ内容はOutputFile1へ、違う内容はOutputFile2へ出すようにするのであれば、Awkでもできるでしょうか? |
nawk では動きませんか。 # の話はまた明日…。 |
>tab stop はいくつがお好みですか? (僕は4です) 基本的には、私も4です…でも、最近は2なんてことも…(^^; >てな感じ? (笑) インデントさえあれば、結構見易くなると思うので、 1個でもいいんじゃないでしょうか?(笑い) >1346の例を参考にやってみたのですが、SolarisのAwkでは動きませんでした、、、、 The AWK Proramming Language 準拠のスクリプトが動かないなんて、どんなAWKだ(笑い) |
こんばんわ。またXについてわからないところが出てきました。 EXPOSEイベントについてです。 例えば、windowの一部が画面の外側に出ている状態で、 そこからwindowを現在ある位置から移動したとき、 EXPOSEイベントがたくさん飛んで来るようで、 飛んで来た回数だけ再描画されてしまいます。 この再描画を一回だけで終わらせる方法はないでしょうか? 自分で書いてみたのは全部書くと長いので 省略して書くとこんな感じです。 while( done == 0 ) { XNextEvent( display, &event ); switch( event.type ) { case Expose: if( myevent.xexpose.count == 0 ) { ..... ..... ..... ..... } break; case .... .... .... .... .... } いつもお世話になります。 ご教授おねがいします。 |
はじめまして。某企業でイントラネットの担当をしています。 本日、某ソフトメーカーのホームページ作成ツール(Go**ve ver5)を 導入したのですが、コンテンツをFTPでサーバにアップしようとしても 接続するのですが、既存のファイル名やディレクトリ名が、一切表示されないのです。 しかたなく、ユーザサポートに電話しても、「そんな馬鹿な・・・」と 冷たく言われる始末。。。 押し問答の末、担当者が「ブラウザから ftp://(username):(password)@(server)/(directory) と 入力すると、何が表示されますか?」というので、やってみると アクセス権表示(rwxr--r--)しか表示されないのです。 担当者曰く、「本来は、ファイル名やタイムスタンプが表示されるべきですが、 サーバの設定がおかしいみたいですね!」と冷たい回答。 サーバ担当者に問い合わせても、「他のホームページ作成ツールじゃ、 問題なくFTP出来ますから、そのツールのバグじゃないですか?」と 言われました。 ちなみに、マシンはSun, OSはSolaris 2.6, WWWはNetscape Enterpriseです。 何を調べればよいか、見当もつきません。 よろしくご教示ください。 |
> ちなみに、マシンはSun, OSはSolaris 2.6, WWWはNetscape Enterpriseです。 server 側の ftpd は Solaris 付属の ftpd ですか? Solaris の ftpd のファイルリスト表示って癖があったように思います。 Fetch という Mac の ftp クライアントでもファイル一覧は まともに表示されなかったことがありました。 これは、日本語版の Fetch なら対応しているんですが。 LIST か NLIST か詳しいことは忘れましたが、その表示が変わっていて 少なくとも古い Solaris の一部にはそういう癖があるので、別の ftpd 入れて見て試されては? NcFTPd とか UW_ftpd とか。 > SolarisのAwkでは動きませんでした、、、、 今度試してみます。 |
手抜きして、表示時に TAB を変換することにしてみました。 s|^(\t+)|' ' x length($1)|e; > 「ブラウザから ftp://(username):(password)@(server)/(directory) と > 入力すると、何が表示されますか?」というので、やってみるとアクセス > 権表示(rwxr--r--)しか表示されないのです。 rosegarden さんのおっしゃるとおり ftpd の問題なんでしょうが、 考えられるのは ・NLST だとファイル一覧がうまく取れないのかもしれない。 ・inetd が LANG=ja で実行されているため、inetd から呼ばれる ftpd も LANG=ja になり、日付が日本語になってしまう (11月14日など) てなところでしょうか。 で、他の ftp サーバを相手に試してみるとか、その ftp サーバに ftp -d で anonymous login して、プロトコルを見てみる (うまく いく ftp サーバとプロトコルの内容を比較する) などなど。 ちなみに ftp のファイル一覧の形式は、RFC で規定されていません。 一般的には ls -l の表示形式であることが多いですが、ls -l の 形式にすべしとはどこにも書いてありません。 > 例えば、windowの一部が画面の外側に出ている状態で、 > そこからwindowを現在ある位置から移動したとき、 > EXPOSEイベントがたくさん飛んで来るようで、 うーん、状況がよくわからんです。 http://X68000.startshop.co.jp/~68user/xprogram/xlib-3.html のように、ウィンドウ内に子孫ウィンドウを作ってますか? 子孫ウィンドウで Expose イベントに対応していないため、 上位のウィンドウにイベントが上昇伝播していて、その 結果複数のイベントが飛んできていませんか? もしそうなら、子孫ウィンドウでも XSelectInput して、 イベントが飛んできたら、どこ宛 (親ウィンドウ or 子 ウィンドウ) のイベントかどうかを判定し、適切な ウィンドウを再描画すればよいです。どのウィンドウ宛かは event.window でわかります。 1つのウィンドウでも発生するなら、 Expose が飛んできたとき、XCheckTypedEvent で さらに別の Expose イベントが飛んできていないか 調べる。 という方法があります。 case Expose: while (1){ if ( ! XCheckWindowEvent(display, window, ExposureMask, &event) ){ break; } てな感じ。ただし、根本的な解決方法かどうかはわかりません。 |
昨日間違って /var/adm のfileと subdirectoryをすべて削除してしました。、、、、、それが何なのか分からず、後でほかのUnixからコピーすればいいと思って昨日そのままShutDownしてしまったのですが、今朝起ち上げる時にcannot create car/adm/utmp or utmx. Failed to write of untmx entryというエラーが出て起ち上げられません。Ultra5+Solaris1.1.2なのですが、CDRomからそのDirectoryだけInstallする方法はありますか? |
Solaris 2.5.1 以降のことしか分からないんですが、 > 昨日間違って /var/adm のfileと subdirectoryをすべて削除してしました。 そこにあるのはログファイルの類だけです。sulog とか loginlog とか messages とかです。ログファイルが決定的な意味を持たないのなら問題ないです。 どっちにしても、CD-ROM にあったとしても元には戻りません。 utmp とか utmpx とかはログインとかの記録を保持するファイルです。当然 boot した時間や shutdown した時間も記録するので、それで文句を言うのでしょう。 私はこれを更新する際には実にアバウトに # cat utmp > utmp # cat utmpx > utmpx とかで済ませています(環境は Solaris 2.5.1 ですが)。だから空のファイルが あれば問題ないかと思います。空のファイルを作っておけば良いだけなので、 スイッチをいれた直後に L1+a で ROM モニタモードに移行してから、 boot -s して、/var をマウントして touch コマンドあたりで空のファイルを 作れば良いかと思います。あるいは、起動時に utmp がないと文句を言われて 止まった時に CTRL-C とか打ち込んでもブートの続きが始まるかも知れません。 CD-ROM にこだわるのなら、やはりスイッチいれた直後に L1+a で ROM モニタ モードに移行してから、OK プロンプトに boot cdrom すれば CD-ROM から たちあがあります。Solaris 1.1.2 は知らないのですが、2.5.1 以降だと Openwin が使えて、cmdtool なんかも好きなだけ使えます。で、適当な ところに手動で /var をマウントしてからコピーすれば良いかと思います。 参考までに Solaris 7 のインストール CD-ROM の /var は次のように なっています。tar でコピーするとか、 手動で同じもの作っても問題ないんじゃないでしょうか? # ls -alRF /tmp/root/var/adm total 8 drwxrwxr-x 4 root sys 2048 Jul 31 1999 ./ drwxr-xr-x 16 root sys 2048 Jul 31 1999 ../ -rw------- 1 kmem kmem 0 Jul 31 1999 aculog drwxrwxr-x 2 tty tty 2048 Jul 31 1999 log/ drwxrwxr-x 2 tty tty 2048 Jul 31 1999 passwd/ -rw-rw-rw- 1 operator kmem 0 Jul 31 1999 spellhist -rw-r--r-- 1 root kmem 0 Jul 31 1999 utmp -rw-r--r-- 1 root kmem 0 Jul 31 1999 utmpx -rw-rw-r-- 1 tty tty 0 Jul 31 1999 wtmp -rw-rw-r-- 1 tty tty 0 Jul 31 1999 wtmpx ./log: total 4 drwxrwxr-x 2 tty tty 2048 Jul 31 1999 ./ drwxrwxr-x 4 root sys 2048 Jul 31 1999 ../ ./passwd: total 4 drwxrwxr-x 2 tty tty 2048 Jul 31 1999 ./ drwxrwxr-x 4 root sys 2048 Jul 31 1999 ../ # 長くってすみません |
rosegadenさん 回答どうもありがとうございます。 おっしゃる通り、空のファイルを作っただけで起ち上げに成功しました! あーよかった。 L1というのはKeybordについているのですか? その他色々わからないTerminologyがあるのですが、その辺は またゆっくり調べてみます。 ご指導どうもありがとうございました! |
はじめまして 実は今Linuxでデーモンプログラムの勉強をしてるのですけど、 よくわかりません。 デーモンプログラムってループして実行時に&でバックグラウンド でいいんでしょうか? HP探しててもサンプルソースが見つからないし‥ よろしかったら教えて下さい。お願いします。 |
> デーモンプログラムの勉強をしてるのですけど まずはここを読んで下さい。結構面倒です。 http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC16 実行時に明示的に & でバックグラウンドにしなくても、 自力でデーモンとして常駐 (って UNIX ではあんまり 言わないか) するのが望ましい挙動です。 ところで Netscape6 が出ましたね。 http://www.netscape.com/index.html |
68user さんありがとうございました。 自分はデーモンについての知識がまだたりませんね。 HPを見て勉強します。 |
お忙しいところすいません。初めまして、はぴおと申します。 ネットワークプログラミング大変分かりやすく、勉強させて いただいております。 このサイトを参考にPerl(CGI)でPOP3クライアントをつくったのですが、 一つだけ分からないことがあります。 色々な本やサイトを見ても、FROMヘッダーにはメール送信者の名前と メールアドレスが入ると思うのですが、自作POP3クライアントで メールを受信した場合、FROMヘッダーにはメール送信者名しか入りません。 同じメールをOutlookで受信してみると、同じメールでもちゃんとFROM ヘッダーに、メールアドレスが付加されてました。 以下自分の推測なのですが、色々と理由を自分なりに考えてみました。 ・自作POP3クライアントが正しくメールを受信できていない。 ・正しくメールを受信できているが、ほかにやらなければいけないこと がある 昨日一日、色々なサイトをまわったり、本を調べたり、MLで聞いて みたりしましたが、分かりませんでした。 藁にもすがる思いでココに書き込んでます。 どうかご意見をお聞かせ下さい。 それでは宜しくお願いします。 以下参考になるか分かりませんが、私の環境です。 -OS: WIndows2000 -Perl : ActivePerl Build 620 -apache_1_3_12_win32 はぴお lovex@bd.mbn.or.jp |
初めて投稿させていただきます。 UNIX歴2か月の初心者で 今初めてシェルプログラミングに挑戦してます。 作成したいものは、lastcommで前日のログ履歴を出し、管理者宛にメールを 送るというものなのですが早速つまずいてしまいました。 現在の日付(MON,DAY)を取得するまではできるのですが、”前日”をどうやって表現すればいいのかわからず困っています。 DAYを-1しようとしたのですがうまくいきません。 以下のように記述しています。 どなたかご存知の方、ご教授お願いします。 LANG=C; export LANG BUF= set `date` echo $2 # "Nov"と表示されます echo $3 # "15"と表示されます expr $3 -1 > $BUF # expr: syntax errorになります |
68userさんいつも助けていただいて感謝です。 case Expose: while (1){ if ( ! XCheckWindowEvent(display, window, ExposureMask, &event) ){ break; } これを使ってみたところちゃんと一回だけ描画してくれました。 こんな関数もあったんですね。 勉強不足で申し訳ありません。 根本的に解決できなくても動いてくれれば とりあえずは解決したと思っておきます。 本当にありがとうございました。 またお世話になるかもしれないですが、 そのときはよろしくお願いします。 |
初めましてbookと申します。 UNIXのgccで作成したライブラリを、CCでコンパイルを行う時に 使用できるのか調査しています。 gcc -c share_test.cc ar cr libtestshare.so share_test.o ranlib libtestshare.so CC test_gcc.cc -L. -ltestshare 現状は、ライブラリ内の関数を呼び出す箇所で、 コンパイルエラーになってしまいます。 そもそも、このような使い方が出来るのかどうか、 ご存知の方がいらっしゃいましたらご教授ください。 よろしくお願いします。 |
> ”前日”をどうやって表現すればいいのかわからず困っています。 > DAYを-1しようとしたのですがうまくいきません。 > expr $3 -1 expr $3 - 1 です。- と 1 の間にスペースが必要です。 しかし、これだと毎月1日に実行すると 0日となって しまうので、根本的にまずいです。というわけで、-v オプションを使いましょう。 % date -v-1d で1日前の日付が得られます。ただし、Solaris などの date には -v オプションはないので、sh でやるなら perl などを呼び出すのがいいでしょう。 # なので、最初から perl で書くのも手です。 > 現状は、ライブラリ内の関数を呼び出す箇所で、 > コンパイルエラーになってしまいます。 どういうエラーが出るのかちゃんと書きましょう。 FreeBSD と Solaris ではこの方法でうまく動きました。 あと、これは static link 用のライブラリですので、 拡張子は .so より .a が適切でしょう (違うかなぁ?) > 自作POP3クライアントでメールを受信した場合、 > FROMヘッダーにはメール送信者名しか入りません pop は、ただ単にヘッダとボディを送信するだけです。 From がどうだとか Subject がどうだとか、そういう データ内部には立ち入りません (基本的には)。 Outlook で「メールのソースを表示」したものと、 自作 pop3 クライアントの出力の、From: 周辺を両方 見せて下さい。 |
前日の日付取得の件 68userさん、ご教授ありがとうございました。 Solaris環境なのでシェルで作成するのはやめます。 perlも少し触ったことがあるのですがC言語の方が経験が長いので Cで作成しようと思っています。 が、一般的 or perlの方が効率的なのでしょうか? |
68userさん、早速のレスありがとうございます。はぴおです。 ちょっと長くなってしまいますが、同じメールを自作POP3クライアントと Outlookのそれぞれで受信したソースを載せておきます。 なんか"<"、">"の部分だけが読み込めてない感じです。 それではよろしくお願いします。 [自作POP3クライアント] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for ; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" To: "kimura" Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 test [Outlook Express] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" <lovex@bd.mbn.or.jp> To: "kimura" <lovex@bd.mbn.or.jp> Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 Status: RO test |
68userさん、さきほどは説明不足ですみませんでした。 エラー内容と環境を書いておきます。 よろしくご教授お願いします。 gcc -c share_test.cc ar cr libtestshare.so share_test.o ranlib libtestshare.so CC test_gcc.cc -L. -ltestshare test_gcc.ccは読み込んだライブラリ内の関数を呼び出しているだけです。 ###################### エラー内容 ###################### 未定義の 最初に参照している シンボル ファイル ShareTest::get(void) test_gcc.o __builtin_delete ./libtestshare.a(share_test.o) __rtti_user ./libtestshare.a(share_test.o) ShareTest::~ShareTest(void) test_gcc.o ShareTest::ShareTest(void) test_gcc.o ld: 重大なエラー: シンボル参照エラー。 a.out に書き込まれる出力はありません ###################### 使用環境 ###################### Kernel Architecture is sun4u OS Name is SunOS OS Version is 5.6 OS Distribution is Japanese Solaris 2.6 HW:2 s297s_hw2smccDesktop_09b SPARC Kernel Version is SunOS Release 5.6 Version Generic_105181-17 [UNIX(R) System V Release 4.0] |
> gcc -c share_test.cc > CC test_gcc.cc -L. -ltestshare ああ、CC って typo かと思っていたら、C++ なのか…。 # C++ は完璧に忘れたなぁ。Hello world さえ作れないです。 おそらく gcc と CC でクラス/メソッドのシンボル名の 命名規則が違うのが理由だとは思うのですが、意図的に gcc と Sun の CC を混在して使っているのですか? gcc (g++) か CC に統一できない理由があるので、調査 しているということですよね? もしそうなら、すいませんがわかりません。gcc の オプションで指定できるのかもしれませんが…。 > なんか"<"、">"の部分だけが読み込めてない感じです。 もしかして CGI として動かして HTML を吐いていませんか? んでもって < > & を (< > & に変換せず) その まま出力していたりしませんか? 根拠は以下の通り。 1. received の <〜> も出力されていない for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) for ; Wed, 15 Nov 2000 17:20:05 +0900 2. でも Message-ID は出力されている。 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> タグは英文字から始まる。数字が先頭にくることはない。 > が、一般的 or perlの方が効率的なのでしょうか? 僕なら間違いなく perl でやりますが、まぁそれはお好きな方で。 ちなみに sh からだと set `perl -e 'print scalar(localtime(time()-60*60*24))."\n"'` です。 |
> % date -v-1d > で1日前の日付が得られます。ただし、Solaris などの > date には -v オプションはないので、sh でやるなら > perl などを呼び出すのがいいでしょう。 このオプションは知りませんでした勉強になりました。 > Solaris環境なのでシェルで作成するのはやめます。 あきらめるのは早いです。 #!/bin/sh LANG=C set `date` year=$6 mon=$2 date=$3 if [ `expr $year % 4` = "0" ] ; then is_leap="YES" fi if [ `expr $year % 100` = "0" ] ; then is_leap="NO" fi if [ `expr $year % 400` = "0" ] ; then is_leap="YES" fi date=`expr $date - 1` if [ "$date" = "0" ] then case $mon in Jan) mon="Dec" date=31 ;; Feb) mon="Jan" date=31 ;; Mar) mon='Feb' if [ "$is_leap" = "YES" ]; then date=29 else date=28 fi ;; Apr) mon="Mar" date=31 ;; # 以下略 *) ;; esac fi echo The yesterday is $mon $date. なんていう面白味も芸もないスクリプトなら Solaris でも動くんじゃないかと 思いますよ。 もっとも、 > 作成したいものは、lastcommで前日のログ履歴を出し、管理者宛にメールを > 送るというものなのですが早速つまずいてしまいました。 この用途なら、日付の計算は不要で前々日分までの lastcomm のログの バックアップをとっておいて、前日分との差分を diff でとるという方法もあります。 (ただし、lastcomm のログなので、GB 単位になってもおかしくないのですが。) FreeBSD なんかのセキュリティチェックは全部前日分までのバックアップと 本日分のログの差分抽出でやっていますね。 # また長くなりすみません。 |
> あきらめるのは早いです。 うーん、ごもっとも。恥ずかしながらこういう 方法には全く気づきませんでした。 |
68userさん、ご教授ありがとうございました。 gccのオプション調べてみます。 |
こんにちは、はぴおです。 68userさんレスありがとうございました。 非常に恥ずかしい話ですが、68userさんのおっしゃる通りです。 何で気が付かなかったんだろうか??? ありがとうございました! HTTP、SMTP、POP3ができたので、今度はFTPをやろうかと 思います。 |
お世話になります。 実は今、C言語でCGIの勉強をしているのですけど、 CGIのデバッグってどうやるんでしょうか? もしかして、動作確認はいちいちブラウザで確認するしかないのですか? つ、つらい‥ なにか、効率的なデバッグ方法を知っていらしたら 教えて下さい。お願いします。 |
> もしかして、動作確認はいちいちブラウザで確認するしか > ないのですか? まさか :-) CGI というのはインタフェースです。 ブラウザからの情報を、環境変数と標準入力経由で プログラムに引き渡すインタフェース。それが CGI。 だから、 % env REQUEST_METHOD=GET QUERY_STRING='hoge=1&fuga=2' ./foo.cgi とか % set content='number=123&str=%21%22%23' % echo -n $content | env REQUEST_METHOD=POST CONTENT_LENGTH=`echo -n $content|wc -c` ./foo.cgi とかとか、 #ifdef DEBUG #define INPUTFILE_FOR_DEBUG "debug.txt" { char tmp[128]; struct stat sb; setenv("REQUEST_METHOD", "POST", 1); stat(INPUTFILE_FOR_DEBUG, &sb); sprintf(tmp, "%d", sb->st_size); setenv("CONTENT_LENGTH",tmp , 1); freopen(INPUTFILE_FOR_DEBUG, "r", stdin); /* この使い方合ってるっけなぁ… */ } #endif とかとかとか。 |
こんにちは。 掲示板のファイルに書きこむ部分で、 「web と CGI のひみつ」の「掲示板を作ろう (2)」の最後にある テンポラリファイルに書き込んでからrenameする方法いいなと思ったのですが、 これだとrenameするときに衝突する可能性ありますよね? http://www.wakusei.ne.jp/twn/wwwlng.cgi?print+200003/00030031.txt ここにあるcheck-lockスクリプト(いつもありがたく使わせていただいてます m(_ _)m ) でやってみようと思うのですが、うまくrename時の衝突を回避する方法があればご教授ください。 |
http://x68000.startshop.co.jp/~68user/net/sample/echo-server-1.c このコードのバグを見つけました。 コンパイルして動かすとacceptで失敗するのでこっちの設定が 悪いんだろうと思ってFreeBSD関連のメーリングリストを 検索していたら原因がわかりました。 connected_socket = accept(listening_socket.... の上に len = sizeof( sin ); が必要です。 バグの理由は http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/43141 です。 |
はじめまして。 No.1389の指摘のついでですが len = sizeof(peer_sin); は、いらなんじゃないですか? バグの理由でも書かれてるとおり acceptの第3引数は、入出力両用ですので 帰ってきた値をそのまま使うのが正しいと思うのですけど。 |
> len = sizeof( sin ); > が必要です。 なるほど、確かに FreeBSD 4.2-BETA で動かすと accept に 失敗していました。これまではたまたま動いていたわけですね。 修正しておきます。ありがとうございます。 > len = sizeof(peer_sin); > は、いらなんじゃないですか? こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 Getpeername() returns the name of the peer connected to socket s. The namelen parameter should be initialized to indicate the amount of space pointed to by name. On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small. > これだとrenameするときに衝突する可能性ありますよね? えっと、あの例では rename は使っていません。あの後 排他処理に ついて書くつもりでしたが、時間がなくて全く手を付けていません。 > うまくrename時の衝突を回避する方法があればご教授ください。 もし rename でやるとしても、それ以前に複数のプロセスが tmp_file へ同時に出力しようとする可能性があるので、あの 部分全体を排他する必要があります。 で、方法ですが、適当なロックファイルを用意して排他処理を 行えばよいです。flock でも symlink でも mkdir でも rename でも 何を使っても構いません。 |
返事どうもありがとうです。 > えっと、あの例では rename は使っていません。 よく見てませんでした。申し訳ないです。。 > もし rename でやるとしても、それ以前に複数のプロセスが > tmp_file へ同時に出力しようとする可能性があるので、あの > 部分全体を排他する必要があります。 なるほど。そこで、お教えいただいた通りにちょっと改造してみました。 # 毎回違う名前で作る $tmp_file = 'bbs'.$$.'.tmp'; open(TMP_OUT,"> $tmp_file"); print TMP_OUT "発言者: $from<BR>\n"; print TMP_OUT "$now_date $host<BR>\n"; print TMP_OUT "$message<HR>\n"; open(IN,"$data_file"); while (<IN>){ print TMP_OUT $_; } close(IN); close(TMP_OUT); # tmp_file の内容を $data_file にコピーするだけ #open(TMP_IN,"tmp_file"); #open(OUT,"> $data_file"); #while (<TMP_IN>){ # print OUT $_; #} #close(TMP_IN); #close(OUT); # コピーのかわりに、$data_fileにrename # その前に排他処理。 $lock_file = 'bbs.lock'; touch($lock_file); open(IN,"$lock_file"); flock(IN, 2); rename($tmp_file, $data_file); close(IN); unlink($lock_file); # 必要ない?? これで完璧ですか?? 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 改善点があればご教授くださいませ。 長文すみませんでした。 |
>> len = sizeof(peer_sin); >> は、いらなんじゃないですか? >こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 失礼しましたぁ。。勘違いです。 きっちりしたサイズを指定しなくてもよかったんですね。 小さい場合は切り詰めるって仕様も最初は意味不明でしたが、 よく考えると最低でもアドレスファリは所得できそうなので有用ですね♪ |
いつもすいません、ふくしです。 LDAP の使い方でこんなことができるかどうかどなたか相談に乗ってください。 Microsoft Exchange Server のアドレス帳で、集団のアドレス (営業部 <markettng@nantoka.org とか)があって、 そこに送るとたくさんのひとに (yamada.tarou@nantoka.org、satou.hanako@nantoka.net、、)に 行くようになっているとき、組織名を渡してこの構成員一覧を返す アプリケーションを作ろうと思っています。 Exchange は LDAP を受け付けるときいたので、 Perl に Net::LDAP をインストールして、 サンプルをいじって使ってみたのですが、 marketting というメール アドレスが「ある」ことはわかるところまで いったのですが、その内容まではわかりません。 ご存じの方がいらっしゃいましたら、よろしくお願いします。 |
ちょっと前にHTTPのセパレータの話がありましたが、 どうも最近の携帯の中には、\r\nにしか対応していないものもあるようで、 友人からの「携帯からアクセスできない」との苦情に対応方法がわからず、 「まさか」と思いつつもこれまで\n\nとしてきたセパレータに\r\nを加えてみたところ、 ちゃんと読んでくれるようになりました。 これはうちのサーバの設定の仕方がおかしいんでしょうか。 (普通は\r\nに勝手に変換してくれるものなんですか?) それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 |
どうもこんにちは、 Winsock初心者のYOUと申します。 ソフトバンクの、「Winsock2.0プログラミング」という本を 買ってきたのですが、手始めに、サンプルのCH02->Hostinfo をビルドしようとすると、以下のようなエラーが出てしまいました。 プロジェクトへのリンク等には、特に何も指定していません。 どうすれば、解決出来るのでしょうか。 --------------------構成: Win - Win32 Debug-------------------- リンク中... Hostinfo.obj : error LNK2001: 外部シンボル "_WSACleanup@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAStartup@8" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_ntoa@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAGetLastError@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyaddr@12" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyname@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_addr@4" は未解決です LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 link.exe の実行エラー Win.exe - エラー 9、警告 0 よろしくお願いします。 |
はじめまして。Elmoです。 telnetでポート80を指定して、”GET”と”Host:”を実行するシェルスクリプト(bash)を作成したいのですが、どうやって、シェルからGETとHost:を実行すればいいのかわかりません。ちなみに、”echo”とパイプを使用してみましたが出来ませんでした。 わかる方、教えて下さい!! |
has 殿へ。11/25 (土) に行けたら行きます。仕事次第。 では手短に。 > (普通は\r\nに勝手に変換してくれるものなんですか?) apache だと変換してくれないですね。 > それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 です。でもうちではやってません。いけませんなぁ。 > LDAP の使い方でこんなことができるかどうかど LDAP は勉強しようとしたことはありますが、どうやっても LDAP サーバをあげられず断念しましたので、わかりません。 でも、get_values とかでダメですかねぇ。 > .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 僕は Windows の開発環境を持っていないので、わかる方に おまかせします。 > 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って > どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 試してませんが、心配ならば open(IN,"> $lock_file") と すればいいでしょう。 あと、ロックを開始する場所は open(TMP_OUT,"> $tmp_file"); です。rename の部分だけロックすると、ファイルは壊れませんが 同時に発言しようとしたとき、一方の発言が反映されないです。 それから、失敗する可能性のある場所では、エラーチェックを 必ずしましょう。例えば、OS によってファイルを同時にオープン できる数というのは決まっているので、それを越える open は 失敗します。もし open(IN,"$lock_file"); が失敗したらその後の flock も無意味になり、ロックが働きません。 > telnetでポート80を指定して、”GET”と”Host:”を実行する > シェルスクリプト(bash)を作成したいのですが (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com") | telnet foo.bar.com 80 てな感じで。 |
改行が足りてない。 (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com"; echo ) \ | telnet foo.bar.com 80 でした。 |
はじめまして。 プログラミングは超初心者で、ここで質問して回答してもらえるのかどうか もわからないのですが、もし答えていただけるならば教えてください。 HTMLにJPGやGIFを貼り付けているのですが、マウス右クリックで 「画像を名前をつけて保存」ってできてしまいますよね。これを保存できな くする方法ってあるんですか?拡張子を変える、とか。 よろしくお願いします。 |