私は、シェル インターフェイスを提供せずに Telnet 接続を受け入れる簡単な方法を探しています。これは、MUD サーバーのようなもので、実際には次のような静的コンテンツを提供したいと考えています。
telnet towel.blinkenlights.nl
サーバーは、新しい Telnet 接続ごとにサードパーティ アプリケーション (この場合は VLC) の新しいインスタンスを起動し、アプリケーションの出力 (ASCII ビデオ レンダリング) をリモート ユーザーに直接配信する必要があります。
どこから始めればよいか、何か提案はありますか?
答え1
最も単純な解決策は、次のように VLC をユーザーのログイン シェルにすることです。
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/usr/bin/cvlc
または実行したいプログラム。これには、コマンドライン引数を指定できないという制限があります。おそらく、通常のpasswd
エントリが必要です。
joe:AU03oahyYRjl6:1234:56:Joe Smith:/usr/joe:/bin/sh
そして各ユーザー.profile
に
exec /usr/bin/cvlc --
(オプション)playlist.xspf
または、あなたが望むどんな議論でも。
「ASCIIビデオレンダリング」の意味がよく分かりません。ユーザーのワークステーションでオーディオ/ビデオを再生したいですか?ユーザーはX11サーバーを実行していますか?もしそうなら、
w=`who am i`
d=`expr "$w" : '.*(\(.*\))'`
に.profile
、そして追加します
--x11-display "$d":0
にあなたの選択肢警告: さまざまな条件により、これが失敗する可能性があります。
答え2
http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLE_ADDRESS_EXEC
socat TCP4-LISTEN:5555,fork,tcpwrap=script \
EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr
接続 (TCP4-LISTEN) を受け入れ、各接続ごとに新しい子プロセスをフォークする単純なサーバー。各子は単一のリレーとして機能します。クライアントは、/etc/hosts.allow および /etc/hosts.deny のデーモン プロセス名 "script" のルールに一致する必要があります。一致しない場合はアクセスを拒否されます ("man 5 hosts_access" を参照)。プログラムを実行するために、子プロセスは /home/sandbox に chroot し、ユーザー sandbox に su してから、プログラム /home/sandbox/bin/myscript を起動します。socat と myscript は疑似 tty (pty) を介して通信します。myscript の stderr は stdout にリダイレクトされるため、そのエラー メッセージは socat を介して接続されたクライアントに転送されます。
5555を23(Telnetのデフォルトのポート番号)に変更することができます。
/bin/myscript を VLC スクリプトまたはバイナリに変更します。
http://www.dest-unreach.org/socat/doc/socat.html#ADDRESS_TYPES
EXEC:<command-line>
親プロセスとの通信を確立し、 execvp() で指定されたプログラムを呼び出すサブプロセスをフォークします。<command-line> は、単一のスペースで区切られた引数を持つ単純なコマンドです。プログラム名に '/' が含まれている場合、最後の '/' の後の部分が ARGV[0] として取得されます。プログラム名が相対パスの場合、$PATH を介してプログラムを見つけるための execvp() セマンティクスが適用されます。プログラムが正常に起動すると、 socat はプロセスの stdin にデータを書き込み、デフォルトで socketpair() によって生成された UNIX ドメイン ソケットを使用して stdout からデータを読み取ります。
答え3
Linux システムの場合は、inetd
またはを使用しますxinetd
。標準の Telnet ポートを指す新しいサービスを作成し、実行可能ファイルを実際のサービスとして指定します。