Windows10でTelnetサーバを立てる(WSLを使う)

結論から書くと、Windows10自体でTelnetサーバは立てられないのでWSLでTelnetを使います。
Windows11でも有効な手順だと思います。

WSLを有効化する

コントロールパネル>プログラム>Windowsの機能の有効化または無効化
LinuxWindowsサブシステム
にチェックを入れてOKを押し、再起動を求められたら再起動します。

Windows10 WSL有効化

WSLをインストールする

WSL (Windows Subsystem for Linux) をインストールします。
(WSLはWindowsで動くLinuxです。)
Microsoft Storeで入手可能です。
あるいは、PowerShellで wsl --install します。
ディストリビューションはどれでも大丈夫だと思います(一部手順は異なってきます)が、私はUbuntuを入れました。
再起動を求められたら再起動します。

WSLを起動する

初回はユーザ名とパスワードを設定します。

WSLでtelnetをインストールする

先にaptをアップデートしてから、telnetをインストールします。
sudoで実行するコマンドではパスワードが聞かれるので、パスワードを入力してください。

sudo apt update
sudo apt install telnetd
sudo apt install inetutils-inetd

WSLでtelnetを起動する

sudo /etc/init.d/inetutils-inetd start

このとき、ファイアウォールが接続を許可するか聞いてきたら許可してください。

# 私は何故か初回で聞いてこず、再起動して再実行したら聞かれました。

# Windows10のファイアウォールの設定の仕組みをよく知らない、詳しい方がいらしたら教えて下さい。

WSL1の場合はこれでtelnetサーバのセットアップ完了です。
WindowsIPアドレスtelnetでアクセスしてください。

telnetを終了するには下記のコマンドを用います。

sudo /etc/init.d/inetutils-inetd stop

(WSL2の場合)PowerShellでポートフォワーディングする

WSLには、WSL1とWSL2があり、ネットワークの仕組みが異なります。
WSL1のtelnetサーバにはWindowsと同じIPアドレス(の23番ポート)でアクセスすることができます。

WSL2にはホストのWindowsと異なるプライベートアドレスが割り振られるので、他のマシンから直接アクセスすることができません。(2022年2月時点のWindows10の場合。現在この仕様は変更が検討されているようです。)
このため、WSL2の場合はポートフォワーディング(ポート転送)が必要になります。

WSLのバージョンを確認するには、PowerShellで wsl --list --verbose と入力します。

wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2

VERSIONが2であれば、管理者権限のPowerShellで下記ポートフォワーディングの設定も行います。

netsh interface portproxy add v4tov4 listenport=23 connectaddress=localhost

WSL2の初期バージョンでは、localhostだと上手くいかないかもしれません。
その場合、WSL2のバージョンを上げるか、
WSL2のIPアドレスをifconfigなどで確認し、そのアドレスをconnectaddressに指定してください。
※WSL2のIPアドレスは起動のたびに変化します。

ポートフォワーディングの状況を確認するには下記コマンドを用います。

netsh interface portproxy show all

WSL2の場合はこれでtelnetサーバのセットアップ完了です。
WindowsIPアドレスtelnetでアクセスしてください。

ポートフォワーディングを終了するには下記コマンドを用います。

netsh interface portproxy delete v4tov4 listenport=23

あとがき

Windows10やWindows11では、Telnetサーバは使えなくなりました。比較的脆弱なためです。
Telnetクライアントは設定すれば使えます。)
代わりにSSHを使ってねというところですが、わけあってTelnetサーバが必要なこともあります。
しかし、ぐぐってもTelnetクライアントの方を使う記事ばかり上位に出てきたので自分用のメモを兼ねて書きました。

tcshでの文字列比較(パターンマッチング)

#!/bin/tcsh -x

# 単純比較(完全一致・不一致) == !=
if (str == str) then
    echo "True" # ←これ
else
    echo "False"
endif

if (str != str) then
    echo "True"
else
    echo "False" # ←これ
endif
#!/bin/tcsh -x

# パターンマッチング =~ !~
# ワイルドカードを使用できる
if (str =~ s*) then
    echo "True" # ←これ
else
    echo "False"
endif

if (str =~ s?r) then
    echo "True" # ←これ
else
    echo "False"
endif

if (str =~ {str,ing}) then
    echo "True" # ←これ
else
    echo "False"
endif

if (str =~ st[abp-t]) then
    echo "True" # ←これ
else
    echo "False"
endif

ワイルドカード正規表現とは異なります。
* 任意の0文字以上の文字
? 任意の1文字
[ ] いずれかの1文字。ハイフンで範囲指定
{ , } コンマで区切られた文字列のいずれか
上記を組み合わせて使用することもできる。

パターンマッチで使用できるワイルドカードは下記記事を参考にさせていただきました。
Linuxワイルドカード正規表現】の違いと変換,展開の動作 ~ ls, grep, findでの具体例の解説~
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/wildcard-regular-expression/

シェルの種類によってif文や条件式の書き方が異なります。
tcshシェルスクリプトを書こうと思ってググってもシェルの種類が混同されて出てくるので困ることがあり、自分用のメモとして書きました。

10才からはじめるゲームプログラミング図鑑

「10才からはじめるゲームプログラミング図鑑」という本を見てScratchでゲームを作った。

この本にはサンプルゲームが8つ掲載されていて、ゲームもコードも単純なものから複雑なものの順に掲載されているので分かり易かった。

続きを読む

PICO-8を使ってみる

PICO-8が手に入ったのでPICO-8をちょっと触ってみた。(PICO-8 v0.2.1b)

PICO-8は小さなゲームやコンピュータプログラムを作ったり共有したり遊んだりするためのファンタジー・コンソール(空想上のゲーム機)である。
小さなというのは簡単に言うとドット絵・ピコピコサウンド・低サイズみたいなことだと思う。

続きを読む

VMware Playerで「回復不可能なエラー」と出て起動出来ない時

環境はWindows7VMware Player 7.1.4です。
VMware Playerで仮想マシンを起動しようとすると下記ダイアログが出て起動しませんでした。

VMware Player 回復不可能なエラー:(vcpu-0)

vcpu-0:VERIFY vmcore/vmm/main/cpuid.c:382
bugNr=1036521

hoge.log」に、ログファイルがあります。

サポートリクエストを提出できます。

弊社のテクニカル サポートに提出するデータを収集するには、「vm-support」を実行します。

ユーザーのサポート権利に基づいて対応させて頂きます。

続きを読む