ネットワーク経由で端末を完全に制御する方法はありますか。たとえば、C で記述されたサーバーとクライアントがあり、rm file
またはcd directory
のようなコマンドをサーバー (この場合のサーバーは Linux コンピューター) に送信し、ターミナル出力をクライアントに返したいとします。現在使用しls
てpopen()
いますが、ディレクトリを変更したり、他の複雑なコマンドを実行したりすることはできません。コマンドを使用して端末から完全な出力を取得するために、おそらくfork()
pipe()
および他の関数を使用して、これを行うためのより良い方法はありますか。
3 に答える
あなたが求めることはSSHによって行われます。
たとえば、C で記述されたサーバーとクライアントがあり、rm ファイルや cd ディレクトリなどのコマンドをサーバー (この場合のサーバーは Linux コンピューター) に送信し、ターミナル出力をクライアントに返したいとします。
このような機能を自分で実装することは強くお勧めしません。あなた自身のアプローチには、いくつかのセキュリティ上の問題がある可能性が高いです。
SSH はリモート ターミナルのデファクト スタンダードであり、強力な暗号化、実世界でテスト済みの認証、および強力なメンテナンス サポートを備えています。また、OpenSSH などの優れたオープン ソース実装もあります。
正確なセットアップが何であるかはわかりませんが、リモート側でシェルをフォークしてみませんか? その後、コマンドラインから実行できることはすべて実行できます。
実際のインタラクティブな接続がオプションである場合は、pty (「pseudo-ttys」) を調べてください。それが実際の端末アプリケーションの仕組みです。
そこから出力を得ることができればls
、あなたは正しい道を進んでいます。
次は、入力を送信できるようにすることです。出力とあまり変わりません。コマンドcat
を使用して、入力と出力の両方を同時に正しく実行しているかどうかを確認できます。
次に、お気に入りのシェル コマンド (たとえばbash
) を実行するだけで、コマンドを入力ストリームに書き込み、各コマンドからの出力を読み取ることができます。
cd
はプログラムではないことに注意してください。これはシェルコマンドなので、何かを意味するためにはシェルを実行する必要があります。リダイレクトや、やりたいと思われるその他の複雑さについても同じことが言えます。
PS: これは重大なセキュリティ上の問題である可能性があり、他の人が言っているように、ssh などの既に作成された代替手段を真剣に検討する必要があることに注意してください。