0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ちょっとした試験用擬似サーバの構築

Last updated at Posted at 2021-01-30

きちんとしたWebサーバやSMTPサーバは不要だが、試験的にサーバへのアクセスまで確認したい場合にPythonやncを使って簡易なサーバを構築する手順メモ。

pyhtonのワンライナーで擬似サーバ構築

pythonのモジュールを使うと簡単に試験サーバが構築できる。

擬似HTTPサーバの場合

なんちゃってHTTPサーバ。アクセスするとサーバのフォルダ一覧を返す。

サーバ側

pythonのhttpモジュールを使って実現。

サーバ(Python3系)
$ python3 -m http.server 8080 # サーバポートは任意の数値を指定可能

Python2系の場合

サーバ(Python2系)
$ python -m SimpleHTTPServer 8080 

クライアント側

ブラウザやcurlでアクセス。

クライアント
[~ ]# curl http://[サーバのIP]:8080

擬似SMTPサーバの構築

サーバ側

アクセスする端末を制限しないで、どの端末からでもメールの受け付けを許可する場合の例。ローカルからのアクセスに制限する場合、IP部分をlocalhostにする。

サーバ
$ python3 -m smtpd -c DebuggingServer 0.0.0.0:25

クライアント側からのメール送信

その1:mailコマンドで送信

mailがインストールされている場合、シェルから以下の形式で送信可能。

echo "メールメッセージ" | mail -s "Subject" -S smtp=smtp://<サーバIP:ポート> -r <from_user> <to_user>

クライアント
$ echo "This is a tes mail!" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com

クライアントからメール送信すると、サーバ側に以下のメッセージが表示される。

サーバ側
# python3 -m smtpd -c DebuggingServer 0.0.0.0:25
---------- MESSAGE FOLLOWS ----------
b'Date: Sat, 30 Jan 2021 04:08:46 +0900'
b'From: from_user@local.domain'
b'To: to_user@abc.com'
b'Subject: Hello!'
b'Message-ID: <60145d3e.QT30D9OKMb04CKyL%from_user@local.domain>'
b'User-Agent: Heirloom mailx 12.5 7/5/10'
b'MIME-Version: 1.0'
b'Content-Type: text/plain; charset=us-ascii'
b'Content-Transfer-Encoding: 7bit'
b'X-Peer: 127.0.0.1'
b''
b'This is a tes mail!'
------------ END MESSAGE ------------

ちなみにメール本文に日本語を入れると文字化けした。なんか設定あるのかな?

クライアント側
$ echo "日本語" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com
サーバ側のメッセージ
(一部省略)
b'Content-Type: text/plain; charset=utf-8'
b'Content-Transfer-Encoding: 8bit'
b'X-Peer: 127.0.0.1'
b''
b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
------------ END MESSAGE ------------

その2:pythonスクリプトで送信

mailコマンドが使えない場合Pythonスクリプトで対応。ベタなスクリプト例は以下。

send_mail.py
import smtplib
from email.mime.text import MIMEText

# メール送信に必要な情報を定義
from_user = 'from_user@local'
to_user = 'to_user@abc.com'
subject = 'Hello!'
message = 'Hello, World!\nThis is a test mail\n'
smtp_sv = 'localhost'

# 情報を詰め込む
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = from_user
msg['To'] = to_user

# 送信
server = smtplib.SMTP(smtp_sv)
server.sendmail(from_user, [to_user], msg.as_string())
server.quit()

これを実行すると、mailコマンド同様の結果がサーバに出力される。

クライアント
$ python3 send_mail.py 

ncコマンドを使って擬似サーバを構築

もしnmapが利用可能ならncコマンドを利用して擬似サーバを立てる。

ncコマンドで擬似サーバを立てた場合、クライアントとサーバで接続を確立するところまでなので、httpやsmtp処理はできず、クライアントもしくはサーバで入力した文字列がそのまま相手先に出力されるだけだが、ルーティングとポートの確認をするだけならこれで十分。

サーバ側
$ nc -kl 8081   #ポート番号は任意

ちなみにkオプションつけると複数クライアントからの受付を可能とする。
続いてクライアントからサーバにアクセスして文字列を投入する。

クライアント側
$ nc <サーバIP> 8081
Hello!
サーバ側
$ nc -kl 8081
Hello!  #クライアントからの入力した文字列がサーバ側に表示される

クライアントからcurlコマンドでアクセスしても、サーバ側で何かしてくれるわけでなく、単にメッセージを表示するだけ。

クライアント
$ curl http://<サーバIP>:8081
サーバ
$ nc -kl 8081
Hello!
GET / HTTP/1.1     #クライアントからのHTTPリクエストをそのまま表示するだけ
Host: ap01:8081
User-Agent: curl/7.64.1
Accept: */*
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?