68user's page 掲示板

Prev< No. 4536〜4570> Next  [最新発言に戻る] [過去ログ一覧]
No. 4540 # べた 2006/03/17 (金) 18:50:45
nawkの使い方について教えて欲しいことがあります。
環境は、Solaris8、shです。

nawk '{
  :
    FNO=sprintf("%d",substr(FNM,19));
  :
}' ${LIT}

上記のように、ファイル名からファイルの番号を
取得し、格納しています。
"%d"を指定して数値で取得しようとしているのですが
10以上がとれません。
9のまななのですが、どこがいけないのでしょうか。

No. 4541 # 68user 2006/03/18 (土) 23:41:25
最近掲示板 SPAM がひどいので、特定文字列を含む投稿を禁止するように
しました。

>>4540 べた
FNM の内容がわからないと何とも言えないです。

No. 4542 # 68user 2006/03/18 (土) 23:55:07
>>4088 tansy
>>4191 無題
>>4225 mmm
いまさらですが、当ページのプログラムのライセンスは、特に記述がない限り、
修正 BSD ライセンスっぽいものであることを明記しました。
    http://X68000.q-e-d.net/~68user/link.html

No. 4543 # 68user 2006/03/19 (日) 05:00:13
>>4526 mkt
一部のみですが対応しました。
    http://x68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/unix/script/pickup#rev1.24

残件は、
    - 全文検索がダメダメなのを直す
    - EUC-JP のバイトの境界を正しく見る
        (「亀」は「正規表現」の「正」の 2バイト目と「規」の 1バイト目にマッチしている)
    - 「+」が検索できないのを直す
です。忘れないよう
    http://x68000.q-e-d.net/~68user/bugnote/viewbug.php?projectid=1&bugid=23
に登録済ですが、もしさらなる不具合があれば掲示板にてお教えいただけると幸いです。

No. 4544 # 68user 2006/03/22 (水) 01:41:10
UNIX の部屋で、各 OS のマニュアルへのリンクを表示するようにしました (先頭部分)。
    http://X68000.q-e-d.net/~68user/unix/pickup?find

現時点では、Linux・NetBSD・FreeBSD・HP-UX11i・Solaris10 のセクション 1,1M,8
のみです。

No. 4550 # タバスコ=ダ=ガマ 2006/03/25 (土) 14:57:56
ネットワークプログラミングのページはとてもお勉強になります。
非常にありがたく利用させていただきました。感謝です。
ところで素朴な疑問なのですが、TCPでsocket生成→connectの間に
bindが不要なのはなぜなのでしょう?

No. 4551 # だだ 2006/03/29 (水) 02:01:19
Solarisで、Perlを組むのですが、参考になる本を
教えてください。
Perlの基本となることが知りたいのです。
変数の設定、判定、ループ、読み書きといったことです。
基本的なことが分かる本を教えてください。

最終的には、Perlでftpやメール送信(smtpでの)を
やりたいのです。
この点に関する本も教えて欲しいのですが。

No. 4552 # 68user 2006/03/29 (水) 10:57:54
>>4550 タバスコ=ダ=ガマ
bind(2) することはできますが、普通はしません。connect(2) に
空いているポート番号を選ばせます。
    http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.6

その理由は、ピアのポート番号選択は
    - 21 なら SMTP
    - 80 なら HTTP
などとサービスの選択も兼ねていますが、ローカルのポート番号は
何番でも構わないからです。

>>4551 だだ
> Perlの基本となることが知りたいのです。
> 変数の設定、判定、ループ、読み書きといったことです。
> 基本的なことが分かる本を教えてください。
初心者向けの本は相性が重要ですので、本屋で手にとって立ち読みするのが
よいでしょう。本屋に行くことができないなら、わたしは持っていませんが
「初めての Perl」を推薦します。

> 最終的には、Perlでftpやメール送信(smtpでの)をやりたいのです。
「Perl クックブック Volume1・2」で最終的な答えを把握した上で、
「プログラミング Perl」で基礎を固めるのがよいと思います。

No. 4554 # かず 2006/03/29 (水) 13:08:48
いつも楽しんでサイトを拝見させていただいております。

今UNIX上でクライアント、サーバのネットワークプログラミングをC言語で
挑戦しているところなんですが、FTPコマンド
(QUIT,USER,PASS,PWD,STAT,MKD,RMD,CDW,DEL,LIST,HELPcmd,HELP,PORT,NLST)
の組み込み方がイマイチよく分りません。

以下にserverftp.cとclientftp.cのコードを貼り付けておきます。
これらのコードは正常に動いております。

大変お忙しいとは思いますが、
ご教授の程、どうぞよろしくお願い致します。

serverftp.c

***********************

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

#define SERVER_FTP_PORT 9237

// list function prototypes
int receiveMsg(int s, char *buf, short bufsize, short *msgsize);
int sendMessage(int s, char *buf, short size);

main(
int  argc,
char *argv[]
)
{
int listenSocket;
int s;
int status;
                short msgSize;

printf("Starting server ftp\n");

status = svcInitServer(&listenSocket);
if(status != 0)
{
printf("Exiting server ftp due to error\n");
exit(-1);
}

for(;;)
{
printf("waiting to accept client connection\n");
s = accept(listenSocket, NULL, NULL);
if(s < 0)
{
perror("cannot accept connection: ");
exit(-1);
}

int msg;
short size;
char recvBuffer[1024];

printf("Server connected to client, issuing recvmsg\n");

status = receiveMsg (s, recvBuffer, 1024, &msgSize);
if (status < 0)
{
close(s);
return(status);
}

char replyMsg[1024];
strcpy(replyMsg, "200 command ok\n");
size = strlen (replyMsg) + 1;
status = sendMessage(s, replyMsg, size);

if(status < 0)
{
close(s);
return(s);
}



}

close(listenSocket);
printf("Exiting from server ftp main\n");
}


int svcInitServer(
int *s
)
{
int sock;
struct sockaddr_in svcAddr;
int qlen;

if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("cannot create socket ");
return(-1);
}

memset((char *) &svcAddr, 0, sizeof(svcAddr));

svcAddr.sin_family = AF_INET;
svcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
svcAddr.sin_port = htons(SERVER_FTP_PORT);

if(bind(sock,(struct sockaddr *)&svcAddr, sizeof(svcAddr)) < 0)
{
perror("cannot bind ");
close(sock);
return(-1);
}

qlen = 1;
listen(sock, qlen);

*s = sock;

return(0);
}


int sendMessage(
int s,
char *msg,
short msgSize
)

{

int i;

for(i = 0; i < msgSize; i++)
{
printf("%c", msg[i]);
}
printf(" \n");




if((send(s, msg, msgSize, 0)) < 0)
{
perror("unable to send ");
return(-1);
}

return(0);
}


int receiveMsg(
int s,
char *buffer,
short bufferSize,
short *msgSize
)

{
int i;
*msgSize = recv(s, buffer, bufferSize, 0);
if(*msgSize < 0)
{
perror("unable to receive");
return(-1);
}

for(i = 0; i < *msgSize; i++)
{
printf("%c", buffer[i]);
}
printf("\n");

return(0);
}


clientftp.c

**********************

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

#define SERVER_FTP_PORT 9237

int sendMessage(int s, char *msg, short msgSize);
int receiveMsg(int s, char *buffer, short bufferSize, short *msgSize);


int main(
int argc,
char *argv[]
)

{
int status;
int s;
short msgSize;
char FTPcmd[1024];
char replyMsg[1024];

printf("Trying to connect to server FTP\n");

status = clntConnect("//IPアドレス", &s);
if(status < 0)
{
return(status);
}

printf("Connected to ftp server\n");
strcpy(FTPcmd, "quit");
status = sendMessage(s, FTPcmd, strlen(FTPcmd) + 1);
if(status < 0)
{
close(s);
return(s);
}

printf("Issuing receivemsg to get reply msg from server\n");
status = receiveMsg(s, replyMsg, 1024, &msgSize);
if(status < 0)
{
close(s);
return(s);
}

printf("%c", replyMsg);

close(s);
return(0);

}

int sendMessage(int s, char *msg, short msgSize)

{
int i;

for(i = 0; i < msgSize; i++)
{
printf("%c", msg[i]);
}

printf(" \n");



if((send(s, msg, msgSize, 0)) < 0)
{
perror("unable to send ");
return(-1);
}

return(0);
}

int receiveMsg(int s, char *buffer, short bufferSize, short *msgSize)

{
int i;
*msgSize = recv(s, buffer, bufferSize, 0);
if(*msgSize < 0)
{
perror("unable to receive ");
return(-1);
}

for(i = 0; i < *msgSize; i++)
{
printf("%c", buffer[i]);
}

printf("\n");
return(0);

}

int clntConnect(
char *serverName,
int *s
)

{
int sock;
struct sockaddr_in us;
struct sockaddr_in them;
struct hostent *he;

if((he = gethostbyname(serverName)) == NULL)
{
printf("%s is unknown server\n", serverName);
return(-1);
}


if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("cannot create socket ");
return(-1);
}


memset((char *) &us, 0, sizeof(us));

us.sin_family = AF_INET;
us.sin_addr.s_addr = htonl(INADDR_ANY);
us.sin_port = 0;

if(bind(sock,(struct sockaddr *)&us, sizeof(us)) < 0)
{
perror("cannot bind");
close(sock);
return(-1);
}


memset((char *)&them, 0, sizeof(them));
them.sin_family = AF_INET;
memcpy((char *) &them.sin_addr, he->h_addr, he->h_length);
them.sin_port = htons(SERVER_FTP_PORT);

if(connect(sock,(struct sockaddr *)&them, sizeof(them)) < 0)
{
perror("cannot connect ");
close(sock);
return(-1);
}

printf("Connected to server, socket number: %d\n", sock);
*s = sock;

return(0);
}

void clntExtractReplyCode(
char *buffer,
int *replyCode
)

{
sscanf(buffer, "%d", replyCode);

return;
}

No. 4555 # hoge 2006/03/29 (水) 19:29:01
>>4554 かず さんへ

> FTPコマンド
> (QUIT,USER,PASS,PWD,STAT,MKD,RMD,CDW,DEL,LIST,HELPcmd,HELP,PORT,NLST)
> の組み込み方がイマイチよく分りません。

あんまりな方法だと思いますよ。
vsftpd とか proftpd 辺りのソースを拾って読んでみてはどうでしょうか?

No. 4556 # まんたろう 2006/03/30 (木) 01:10:57
Solarisで、Perlで、smtpで、メール送信をしていいます。
ポート番号25を使って、smtpサーバに接続してメールの
送信をしているのですが、処理は、正常に終わるのですが、
メールが送信されません。届きません。
どこがいけないのでしょうか。

------------------------------
use Socket;
$server = 'SMTPサーバ' ;

$from = '送信元アドレス' ;
$to = '送信先アドレス' ;
$subject = 'テストメール' ;
$data = 'メール送信テスト' ;

$send_data = 'X-Mailer: SMTP tool' . "\n";
$send_data .= 'MIME-Version: 1.0' . "\n";
$send_data .= 'Content-Type: text/plain; charset=iso-2022-jp' . "\n";
$send_data .= 'From: '. $from . "\n";
$send_data .= 'To: '. $to . "\n";
$send_data .= 'Subject: ' . $subject . "\n";
$send_data .= "\n";
$send_data .= $data;

        $port = getservbyname('smtp','tcp');
        $struct = sockaddr_in($port,inet_aton($server));
        socket(SH, PF_INET, SOCK_STREAM, 0)
                                || die("ソケットの生成失敗 $!") ;

        connect(SH, $struct )
                                || die("接続失敗 $!") ;

        select(SH); $| = 1; select(STDOUT);

        $respons = <SH> ;

        unless($respons =~ /^220/) {
                close(SH); die("接続失敗 $!") ;
        }

        $command = "HELO $server\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                close(SH); die("HELOコマンド失敗 $!") ;
        }

        $command = "MAIL FROM:$from\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                print SH "RSET\n"; close(SH);
                die("MAILコマンド失敗 $!") ;
        }

        $command = "RCPT TO:$to\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^25[0|1]/){
                print SH "RSET\n"; close(SH);
                die("RCPTコマンド失敗 $!") ;
        }

        $command = "DATA\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^354/){
                print SH "RSET\n"; close(SH);
                die("DATAコマンド失敗 $!") ;
        }

        $command = "$send_data\n.\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                print SH "RSET\n"; close(SH);
                die("本文、ヘッダ部送信失敗 $!") ;
        }

        $command = "QUIT\n";
        print SH $command ;

        close(SH); select(STDOUT);
        
        print "MAILは正常に送信されました。\n";

sub decode{
        
        my $inf = $_[0];
        $$inf =~ s/\x0D\x0A|\x0D|\x0A/\n/g;

}
-----------------------------

No. 4557 # megu 2006/03/30 (木) 11:46:30
UNIXを良く知らずみようみまねでshellを作成しています。
ある処理のエラーをハンドリングして結果に対してメール
を送信する様にしました。
/usr/bin/mail -s "hoge" megu@hoge.com < hoge.txt
ここで質問なのですが、該当コマンドをプロンプト上で
実行すると処理が実行されません。
(実行中のまま戻って来ない?)
強制終了すると、dead.letterが更新されます。
該当処理を記載したshellを実行しても、上記コマンド迄
は実行されているのですが、該当mailコマンドの部分で
処理がされない様で、コマンドを実行した様にshell自体も
終了しません。
cronや他ツールで自動実行させる様にすると実行されます。
根本的なOSの知識なのか、環境の問題なのかさえも分かりません。
とても基本的な質問になるかと思うのですが、教えて頂ければと
思います。

No. 4558 # カルネ 2006/03/30 (木) 19:43:41
はじめまして。質問させてください。
sin_port=0で空いているポート番号を自動取得できますが、
・ここで取得されたくない番号を指定
・決められた帯域内(5000〜6000など)で限定して取得
・予め取得される範囲を取得
のいずれかを行いたいのですが、方法はありますでしょうか?

No. 4559 # 68user 2006/03/30 (木) 22:25:05
>>4556 まんたろう
> ポート番号25を使って、smtpサーバに接続してメールの
> 送信をしているのですが、処理は、正常に終わるのですが、
> メールが送信されません。届きません。
うちの環境では正常に送信されました。telnet での送信や、メーラー
送信のパケット観察などを行って、成功/失敗時の違いを観察してください。

>>4557 megu
- 「sh -x スクリプト名」として、実際に実行されているコマンドを確認する。
    端末からの入力を待っているなら、リダイレクトまわりが怪しげな気が。
- dead.letter の中を見て、エラーを観察する (dead.letter の中にエラーが
    記述されるのかは覚えていませんが)
- mail コマンドが吐くエラーを観察する。標準出力・標準エラー出力を捨てて
    いるなら、捨てないようにする。

>>4558 カルネ
Linux なら ip_local_port_range、NetBSD なら net.inet.ip.anonportmax、
FreeBSD なら制限方法がない (たぶん) など、OS によって異なります。

No. 4560 # べた 2006/04/06 (木) 13:07:50
シェルで、dateコマンドで取得した時間から5分前の
の時間を取得したいのですが、できるでしょうか。

date +%H%M%S と実行します。
結果として、「130530」が取得できます。
そこから、取得した、「1305030」から5分前の「130030」を
求めたいのですが、できるのでしょうか。

環境は、
Solaris、shです。

No. 4561 # 68user 2006/04/06 (木) 14:09:14
>>4560 べた
上にある方が、現実的な解です。

- perl で localtime(time-5*60)
- GNU date をインストールして date --date '5 minutes ago'
- http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=1382 的なやり方
- http://home.catv.ne.jp/pp/ginoue/bn/descend.html の「2002/04/02 ひとこと」
    的なやり方

No. 4562 # hoge 2006/04/06 (木) 16:23:10
プロパーや一次請けが perl を嫌がったり、ましてや非純正な物
(GNU プロダクト)を入れるなんて駄目なんて悲惨な職場を経験したので...

Solaris 付属の date コマンドに %T って有りますか?
無かったとしても date +%H:%M:%S って書き方は利用可能ですか?
結果として、13:05:30 が取得できるなら、予め IFS_OLD=$IFS ; IFS=":" して
2 番目のフィールドが 5 未満か? とか 1 番目のフィールドが 0 以下か? って
辺りを条件に繰り下がり処理を手作りするのもありますね。

No. 4563 # hoge 2006/04/06 (木) 17:48:41
あ... 68user さんが例示してるやん。
リンクは読んでから書かないと駄目ね。

No. 4564 # べた 2006/04/06 (木) 18:37:37
>>4561 68user
>>4562 hoge
ありがとうございます。
日付またがりなどを考えるとPerlでやる方法がいいです。
Perlでやります。

もう1つ質問があります。
シェルを起動し、起動した時間から5分前に出力された時間以降の
syslogの内容を別ファイルに出力したいのですが、できるのでしょうか。

例えば、
今が、18:00:00とします。
シェルを起動し、18:00:00を取得します。
18:00:00を基にして、5分前の17:55:00を取得します。
「Apr 6 18:55:00」以降に出力されたsyslogをすべて
別ファイルに出力します。

ということ実現したいのです。

時間は、
$tm = time - 300;
my $now = strftime "%b %e %H:%M:%S", localtime($tm);
で取得します。

No. 4566 # べた 2006/04/08 (土) 12:36:36
あるファイルから指定日時以降に書かれたレコードを
抽出したいのですが、シェルスクリプトでできるので
しょうか。
どのしょうにシェルにすればよいか教えてください。

例えば、今が、2006/04/08 12:30:00とします。
ある指定日時というのは、現時点から5分前としますので、
2006/04/08 12:25:00となります。

ファイルでは、「Apr 8 12:30:33 ・・・・・」と出力
されているので、5分まえの時間を、「Apr 8 12:25:00」
で取得し、「Apr 8 12:25:00」以降に書かれたレコードを
ファイルに出力したいのです。

環境は、
Solaris8、sh、Perlで実現したいのです。

No. 4567 # まんたろう 2006/04/10 (月) 21:07:44
>>4566 べた

無理ではないかと思うのですが。
「Apr 8 12:30:33 ・・・・・」の比較、チェックが簡単
にできないと思います。

こういうのはどうですか。
5分前に動いた時のファイルのレコード数と今回動いた時の
ファイルにレコード数の差をtailコマンドでファイルに出力
というのは。?

No. 4568 # 68user 2006/04/11 (火) 10:22:32
>>4567 まんたろう
> 「Apr 8 12:30:33 ・・・・・」の比較、チェックが簡単にできないと思います。
echo "Apr 02 12:25:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
として行番号をとって、その行以降を tail で出力とか。

まぁ筋の悪いやり方だとは思いますので、他の方法がよいでしょう。

No. 4569 # べた 2006/04/11 (火) 12:50:22
>>4568 68user

>echo "Apr 02 12:25:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
>として行番号をとって、その行以降を tail で出力とか。
予めファイルの全体のレコード数も必要ということですか。
マイナスとなった場合、どうなるのですか。?

No. 4570 # べた 2006/04/11 (火) 14:56:25
>>4578 EBA

echo "Apr 10 09:30:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
と実行してみたのですが、行番号が2となります。

# cat logfile
<pre>
Apr 9 12:23:01 ・・・・・・・
Apr 9 15:17:43 ・・・・・・・
Apr 9 17:48:06 ・・・・・・・
Apr 9 18:05:30 ・・・・・・・
Apr 9 18:06:24 ・・・・・・・
Apr 10 09:23:08 ・・・・・・・
Apr 10 11:47:23 ・・・・・・・
Apr 10 13:35:49 ・・・・・・・
Apr 11 09:54:11 ・・・・・・・
Apr 11 12:17:38 ・・・・・・・
</pre>

行番号ではなく、すべてを表示したのですが、
sortが正しく行われていないみたいなのですが、
どうしてなのでしょうか。
<pre>
# echo "Apr 10 09:30:00 ===" | sort -M - logfile | cat -n
          1 Apr 9 12:23:01 ・・・・・・・
          2 Apr 10 09:30:00 ===
          3 Apr 9 15:17:43 ・・・・・・・
          4 Apr 9 17:48:06 ・・・・・・・
          5 Apr 9 18:05:30 ・・・・・・・
          6 Apr 9 18:06:24 ・・・・・・・
          7 Apr 10 09:23:08 ・・・・・・・
          8 Apr 10 11:47:23 ・・・・・・・
          9 Apr 10 13:35:49 ・・・・・・・
        10 Apr 11 09:54:11 ・・・・・・・
        11 Apr 11 12:17:38 ・・・・・・・
</pre>

行番号以降をtailで出力は、
# tail +行番号 logfile
でできました。

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

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