telnet -l にはまだログインが必要です。

telnet -l にはまだログインが必要です。

Telnetサーバーがあるボットに接続して会話するためのCライブラリを作成しようとしています。

サーバー情報は次のとおりです。

  • ユーザー:as
  • IP:192.168.0.1
  • ポート:23
  • パスワードがありません。

robots_init() 関数でロボットに接続し、次のコードを使用してこれを実行しようとしています。

FILE *telnet = popen("telnet -l as 192.168.0.1 23", "w");

からman telnet

SYNOPSIS
     telnet [-468ELadr] [-S tos] [-b address] [-e escapechar] [-l user]
            [-n tracefile] [host [port]]

[...]
     -l user
             Specify user as the user to log in as on the remote system. This
             is accomplished by sending the specified name as the USER envi‐
             ronment variable, so it requires that the remote system support
             the TELNET NEW-ENVIRON option. This option implies the -a option,
             and may also be used with the open command.

しかし、Cコードを書く前に、DockerコンテナにTelnetサーバーを設定し、クライアントとして別のDockerを介して通信しようとしました。

サーバーを実行します。

sudo docker container run --name telnet-server --publish 2323:23 --detach --restart unless-stopped secobau/telnetd:alpine-1.1

サーバーにユーザー= user;ip= 172.17.0.1;port= 2323;があり、パスワードがありません。

クライアントを実行します。

sudo docker run --interactive --tty --name=telnet-client debian:testing bash
apt-get update
apt-get install telnet --yes
telnet -l user 172.17.0.1 2323

私はこれがすでにログインしているTelnet接続を提供することを望んでいましたが(または少なくとも私に自分のパスワードを尋ねること)、ログインを依頼し続けます。

Telnetのバグですか?これをどのように自動化するのですか?

それでも動作しない場合は、telnet -l次のようにパイプする必要があるようです。

fprintf(telnet, "as\n");  // user
fprintf(telnet, "\n"); // password (no password)

ベストアンサー1

興味深い質問です。 Dockerを使用して、互いに完全に分離された複数のサービスをすばやく設定するのがいかに簡単かを示します。

私の考えでは、telnetdがまだパスワードを要求している-l /bin/loginようです。secobau/telnetd:alpine-1.1 用 Dockerfile:

ARG LOGIN=/bin/login
ARG PORT=23
ARG USER=user

ENV CMD "/usr/sbin/telnetd -p $PORT -b $ADDR -l $LOGIN -F"

非常に似た Dockerfile を作成できますが、置き換えると機能し/bin/loginます /bin/sh。たとえば、新しいDockerfileは次のようになります。

FROM alpine

ARG ADDR=0.0.0.0
ARG LOGIN=/bin/login
ARG PORT=23
ARG USER=user

ENV CMD "/usr/sbin/telnetd -p $PORT -b $ADDR -l /bin/sh -F"

EXPOSE $PORT

RUN apk update && apk upgrade && apk add busybox-extras
RUN adduser -D $USER && echo -e "\n\n" | passwd $USER

RUN echo "$CMD" | tee cmd.sh && chmod +x cmd.sh
CMD ./cmd.sh

ビルドしてください:

docker build -t my/telnet .

走る:

docker container run --name my-telnet-server --publish 2323:23 --detach --restart unless-stopped  my/telnet

これで、クライアントコンテナにユーザー名とパスワードを入力しなくてもログインできます。

root@e55f8f1f3e55:/# telnet -l user 172.17.0.1 2323
Trying 172.17.0.1...
Connected to 172.17.0.1.
Escape character is '^]'.

/ #

ちなみに、dockerを実行するためにsudoを使用する必要はなく、dockerグループに自分自身を追加するだけです。

おすすめ記事