Die Shell- und Exec-Kanäle sind ziemlich ähnlich - beide führen Befehle mit aus die Remote-Shell (zumindest konzeptionell - der Server könnte natürlich so konfiguriert sein, dass er sie anders behandelt). RFC 4254 gruppiert sie im Abschnitt "Interaktive Sitzungen" , und sie beide (sowie das Subsystem, siehe unten) verwenden Sie den Kanaltyp "Sitzung" im SSH-Protokoll.
Es gibt einen wichtigen Unterschied:
Für ChannelShell
, liefert der Eingabestrom sowohl die Befehle als auch die Eingabe für diese Befehle. Dies ist wie Verwenden einer interaktiven Shell auf Ihrem lokalen Computer. (Und es wird normalerweise nur dafür verwendet: interaktive Nutzung.)
Für ChannelExec
werden die Befehle mit setCommand () vor connect()
angegeben und der Eingabestrom wird als Eingabe an diese Befehle gesendet. (In den meisten Fällen haben Sie nur einen Befehl, aber Sie können mehrere mit den normalen Shell-Separatoren &
, &&
, |
, ||
, ;
, Newline und Compound-Befehle angeben.) This ist wie Ausführen eines Shell-Skripts auf Ihrem lokalen Computer. (Wenn einer der Befehle selbst eine interaktive Shell ist, verhält sich das natürlich wie ein ChannelShell
.)
Es gibt eine dritte ähnliche, ChannelSubsystem
, die ein Subsystem des SSH-Servers ausführt - hier entscheidet die Konfiguration des Servers, was zu tun ist, nicht die Shell des Remote-Benutzers. (Das am häufigsten verwendete Subsystem ist sftp
, aber dafür stellt JSch einen speziellen Kanal zur Verfügung, der das Protokoll versteht.)