ウェブブラウザを使ってサーバにターミナルのようにログインする

環境

  • Windows10home上のDockerコンテナを利用します
  • DockerHUBからtsl0922/ttydを使わせて頂きます
  • 192.168.1.120にsshでアクセスできる端末を用意しました

起動テスト

dockerを使って環境を作ります。

> docker run --rm -it -p 3000:3000 tsl0922/ttyd ttyd -p 3000 -a /bin/bash

上記を実行したのち、ウェブブラウザで、http://localhost:3000/ にアクセスすると、ウェブブラウザの表示がターミナルになり、上記で起動したdockerのOSに /bin/bash を使ってログインした状態になります。

root@a1356431acf0:~# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:12 pts/0    00:00:00 /usr/bin/tini -- ttyd -p 3000 -a /bin/bash
root         7     1  0 13:12 pts/0    00:00:00 ttyd -p 3000 -a /bin/bash
root         8     7  0 13:12 pts/1    00:00:00 /bin/bash
root        12     8  0 13:15 pts/1    00:00:00 ps -ef

リモートのホストへログイン

次にブラウザでログインしたいサーバのIPアドレスをクエリパラメータとして渡してsshでリモートのホストにログインできるようにしてみます。それには、このdockerイメージにsshコマンドをインストールする必要があるので、Dockerfileを作って新しいdocker imageを生成しそれを使います。

パラメータを実行プログラムに渡すには「-a」オプションを付ける必要があります。ttydへはport 3000番で繋がるようにします。

FROM tsl0922/ttyd:latest

RUN apt update -y
RUN apt install openssh-client -y
RUN echo "#!/bin/bash"           >  /root/ssh.sh
RUN echo                         >> /root/ssh.sh
RUN echo '/usr/bin/ssh -l $1 $2' >> /root/ssh.sh
RUN chmod +x /root/ssh.sh

EXPOSE 3000
ENTRYPOINT ["/usr/bin/ttyd", "-p 3000", "-a", "/root/ssh.sh"]

上記内容を Dockerfile というファイル名で保存してください。

※セキュリティ的に非常にまずい例ですが、与えられたアカウント名を$1、接続先IPを$2で受け取ってsshの引数にして実行します。

作成したDockerfileをbuildしてimageを作成します。

> docker build -t ttyd:0.1 .

作成したイメージを確認します。

> docker images | Select-String ttyd

ttyd 0.1 7cd138f3f6fe   About a minute ago   133MB

作成したコンテナを起動します。

> docker run --rm -d -p 3000:3000 ttyd:0.1

また /root/ssh.sh に値を渡すためのパラメータは以下の通りargを指定します。

http://localhost:3000/?arg=sakana&arg=192.168.1.120

上記のURLでウェブブラウザを用いてアクセスすると192.168.1.120というホストにsakanaというアカウントでssh接続しパスワードを聞かれた状態の画面が出力されていると思います。

試す場合はご自身の環境に合わせて値を変更してみてください。


投稿日

カテゴリー:

投稿者: