LEFログ:学習記録ノート

leflog: 学習の記録をどんどんアップしていきます

WSL2でTelnetを使うための手順:DebianへのGenieインストールやTelnetの操作方法など

概要

自分はWSL2にDebianを入れて開発環境を整えているのですが、telnetを使うのに大苦戦したため、その戦いの記録(というと大げさですが)、をまとめていきたいと思います。

Debianディストリビューションを使って説明しておりますが、Ubuntuなど、他のディストリビューションを使う方にも役立つ内容になっていると思います。

執筆理由

体系だった記事を見つけられず、WSL2でtelnetを使えるようになるまで多大な労力を費やしてしまったからです。
また、自分への備忘録として書きました。

調べた過程を順番に書いているため、かなりまどろっこしいかもしれませんが、順を追って説明しないと余計ややこしくなると思い、時系列順に書いてみました。
LEF(筆者)がどのようにエラーに対処したのか、その思考の流れも記述しているので、そこも含めて参考にしていただければ幸いです。

結論

sudo apt-get update 
sudo apt-get install telnet

だけでtelnettelnetクライアント)が使えるようになります。

telnetd(telnetサーバー)は危険なので、インストールしなくて大丈夫です。

もし、誤って「telnetd(telnetサーバー)」のほうをインストールしてしまった場合は、そのままだと脆弱性が生まれてしまうので、アンインストールをする必要があります。

sudo apt remove telnetd
sudo apt autoclean && sudo apt autoremove

を実行して、telnetdおよび、それにくっついてきたもう使われることのない邪魔なパッケージ(もう使わない依存パッケージ)を全部removeしましょう。

感想

  • telnet難しい
  • 大変過ぎて経緯が長くなりました

難しいポイント

  • ぜんぶ

順を追って説明致します

まず、WSL2(筆者はDebian)でtelnetと入力すると、

command not found: telnet

と表示されます。

なるほど、telnetコマンドがWSL2に入っていないのか、と納得し、「wsl2 telnet」で検索すると次の記事がトップにヒットします。

UbuntuでTelnetを使えるようにする | ばったんの技術系ブログ

しかし、この記事をよく読んでみると、WSL2とはっきり明記されているわけでもありませんし、更新日付が「2012.12.26」になっています。ちょっと古そうですね。

そんなわけで、今度は「wsl2 telnet debian」で検索してみました。
しかし、これもあまりパッとしません。英語でubuntuの記事がいくつがヒットするくらいです。

次はシンプルに「telnet debian」で検索したところ、次の記事にヒットしました。

How to Install and Use Telnet on Debian 11 Bullseye - LinuxCapable

英語の記事ですが、そんなに難しくないですし、翻訳すればすんなりと読めます。
そしてこのページの通りに、コマンドを実行していきました。

sudo apt update && sudo apt upgrade

でアップデートとアップグレードをおこなって、

sudo apt install telnetd 

Telnetサーバーをインストールします。

ここまではすんなりと行くと思います。
問題はこの次です。

sudo systemctl status inetd

と、このコマンドを打つと、

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

というエラーが表示されます。

うーん、よく分からないけど「システムがPID 1という起動システムとして起動の設定がされていません」みたいなエラーが表示されています。

とりあえず、このエラーメッセージをコピペして検索すると、

【WSL2】Ubuntu 20.04でPID1をsystemdにする 2021年7月版 | しきゆらの備忘録

など、色々な記事がヒットします。
それらに共通して書かれているのが、genieをインストールしよう!ということです。

4つ以上の複数の記事が同じページを指し示していたので、これで間違いないだろう、と検討をつけ、そのgenieのページに移動しました。

インストール方法が昔と今とで変わっている場合もあるので、公式のドキュメントを読む必要がありそうです。

arkane-systems/genie: A quick way into a systemd "bottle" for WSL

これがgenieのページです。タイトルにも「WSLのためにボトルとしてシステム化する素早い方法」と書かれていますね。
ちなみにgenieとはアラジンのあのジーニーを指しているっぽいです。ウィル・スミス。

で、README.mdを読んでいくと、INSTALLATIONのDebianの項目に、

sudo apt update
sudo apt install -y systemd-genie

と書かれています。
これでいけそうです。

まずsudo apt update。これは問題なく通ります。
次にsudo apt install -y systemd-genieをして……

ありゃ、エラーが出ました。

Unable to locate package systemd-genie

うーん、なぜかgenieがインストールできないみたいです。
とりあえずこのエラーメッセージをコピペして検索してみましょう。

すると、Qiitaで次のような記事が見つかりました。

[Q&A] ubuntuでMySQLサーバーが起動できない - Qiita

この記事をよく読むと、コメント欄に次のようなメッセージがあります。

〈以下引用です〉

@gdap
回答ありがとうございます。wsl2を有効にし、再び

sudo apt install -y systemd-genie

と打ったのですが、

E: Unable to locate package systemd-genie

というエラーが出ます。

'apt get update'をしても同様のエラーが発生します。

@ktz_alias
公式レポジトリ にて、

  1. dotnet-runtime-5.0 をインストールする
  2. パッケージレポジトリとしてwsl-translinuxを追加する (see: https://arkane-systems.github.io/wsl-transdebian/)

1と2が完了後、apt updateとapt installすると書かれていますがこの通りに行われているのですよね?

"E: Unable to locate package systemd-genie"で検索した際に見つかったIssue (https://github.com/arkane-systems/genie/issues/85) にて、同様のエラーが発生したと報告されていますが、2を確実に行ってくださいと回答されています。

@gdap
解決できました。ありがとうございます。

〈引用終わり〉

えっ、パッケージレポジトリとしてwsl-translinuxを追加するって書いてあったっけ?

と思って、改めてgenieのREADMEページに戻って読んでみたら、コマンドの直前の部分に

To install, add the wsl-translinux repository here by following the instructions here: https://arkane-systems.github.io/wsl-transdebian/

then install genie using the commands:

と、バッチリ書かれていました😅

そんなわけで、

wsl-transdebian | A repository for WSL-only apt packages.

へと進み、順番にコマンドを実行していくわけですが、ここからがまたちょっと難しいです。

まずは

sudo -s

をして、管理者モードになる必要があります。
と、いうのも、普通のsudoでコマンドを入力すると、ちょっとした不都合が起こるからです。

管理者モードのまま

apt install lsb-release

をおこなって、そのまま

wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg

chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF

apt update

をする必要があります。

上のように書かれているのですが、このコマンド入力には注意が必要です。

Ubuntu20.04@wsl2でsystemd(systemctl)を自動起動する - Qiita

の記事に詳しく書かれているのですが、コマンドを一行ずつコピペして、それぞれにエンターを押していく必要があります。

つまり、実際は

  • apt install lsb-releaseをペーストした後にエンターキーを押す
  • wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpgをペーストした後にエンターキーを押す
  • chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpgをペーストした後にエンターキーを押す
  • cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.listをペーストした後にエンターキーを押す
  • (省略)
  • EOFをペーストした後にエンターキーを押す
  • apt updateをペーストした後にエンターキーを押す
  • exitを入力してエンターキーを押し、管理者モードから通常モードに切り替える

という手順になります。

さて、あとは先ほどエラーが出たgenieの続きです。
この状態で

sudo apt update
sudo apt install -y systemd-genie

をすると、うまくインストールできます。

ここで忘れてはいけないのが、genieを起動することです。

$ genie -s

でgenieを起動させておかないと、この次のインストールが上手くいかないのでご注意を。

※ちなみに、Ubuntu20.04@wsl2でsystemd(systemctl)を自動起動する - Qiita によると、bashrcやzshrcにコマンドを書き加えると自動的にgenieが起動するようになるそうです。自動的に起動したい方は色々調べてみると良さそうです。

そしてこの状態で、Debian11BullseyeにTelnetをインストールして使用する方法-LinuxCapable

sudo systemctl status inetd

をおこなえば、うまくインストールできるはずです。

さて、準備が整いました。 この状態でtelnetコマンドを入力すると、遂に……!!

command not found: telnet

えっ

うそ・・・

なんでこんなに頑張ったのに、telnetコマンド、入ってないの……

………………

「どうなってるんだってばよ。。。(;^ω^)」

ここでLEF(筆者)は頭を抱えました。

何か見落としがあるはずです。

telnetコマンドそのものがない。しかしtelnetdは入ってるはず。

もう一度、「telnet debian」で検索しました。すると、こんな記事がありました。

Debianにネットワークツールをインストールする

そしてこの記事の中に、

apt install telnetd telnet  # telnetサーバーとtelnetクライアントをインストールします

と書かれています。

あっ

ここでLEFはようやく気づいたのです。

  • telnetd(テルネットサーバーのこと)
  • telnet(テルネットクライアントのこと)

そう、自分はtelnetdをインストールすれば、自動的にtelnetが使えるようになるものだと誤解していたのです。

しかし真実は違いました。telnetとtelnetdは、別々に両方ともインストールしなければならないのです。
というか、もしかしたら、telnetdをインストールせず、telnetだけをインストールするだけで大丈夫だったのかも(;・∀・)

そんなわけで、

sudo apt install telnetd telnet 

をしてみると、無事にtelnetコマンドをインストールできたのでした。めでたしめでたし。

telnetコマンドは使えるようになったけれど……

telnetは使えるようになりました。

が、ここからもそれなりに難しかったです。

確かにtelnetコマンドは使えるようになりましたが、このtelnet自体の操作がそこそこ厄介です。

具体的には、telnet操作時にちょっとでも操作が遅かったり、間違った入力をすると

Connection closed by foreign host.

と表示されて、すぐに接続が切れてしまいます。

それだけではありません、telnetの入力画面で、カーソルを矢印キーで動かそうとすると

^[[D^[[D^[[D^[[D^[[D^[[D

と表示されてしまいます。
つまり、バックスペースで削除はできますが、カーソルを動かすことができないのです。

また、ctrl + cではプロセスを止めることができません。 qを押すことでエスケープすることができます。

telnetの操作に関しては、

HTTPの基本1 #2 telnetでGETとPOSTを試してみる - いづいづブログ

の記事を参考にさせて頂きました。
この記事がなかったら更に時間が掛かっていたと思います。🙏

POSTするときに実験してみたのですが、

Content-Length:60

みたいに入力の文字数を指定するところがあると思うのですが、この数字はちょっと多めに設定したほうがいいです。
というのも、例えばギリギリ文字数が足りないと、その部分が削られてしまうからです(POST自体はできます)。
また、空白も一文字に換算されます。

例えば

Content-Length:42

としておいて、

article[title]=test&article[body]=1234 56789

空白含めて44文字の上のコマンドを入力すると、
実際に出力されるHTMLの画面では、

[title]test [body]1234 567

のような感じで表示されます。

補足

How to Install and Use Telnet on Debian 11 Bullseye - LinuxCapable

のサイトでWarning(警告)として、

The tutorial will show you how to install Telnet for historical purposes and use in local environments, isolated networks. It is highly recommended not to use Telnet on an open network connection to the Internet because the data is sent over the connection, including sensitive information such as passwords and other confidential information that is not encrypted so the data can be easily intercepted by a hacker and misused. To safely connect to remote servers over public networks, you should always use SSH (Secure Shell).
チュートリアルでは、歴史的な目的でTelnetをインストールし、ローカル環境、分離されたネットワークで使用する方法を示します。インターネットへのオープンネットワーク接続ではTelnetを使用しないことを強くお勧めします。これは、パスワードなどの機密情報や暗号化されていないその他の機密情報を含むデータが接続を介して送信されるため、データがハッカーによって簡単に傍受される可能性があるためです。誤用。パブリックネットワークを介してリモートサーバーに安全に接続するには、常にSSH(Secure Shell)を使用する必要があります。

と書かれているように、telnetはなるべく使わないほうが良さそうです。

なぜtelnetdtelnetサーバー)は危険なのか

telnetdとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

にも書かれているように、telnetd(telnetサーバー)を入れたままにしておくと、誰かに遠隔操作をされてしまう可能性があるからです。

telnettelnetクライアント)は操作する側なので、これだけなら遠隔操作される恐れはありませんが、暗号化されていないので通信を傍受されたら大変です。パスワードなどを打ち込んだら、大変なことになっちゃうので気をつけましょう。

(現在ではラズベリーパイでもSSH接続が使われているらしいです🤖)

後書き

かなり疲れました。FBCのプラクティスの中でも、かなり難しかった気がします……🍵

長文で色々と書いたものの、自信のない部分(仕組みがよく分かっていない部分)も多いので、もし、何か間違っている点などありましたら、お気軽にコメントしていただけると助かります。