68user's page 掲示板

Prev< No. 4549〜4577> Next  [最新発言に戻る] [過去ログ一覧]
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 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 4571 # 68user 2006/04/12 (水) 11:30:06
>>4570 べた
Linux ではうまくいきましたが、Solaris 環境がないので確認できません。
どなたかご確認いただけませんか?

あと、このやり方は新年 00:00:00〜00:05:00 の間はうまく動作しませんので、
おすすめしません。念のため。

No. 4572 # べた 2006/04/12 (水) 17:05:17
>>4571 68user
ありがとうございます。

>あと、このやり方は新年 00:00:00〜00:05:00 の間はうまく動作しませんので、
>おすすめしません。念のため。
確認して頂いたのですか。
良い方法だと思ってはいたのですが、ダメですか。
他に、良い方法があるのでしたら伺いたいのですが。

No. 4573 # ふくし 2006/04/12 (水) 21:16:07
おひさしぶりです。自分が困ったときだけ出てきてすみません。

Windows のマシンと UNIX のマシンが存在する LAN で、
お互いにメールを送りあうというテストをやっています。
ここでは簡単のため、Windows マシン1台と UNIX マシン1台とします。

W に pmail というフリーウェアの SMTP / POP サーバーを入れた人がいて、
W と U の両方に Mozilla Thunderbird を入れて、
Thunderbird のアカウント設定で、
W の IP アドレスを SMTP / POP アドレス欄に指定することで、
W と U の間でメールのやり取りをすることができました。

しかし、テストの要件のひとつに、
U 側では MUA として /bin/mail も使えるようにする、というものがありました。
sendmail の設定を変えようとしようと思ったのですが、
それは大変だからやめたほうがいいと上司に言われ、
言われるままに U に Postfix を入れました。
ちなみに U の OS は HP-UX 11i ver.2 です。

Postfix のインストールはなんとなく終わりました。
/etc/postfix/main.cf に
myhostaname = U.unix.net
と変更を加えました。

DNS を立てるのはなかなか面倒だと上司に言われたので、言われるままに
U の /etc/hosts および
W の C:\Winnt\system32\drivers\etc\hosts に
172.16.10.2 U.unix.net
172.16.10.3 W.windows.net
のように書きました。

で、U 側で
  # mail root
  nantoka
  kantoka
  .
のように書くと、
  # mail
で自分宛に出したメールが確認できましたが、
  # mail dareka@W.windows.net
  nandakakandaka
  .
のようにすると、
  Diagnostic-Code: X-Postfix; Host or domain name not found. Name Service
    error for name=W.windows.net type=A: Host not found
のように怒られます。

(ここで、dareka は W の pmail に設定したメールアカウントです。)

U から
  # nslookup
  > W.windows.net

とすると 172.16.10.3 が、

  > 172.16.10.3

とすると W.windows.net が正しく帰るのですが、
host W.windows.net とすると not found 3(NXDOMAIN) と言われます。
このへんが原因でしょうか。

この状況で、U から W に /bin/mail でメールを出すことができるでしょうか。

また、W の Thunderbird から出したメールを
U の /bin/mail で受けるためには、qpopper のようなプログラムを
U に入れないといけないのでしょうか。

他に、いまの私の状況でもっと簡単にテストするアイディアがわかれば
ご教示ください。

いろいろ聞いてすみません。よろしくお願いします。

No. 4574 # 68user 2006/04/13 (木) 01:31:52
>>4572 べた
> 他に、良い方法があるのでしたら伺いたいのですが。
まず、syslog の出力には年がないという根本的欠陥があります。なので、
ログファイルを後からチェックするだけでは、完璧な判定はできません。
たとえば
    Apr 9 12:23:00 ... (2005年出力)
    Apr 9 12:23:01 ... (2006年出力)
とか
    Apr 9 12:23:01 ... (2005年出力)
    Apr 9 12:23:00 ... (2006年出力)
というケースもありうるわけです。また、現在 1月1日 0時2分だとして、
1分前に出力されたログ
    Jan 1 00:01:00 ...
と、5分前の時刻
    Dec 31 12:57:00 ...
をソートすると Jan 1 の方が先になり、意図した結果になりません。

それを踏まえた上で、
    - 1年前のログが残っていることはないとみなす
    - 年初 5分は目をつぶる
が許容できるかどうかはあなたが判断してください。なお、Jan や Feb の
ソートについては、sed で 01 や 02 に置換すれば何とでもできるでしょう。

理想は年が記録されるログに乗り換えることですが (=syslog を捨てる)、
それが許されるシチュエーションはあまりないと思いますので、
>>4567 まんたろう
は現実的な落としどころと考えます。


>>4573 ふくし
> Diagnostic-Code: X-Postfix; Host or domain name not found. Name Service
> error for name=W.windows.net type=A: Host not found
Postfix はよく知りませんが、
    http://www.kobitosan.net/postfix/ML/arc.4/msg00048.html
でしょうか。あと、うまくいくかどうかわかりませんが、
    # mail 'dareka@[172.16.10.3]'
と IP アドレスを直接指定するとか。@[..] は IP アドレス指定の場合の
メールアドレス記述方法だったような気がしますが、使ったことはありません。

# http://x68000.q-e-d.net/~68user/rfc/?key=821&target=title

> # nslookup
nslookup は、/etc/hosts を参照しません。

と思ったら、HP-UX の nslookup は参照するんですね。へぇ。
    http://docs.hp.com/ja/B2355-90851/nslookup.1.html

> また、W の Thunderbird から出したメールを
> U の /bin/mail で受けるためには、qpopper のようなプログラムを
> U に入れないといけないのでしょうか。
mail コマンドには POP クライアントの機能はないと思いますので、
W で POP サーバを動かすという前提であれば、
    - W にメールが届くと U に転送し、mail コマンドは /var/spool/mail などを
        直接参照する。
    - U で fetchmail などの POP クライアントを動かし、/var/spool/mail などに
        書き出す。
    - W・U 両方で POP サーバを動かし、W 宛のメールは W の POP サーバから
        取得し、U 宛のメールは U の POP サーバから取得する。
などの方法があります (他にもあると思いますが)。

言うまでもありませんが、要件自体が不適切である可能性もあります。

No. 4575 # ふくし 2006/04/13 (木) 14:35:00
>>4574 さん、ありがとうございます。
  # mail 'dareka@[172.16.10.3]'
を指定すると、

  Diagnostic-Code; X-Postfix; host 172.16.10.3[172.16.10.3] said: 550 5.1.1
  <dareka@[172.16.10.3]>... Not local user, server is not relaid.
  Recipient error (in reply to RCPT TO command)

と言われます。

試みに dareka というコンピューターユーザーを W に作ってみましたが
現象は変わりませんでした ;;;

教えていただいたリンクをたどって
http://www.kobitosan.net/postfix/jhtml/faq.html#intranet
に到達していくつかのことをやってみました。

・/etc/postfix/main.cf で
    disable_dns_lookups = yes と書けば
    /etc/hosts を見に行って W.windows.net の名前解決をしてくれる?
    =>ダメでした(dareka@W.windows.net で host not found になる)

・さらに /etc/postfix/main.cf で
    relayhost = W.windows.net と書く

    =>同じ状況です。
    (# mail dareka@W.windows.net で host not found、
        # mail 'dareka[@172.10.16.3]' で not a local user)

・/etc/postfix/main.cf で
    relayhost = W.windows.net と書く

    =>同じ状況です。
    (# mail dareka@W.windows.net で host not found、
        # mail 'dareka[@172.10.16.3]' で not a local user)
        これ、W.windows.net の smtp サーバーである pmail が
        POP before SMTP auth をやっているのが原因かも・・・。
        (フリー版の制約で切れない)

・relayhost の設定をやめ、
    transport_maps = dbm:/etc/postfix/transport と設定する。
    /etc/postfix/transport の中身を

    windows.net :[W.windows.net]
    .windows.net :[W.windows.net]

    にし、postmap /etc/postfix/transport をしてから、
    postfix reload する。
    (/etc/postfix/transport の前に hash、db、dbm などの何をつけるかは
        postmap が生成するデータベースによる。
        間違うと postfix reload で怒られる)

    =>同じ状況です。

・/etc/postfix/transport の中身を

    windows.net :[172.16.10.3]
    .windows.net :[172.16.10.3]

    とか

    windows.net smtp:[W.windows.net]
    .windows.net smtp:[W.windows.net]

    とか

    windows.net smtp:[172.16.10.3]
    .windows.net smtp:[172.16.10.3]

    とかにしてみる。

    =>同じ状況です。。。

ううーん、困った。
でも人に聞きながらやってると整理がついていいですね (^^)

No. 4577 # べた 2006/04/15 (土) 16:55:45
>>4547
ありがとうございます。
どうも、無理みたいですね。
1年。つまり、同じ年ということであるのならば、何とかできるの
でしょうが、年をまたいでしまうと無理ですね。

>Jan や Feb のソートについては、sed で 01 や 02 に置換すれば
>何とでもできるでしょう。
すみません。方法教えてください。


> >>4567 まんたろう
> は現実的な落としどころと考えます。
現実な落としどころとは。?

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