いつもお世話になっています。 私の質問掲示板に.htaccessのdenyについての質問がきたのですが..,。 68userさん、ちょっと見てもらえますか。よろしくお願い致します。 http://www.parkcity.ne.jp/~chaichan/qanda/qa246.htm |
どうも、ご無沙汰しております、yujiです。^^ 現在、ソケットファイルを作成したいのですが、 その方法がわからず、困っております。 UNIXドメインソケットファイルの使い方はいろいろなサイトに記述されて いるのですが、根本となるUNIXドメインソケットファイルの作成の 仕方について触れているサイトを見つけることができませんでした。^^; もしなにかご存知でしたら、どうぞよろしくお願いします。 それでは、また。^^ |
どうも、yujiです。^^ 下の記事の訂正なのですが、 簡単にUNIXドメインソケットファイルを 作成するコマンドはないのかなと思いまして。 すいませんが、よろしくお願いします。 |
@ちゃいぱさん > 私の質問掲示板に.htaccessのdenyについての質問がきたのですが..,。 > 68userさん、ちょっと見てもらえますか。 えっと、こういう形での回答依頼はご勘弁を。答えたければ 答えるし、興味がなければ/知らなければ答えない、ということで。 今回の件に関しては、既にどなたかが書いておられますが deny from .XXXXX.ocn.ne.jp というふうに先頭に . を付けるか、ホスト名が逆引きされて いないならIP アドレスでの制限をする、くらいしか思い 付きませんでしたが、 deny from dion.ne.jp がうまくいっているなら外れっぽいですね。後は「どうやって うまくいかないと確認したのか。その確認方法が間違っている のではないか」くらいでしょうか。 @yuji さん > 簡単にUNIXドメインソケットファイルを作成するコマンドは > ないのかなと思いまして。 多分ないと思います。FIFO (名前付きパイプ) とは違って、ソケット ファイルはサーバ側のプロセスが必ず存在していなければいけない ので (必ずソケットに bind されていないといけない)、仮に 「作成するコマンド」があったとしても、その「ソケットファイルを 作成したプロセス」が終了した瞬間にソケットファイルは無効となります。 # という説明でいいのかしら…。FIFO は mkfifo や mknod コマンドで # 作れます。念のため。 |
いつもお世話になっています。 > こういう形での回答依頼はご勘弁を。 すみません、ついあまえちゃって、68userさんに振ってしまう私です...。 切り札使いすぎました。以後、気を付けます。 > その確認方法が間違っているのではないか 質問者に尋ねて見ます。 いつもながら、アドバイスありがとうございます。 違う意味で、今後もよろしくお願い致します。 |
http://virtys.virtualave.net/cgi-bin/so.cgi こーゆー、SNMPに外部からアクセスできるかどうかを調べるには、 どしたらいいですか? Perlでやりたいんですが。。 UNIXのコマンドとかあるのかな? |
掲示板ですが、こんな感じでどうでしょうか。 http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi 「管理者モード」というのを追加しました。パスワードは 「abc」です。管理者モードからは、記事の削除、キャッシュの削除、 各種カスタマイズができます。 テスト用なので、好きにいじっていただいて構いません。 has からは > 消したいキャッシュをマークしてから[削除]とかのボタンを > 押すと消せる、というような感じがいいです。 という要望を頂いておりますが、使いやすいインタフェースが 思い付かず、未実装です。よさげな案があれば提案してもらえますか? 動作チェック・キャッシュ情報は、web 上からの設定変更で 一般に公開しないモードにできるようにしました。 それと、管理者用のパスワードですが、CGI 経由で設定 できるようにすると、CGI が nobody/www 権限で動く場合、 どうやってもセキュリティホールが出きてしまうので、 面倒ですが直接スクリプトを手で書き換えるようにしています。 あと、ちょっと手を広げすぎて、バグがたくさん残ってますので、 現在のバージョンは未完成品です。 @yamama さん > SNMPに外部からアクセスできるかどうかを調べる 残念ながら SNMP は全くわからないのでパスです。 |
掲示板、さっそくテスト書き込み・削除をしてみました。 管理モードで一気に堕落しそうです :-P 自分のところでもテストで設置して試してみます。 |
@yamamaさん おそらく対象サーバのSNMPのポートにアクセスして、 publicで情報が引っぱれるかどうかチェックしているだけでしょう。 要はSNMPクライアントの簡易版を実装しているんだと思います。 多分コマンド一発でお手軽に、みたいなのは無いと思いますが ほぼ決め打ちで行けると思うのでそんなに面倒でもないと思います。 もちろんperlでも可能ですが、最低SNMPの認証部分のプロトコルを 解っていなければいけないでしょうね。 |
@68user > という要望を頂いておりますが、使いやすいインタフェースが > 思い付かず、未実装です。よさげな案があれば提案してもらえますか? たとえば"checkbox"を使って、 <INPUT NAME="check" TYPE="checkbox" VALUE="1">キャッシュ1<BR> <INPUT NAME="check" TYPE="checkbox" VALUE="2">キャッシュ2<BR> 連想配列/パーサの都合で困難そうであらば、 <INPUT NAME="check1" TYPE="checkbox" VALUE="x">キャッシュ1<BR> <INPUT NAME="check2" TYPE="checkbox" VALUE="x">キャッシュ2<BR> なんていう風なのを想像してたんですけど、どうですかね? # "checkbox"なのに名前が全部違うってのはきれいじゃないか… |
> たとえば"checkbox"を使って、 やってみました。削除するなら最近の発言を削除することが 多いだろう、ということで http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi?mode=admin&passwd=abc こんな感じ。どんなもんでしょ? さらに前のは「前の50件」ボタンで 表示できるようにするつもりですが、未実装です。 あと、 > 消したいキャッシュをマークしてから[削除]とかのボタンを > 押すと消せる、というような感じがいいです。 これって s/キャッシュ/ログファイル/ の typo じゃないかと 思っていたのですが、キャッシュも checkbox で選択して 消したい、ということですか? スクリプトに書いてある「TODO」の部分が今後の課題です。結構増えました。 http://X68000.startshop.co.jp/~68user/tmp/wwwboard.txt というわけで、どうも2、3日中に完成しそうにはありませんねぇ。 |
現在、cronが自由に使えるレンタルサーバを探しています。知っている方いませんでしょうか。プロバイダは別に入っているので、ホームページ作成用として考えています。 |
@68user > 思っていたのですが、キャッシュも checkbox で選択して > 消したい、ということですか? きちんと説明していなくてスミマセン。 そうです、キャッシュの削除の話でした。 ところで、発言の編集については実装なしですか? あと、閲覧者の側から出力文字コードの指定(km=euc|jis|sjis等)が できるようになると、携帯からも見られるようになるのでうれしいです。 > というわけで、どうも2、3日中に完成しそうにはありませんねぇ。 ゆっくりやっていただければ、と思います。 「やる気が失せた」という言葉を聞くのが一番恐いです;-) |
こんばんわ。 HTTP クライアントを作ってみようで書かれてたものを そのままをコピーしてCGIとしてvirtualave.netに設置したんです。 そこで問題が! 設置したサーバーと同じサーバーに置かれてるファイルは ちゃんとダウンロードできないんですよ。 404になってしまいます。 これは一体どういうことなんでしょうか? 考えられる事がありましたら教えて頂きたいです。 |
書き忘れです。 他のサーバーに置かれてるファイルは ちゃんとダウンロードすることが出来ます。 |
http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1131から始まる一連のトピックで、同じ問題が取り上げられています。 |
どうもありがとうございました。 おかげで出来ました。 過去ログに書いてあった、 セパレータが CR でも LF でも CR LF でも認識できるようにする ってのはどうすればいいんでしょうか? ちょっと頼りすぎですかね?(^^; |
シスログについての質問です。 よろしくお願いします。 サーバが現在UNIXサーバ2台(サーバA、サーバB)があり、 サーバAのシスログの一部をサーバBに転送するように syslog.confの設定を行なっています。 こうすると、サーバBに転送されるログのうち 日本後でメッセージが記述されたものは 文字化けを起こしてしまいます。 転送されないログに関しては日本語のメッセージも うまく読むことができるのですが、、 もともと日本のメッセージを書く事自体間違って いるのでしょうか? 解決策をしっておられる方がいましたら よろしく御願いします。 |
@has > ところで、発言の編集については実装なしですか? > あと、閲覧者の側から出力文字コードの指定(km=euc|jis|sjis等)が > できるようになると、携帯からも見られるようになるのでうれしいです。 キャッシュファイルを作るようにした時点で、「シンプル」なんて 形容詞はどこかに飛んでいってしまったので、こうなったら全部 実装しまっせ。 文字コードの指定ってのは、どういう風にするのがよいですか? 携帯から文字コードを指定するときに、どういうインタフェースに したらよいか、いまいち想像できんです。 @あつしさん > 日本後でメッセージが記述されたものは文字化けを起こしてしまいます。 UNIX と言ってもいろいろありますが、OS は何ですか? エンコーディングには EUC/JIS/SJIS などがありますが、 どれを使っていますか? 他のエンコーディングにしても ダメですか? あと、どういうふうに化けますか? > もともと日本のメッセージを書く事自体間違っているのでしょうか? どうなんでしょうねぇ。個人的には気持ち悪いので日本語は使い ませんが、いまどき 8bit スルーじゃない syslogd もどうかと思います。 # あっちの人たちも 8bit 目が立ってる iso-8859-1 (Latin-1) を # 使ったりしないのかしら。 |
おっと見逃してた。 > セパレータが CR でも LF でも CR LF でも認識できるようにする > ってのはどうすればいいんでしょうか? m/^\r\n$/ and last; # 改行のみの行ならループを抜ける で、CR (\r) LF (\n) がくるとヘッダの終了とみなしています。 なので、CR か LF のみの行でもヘッダの終了とみなすように すればよいです。 # chomp して last if $_ eq '' でもいいんですが。 |
はじめまして。 私は今、Redhat linux6.2を使用し、パスワード変更プログラムを作成しています。 expectスクリプトをCGIより起動させ、コマンドレベルでユーザーアカウントを変更しようとしているのですが、簡単すぎるパスワードだと変更することができません。端末から普通にコマンドを入力しても拒否されるpasswdコマンド。これを簡単なパスワードでも受け入れられるようにするにはどうしたらいいのでしょうか。ぜひお教えください。 |
@68user > 文字コードの指定ってのは、どういう風にするのがよいですか? > 携帯から文字コードを指定するときに、どういうインタフェースに > したらよいか、いまいち想像できんです。 携帯の場合、sjisであれば日本語として表示することができるので、 USER_AGENTなどから携帯からのアクセスかどうか判定して、 勝手にsjisにしてくれる(私の場合は表示形態も切り替えている)、 ってのも便利かと思いますが、 wwwboard.cgi?km=sjis とかって指定するのでもいいかと思います。 |
@68userさん HTTPはResponseヘッダとボディの間はCRLFで区切るって 規定されてませんでしたっけ。 #さっきnews.yahoo.co.jpのうち一つで試してみたら、 #ちゃんとCRLFで区切られてました。 ちょっとだけ気になったので。 #もちろん、内容のわかっている規定違反をしているサーバには #対応しておくべき、というのが正しい道なのはわかります。 #できれば歩きたくない道ですが(笑 @超初心者さん おそらくPAMでcracklibが有効になっていると思われるので、 これを無効化するか、パスワード変更プログラムをsuid rootすれば できるようになるでしょう。 その辺を調べてみてください。 ただ、セキュリティ的には間違いなく「改悪」なので 止めておくことをお勧めします・・・。 |
ほんとしょうもない質問ですみません。 Print Screen機能を使って画面を印刷したいんですが、 どうしたらいいのでしょうか。 教えてください。 |
-u 同一内容の行は1度しか表示しない。 % cat sample | sort abc def def ghi % cat sample | sort abc def (同じ行は一度しか表示しない) ghi 2回目に-uが入ってないのでは 初心者なので違っていたら済みません。 |
> 簡単すぎるパスワードだと変更することができません。 root なら「パスワードが簡単すぎるぞ」と怒られても、再度 同じパスワードを入力すればムリヤリ変更できますが、一般 ユーザでは hsj さんの書かれたようなことをしない限り、 無理でしょうね。 > HTTPはResponseヘッダとボディの間はCRLFで区切るって > 規定されてませんでしたっけ。 です。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1135 の書き方はちょっとアレなので、書き直すと、 http://news.yahoo.co.jp/headlines/top/ のヘッダ/ボディのセパレータは LF になってます。 00000000 48 54 54 50 2f 31 2e 30 20 32 30 30 20 4f 4b 0a |HTTP/1.0 200 OK.| 00000010 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 65 |Content-Type: te| 00000020 78 74 2f 68 74 6d 6c 0a 43 6f 6e 74 65 6e 74 2d |xt/html.Content-| 00000030 4c 65 6e 67 74 68 3a 20 31 39 31 30 33 0d 0a 0a |Length: 19103...| 00000040 3c 68 74 6d 6c 3e 0a 3c 68 65 61 64 3e 0a 3c 21 |<html>.<head>.<!| > Print Screen機能を使って画面を印刷したいんですが、 Print Screen キーを押したら、xwd コマンドを実行するように、 ウィンドウマネージャを設定するのが一番簡単そうです。 > 2回目に-uが入ってないのでは ですね。御指摘どうもです。次回更新時に修正しておきます。 |
はじめまして。 今、procmailを用いて転送制限の設定を行っているのですが 添付ファイル付きのメールを転送しない設定ができません。 ある雑誌に載っていた方法を試したのですが、どうもうまくいきません。 :0 c * !Content-Type:.*multipart !転送先メールアドレス 資料に目を通した限り、うまくいきそうな感じがするのですが 間違いなり、さらにうまい方法があるならばお教えください。 お願いします |
追記します。 下記の例は、添付ファイルがついていた場合 メール転送しないという意味で書いています |
68userさん、hsjさん。返信ありがとうございます。 やはりそうですか・・・。 さすがにセキュリティを下げると問題があるので、コマンドレベルから やることは破棄せざるをえなくなりました。 その代替となると、passwdコマンドのソースを研究するしかないのかもしれませんね。どこかにそんなことを詳しくのっている場所はないでしょうか? 現在自分自身でも検索中です。 |
@68userさん スミマセン、ぼくの確認方法が正しくなかったようです。 確実な方法で確認したところ、確かにnews.yahoo.co.jpは LFしか返してきませんね。はー > http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1135 > の書き方はちょっとアレなので、書き直すと、 > http://news.yahoo.co.jp/headlines/top/ > のヘッダ/ボディのセパレータは LF になってます。 こっちの意味は取り違えてなかったんですが(苦笑 @超初心者さん いやそうではなくて、ユーザが任意の文字列を選ぶ際に、 その文字列のパスワードとしての強度を(ある程度)判定してくれる物を 取り除いてしまうこと自体が「改悪」だと言う意味です・・・。 |
お礼が遅れてすいませんでした。 てっきり頼り過ぎたので無視されたと 思って掲示板を見てませんでした(^^; なるほど、良く分かりました。 ありがとうございました |
> 超初心者 > 超メール初心者 > 超ビギナー こういうハンドルはやめてください。そこまで匿名性を 求めるならば、www.2ch.net などを利用してください。 > 今、procmailを用いて転送制限の設定を行っているのですが > 添付ファイル付きのメールを転送しない設定ができません。 まずは ~/.procmailrc の先頭に LOGFILE=$HOME/procmail-log などと書いて、ログを取りましょう。原因究明はその後です。 > passwdコマンドのソースを研究するしかないのかもしれませんね。 まぁそうなりますが、passwd は人間様が対話的に使うコマンド なので、*BSD ならスクリプト向きの pw コマンドってのが あります。これは root での使用を前提としているので、 指定したパスワードをそのまま設定してくれます。Redhat Linux にも、その手のコマンドがあるかもしれません。 で、以下のようなスクリプト #!/usr/bin/suidperl $username=$ARGV[0]; $newpasswd=<STDIN>; chomp($newpasswd); echo $newpasswd | pw usermod -n $username -h 0 を passwd_change という名前で保存して、 # chmod 4755 passwd_change # chown root passwd_change しておけば、誰でも % echo newpasswd | passwd_change username で変更できます。 もちろんこのままでは、セキュリティもへったくれもないので 何かしらの制限を付けないといけません。 @has 文字コードの件、了解です。 |
どうも皆さん始めまして。 私は最近Cygwinでプログラミングの勉強を始めました。 Linuxのことはまだほとんどわからないので2つ同時に 勉強しなければならないので大変です(^_^;) で、インターネットで拾ってきたいろんなサンプルソースを コンパイルして遊んでるんですが、LinuxとWin32での ソースレベルでの互換性に疑問があります。 たとえば、あるサンプルソースの場合、シリアルポートにアクセス するのに #makefile SERIALDEVICE = /dev/ttyS0 #tool.c /* setup serial port */ void open_serial(char *devicename) { struct termios newtio; dfd = open(devicename, O_RDWR | O_NOCTTY); if (dcfd < 0) { perror(devicename); exit(-1); } open_serial(SERIALDEVICE); という具合にデバイスをオープンしているのですが、 このソースをWin32アプリとしてコンパイルしても当然(?)動きません。 で、SERIALDEVICEの部分を COM1 に変えて見たのですが、これも 動きませんでした。 他のファイルやソースを眺めてみても、良くわからないのですが、 この場合、Win32で動作させるにはどのようにすべきなのでしょうか? |
ども、はじめまして。雅人と言います。 質問なのですが 掲示板をつくろう(1)でperlを書くならEUCで書くべきと 書かれてたのでSJIS(CRLF)からEUC(CRLF)に変換したところ 逆に文字化けが起こってしまいました。 ローカルな環境(win95)でもアップロード先(virtualave.net) でも文字化けが起こってしまいます。 これの原因とは一体なんなのでしょうか? よろしくお願いします。 |
超メール初心者あらため宗佑です。 procmailの転送設定、自己解決しました。 記述が足りなかっただけでした。 うーん、奥が深いですね、メール転送。 これからスクリプトを徐々に複雑にしていこうと思います。 でもprocmailを記述しているHPって少ないものなんですね。 載っている例も基本的なものです。 私も自分で試している途中ですが、procmailの達人みたいな例の 載っているHPをどなたかご存知内でしょうか? お願いいたします |
@雅人さん > ローカルな環境(win95)でも メモ帳などのエディタで化ける、ということならば EUC を読めるエディタを入手して下さい。 > アップロード先(virtualave.net) でも ブラウザの文字コード設定を「日本語 EUC」として直るならば、 CGI の出力する日本語部分が短かすぎるため、ブラウザが 文字コードを正しく解釈していないのでしょう。その場合は、 print "Content-type: text/html\n\n"; を print "Content-type: text/html; charset=EUC-JP\n\n"; として下さい。 @宗佑さん > でもprocmailを記述しているHPって少ないものなんですね。 > 載っている例も基本的なものです。 確かに少ないですね。僕もあまり見かけたことがありません。 ただ、基本的なところをわかっていれば procmailrc(5) と procmailex(5) でなんとかなることも多いです。 @Madstar さん うーん、さっぱりです。シリアルポートの操作さえしたことがないので…。 |
> print "Content-type: text/html; charset=EUC-JP\n\n"; > として下さい。 というより、Content-type ヘッダには EUC-JP/Shift_JIS/ISO-2022-JP などの charset を付加 *すべき* です。 僕のところの CGI プログラムには一部にしか付いていませんが、 これは悪い CGI の見本です。必ず charset を付けましょう。 |
どうも、ありがとうございました! 無事できました。 |
みなさん、はじめまして。海苔王と申します。 現在、ソラリス7でサーバーを構築しています。 apache,sendmail,popper と動かしてきて、昨日までは メールが動いていたのですが、突如、受信ができなくな ってしまいました。電八で出たエラーは以下のとおりです。 +OK QPOP (version 3.0.2) a ******starting. C: USER *** S: +OK Password required for ****** C: PASS ******** S: -ERR [SYS/TEMP] maillock error 3: '/usr/mail/*****' といった内容でした。sendmail.def からいろいろ見直したのですが、 うごきませんでした。どうかアドバイスお願いします。 |
チェック項目を思い付くままに。 1. /var/log/messages や /var/log/maillog に詳細なエラーは出ていないか 2. /usr/mail/ のパーミッションがおかしくなったのではないか (ls -ld /usr/mail) 3. /usr/mail/ にロックファイルらしきものは残っていないか (ls -lA /usr/mail) 4. ディスクの残り容量は (df -k)。i-node space が枯渇していないか (dk -ki) 5. ソースから grep maillock して、エラー箇所を捜し出す あと重要なのが、全ユーザでメールを取得できないのか、 一人だけメールを取得できないのかってこと。全ユーザなら 1,2,4 あたり。一人だけなら 3 をチェック。 ってな感じでしょうか。 |
>うーん、さっぱりです。シリアルポートの操作さえしたことがないので…。 残念です(T_T) まぁシリアルポートなんて今更余り使わないですよねぇ(^_^;) いろいろ検索かけてるんですが、さっぱりです。 |
>まぁシリアルポートなんて今更余り使わないですよねぇ(^_^;) DOS時代には、awkで print "AT" > "AUX" みたいな感じでモデムとお話してましたが、 Windowsではどうなんだろう…試してません(^^; |
> シリアルポート ぼくの当てにならない記憶によると、 winでシリアルポートを開くときはAPIのCreateFile()を使うはずです。 その辺を調べてみてください。 で、この辺のソースはwin系と*nix系での互換性を維持するのは 難しいところだと思います。 ぼくはCygwinは使ったことありませんが、おそらくopen()を実装するのに このAPIを使ってると思うので、もしかしたら開けるかもしれません。 が、結局フラグが違うでしょうからあまり意味無いと思います・・・。 #そもそもLinuxのopen()ってシステムコールですしね |
初めまして。 Perlの勉強をし始めたばかりなのですけど、ソケットを使ったクライアントプログラムの作り方とか…全くの初心者な私にはすごく解りやすくて、それに読みやすかったです。 全部説明しよとう難しくなってるサイトや、簡単に説明しようと補足説明が抜けてるサイトも多いですけど、このサイトの説明はとても解りやすいです。 えっと感想をここに書いて良い物かどうか解りませんが、本当に参考になりました。ありがとうございます。 |
少なくともNTであれば C:\> type CON > COM1 といった方法でシリアルポートとお話できます。 parityやbaud rate、タイムアウト等の設定は、MSDOSと同じ modeコマンドで行います。 Windows95/98のことは知りませんが、似たようなものだと思いますよ。 |
@ありしあさん お褒めの言葉ありがとうございます。でもありがたくは思いますが、 もっとありがたいのは「ここは間違っている」「ここの記述が 理解しにくかった」などの指摘です。もちろん「こういうサンプル プログラムがあるとよい」とか、単なるタイプミスのご報告でも 大歓迎です。 何かしら気づいた点がありましたら、よろしくお願いします。 と言っておきながら、これまでいくつかプログラムの不具合や 記述ミスのご指摘を頂きましたが、忙しくて web に反映できず、 誠に申し訳なく思っています。手元にあるファイルは修正して いますので、暇ができ次第更新するつもりです。 # なのに、また忙しくなってきてしまった…。 |
procmailについてあるツールformailについての 質問です。 formailを使用して自動返信設定を作成中なのですが from句を任意で指定したアドレスに変更して、返信したいのです。 今の状態を見るとユーザー名+サーバーのドメイン名といった具合になってしまいます。 これを"xxx@xxx.yyy.zzz"といった指定したメールアドレスをfrom句に入れて自動返信したいのです。そういった方法はあるのでしょうか? よろしくお願いいたします |
追記です。 現在、procmailの設定は :0 h c * !^FROM_DAEMON * !^X-Loop:your@own.mail.address | (formail -r -A"Precedence: junk" \ -A"X-Loop: your@own.mail.address" ; \ cat resmsg) | $SENDMAIL -t これだと、送信者名がUNIXのユーザー名になってしまう。 最後の$SENDMAILで送信しているから当然なのですが・・・ ので、この送信者をxxx@xxx.yyy.zzzとしたいのです。 なにとぞ、よろしくお願いします。 追伸 どなたか、linuxサーバー(Redhat 6.2)で使用可能なお勧めの 自動返信ツールをご存知でしたら教えてください。 smtpにはsendmail8.9.3を使用しています。 |
むにむに。。思ったこと。 link-check.pl 114-115行目。 &check_link(SITES=>[@sites], MAX_CHILDRED=>20); 138-143 if ( defined $args{SITES} ){ @sites = @{$args{SITES}}; } if ( defined $args{MAX_CHILDREN} ){ $max_children = $args{MAX_CHILDREN}; } MAX_CHILDRED -> ? |
>68user 様 アドバイスありがとうございました。 どうやら容量の枯渇が原因でした。 余計なものを移動したら、動くようになりました。 ありがとうございました。 |
Perlのネットワークプログラムで、サーバーとの接続が 切れた状態を検出したいのですが、LANケーブルがつながった状態で 通信できなくなった状態は検出してPerlプログラムを終了出来るのですが LANケーブルを引きぬくことによって、通信できなくなった状態はどのようにして検出したらよいのですか? 一応、Perlの中でPingをうって帰ってきた値を見て検出しようと したのですが、Perlの中のPingはRoot権限でないとエラーに なってしまいます。 Root権限以外でPingを実行する方法か、あるいは違う方法を 知っていたら教えて下さい。お願いします(v_v) |
@宗佑さん > "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です。 |