ChannelExec
&の違いを教えてもらえますかChannelShell
?
3 に答える
shell チャネルと exec チャネルは非常によく似ています。どちらもリモート シェルでコマンドを実行します (少なくとも、概念的には - もちろん、サーバーはそれらを異なる方法で処理するように構成されている可能性があります)。RFC 4254 はそれらをセクション "Interactive Sessions"にグループ化し、両方 (およびサブシステム、以下を参照) は SSH プロトコルでチャネル タイプ "session" を使用します。
重要な違いが 1 つあります。
の場合
ChannelShell
、入力ストリームは、コマンドとこれらのコマンドへの入力の両方を提供します。これは、ローカル コンピューターで対話型シェルを使用するようなものです。(そして、それは通常、インタラクティブな使用のためだけに使用されます。)の場合
ChannelExec
、コマンドは の前に setCommand() で指定されconnect()
、入力ストリームは入力としてこれらのコマンドに転送されます。(ほとんどの場合、コマンドは 1 つしかありませんが、通常のシェル区切り記号&
、&&
、|
、||
、;
改行、および複合コマンドを使用して複数のコマンドを指定できます。) これは、ローカル コンピューターでシェル スクリプトを実行するようなものです。(もちろん、コマンド自体の 1 つが対話型シェルである場合、これは のように動作しChannelShell
ます。)3 番目に似たものがあります
ChannelSubsystem
。これは、ssh サーバーのサブシステムを実行します。ここでは、リモート ユーザーのシェルではなく、サーバーの構成が何を行うかを決定します。(最も頻繁に使用されるサブシステムは ですsftp
が、このために JSch はプロトコルを理解する特殊なチャネルを提供します。)
ここで「入力ストリーム」と呼ぶのは、ローカル ホストからリモート ホストへのチャネル内のデータ ストリームであることに注意してください。実際には、Java InputStream をメソッドに渡すか、メソッドから Java OutputStream を取得することによって実行できますsetInputStream
。getOutputStream
それに書き込みます。
exec チャネルとシェル チャネルの間には、もう 1 つ重要な違いがあります。シェル チャネルは環境変数などのシェル環境を確立しますが、exec チャネルは確立しません。