
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グループに自分自身を追加するだけです。