98_telnet.pm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. ##############################################
  2. # $Id: 98_telnet.pm 17529 2018-10-14 12:57:06Z rudolfkoenig $
  3. # Note: this is not really a telnet server, but a TCP server with slight telnet
  4. # features (disable echo on password)
  5. package main;
  6. use strict;
  7. use warnings;
  8. use TcpServerUtils;
  9. ##########################
  10. sub
  11. telnet_Initialize($)
  12. {
  13. my ($hash) = @_;
  14. $hash->{DefFn} = "telnet_Define";
  15. $hash->{ReadFn} = "telnet_Read";
  16. $hash->{AsyncOutputFn} = "telnet_Output";
  17. $hash->{UndefFn} = "telnet_Undef";
  18. $hash->{AttrFn} = "telnet_Attr";
  19. no warnings 'qw';
  20. my @attrList = qw(
  21. SSL
  22. allowedCommands
  23. allowfrom
  24. connectInterval
  25. connectTimeout
  26. encoding:utf8,latin1
  27. globalpassword
  28. password
  29. prompt
  30. sslCertPrefix
  31. sslVersion
  32. );
  33. use warnings 'qw';
  34. $hash->{AttrList} = join(" ", @attrList);
  35. $hash->{ActivateInformFn} = "telnet_ActivateInform";
  36. $hash->{CanAuthenticate} = 2;
  37. $cmds{encoding} = { Fn=>"CommandTelnetEncoding",
  38. ClientFilter => "telnet",
  39. Hlp=>"[utf8|latin1],query and set the character encoding ".
  40. "for the current telnet session" };
  41. $cmds{inform} = { Fn=>"CommandTelnetInform",
  42. ClientFilter => "telnet",
  43. Hlp=>"{on|onWithState|off|log|raw|timer|status},".
  44. "echo all events to this client" };
  45. }
  46. sub
  47. CommandTelnetEncoding($$)
  48. {
  49. my ($hash, $param) = @_;
  50. my $ret = "";
  51. if( !$param ) {
  52. $ret = "current encoding is $hash->{encoding}";
  53. } elsif( $param eq "utf8" || $param eq "latin1" ) {
  54. $hash->{encoding} = $param;
  55. syswrite($hash->{CD}, sprintf("%c%c%c", 255, 253, 0) );
  56. $ret = "encoding changed to $param";
  57. } else {
  58. $ret = "unknown encoding >>$param<<";
  59. }
  60. return $ret;
  61. }
  62. ##########################
  63. sub
  64. telnet_ClientConnect($)
  65. {
  66. my ($hash) = @_;
  67. my $name = $hash->{NAME};
  68. $hash->{DEF} =~ m/^(IPV6:)?(.*):(\d+)$/;
  69. my ($isIPv6, $server, $port) = ($1, $2, $3);
  70. Log3 $name, 4, "$name: Connecting to $server:$port...";
  71. my @opts = (
  72. PeerAddr => "$server:$port",
  73. Timeout => AttrVal($name, "connectTimeout", 2),
  74. );
  75. my $client;
  76. if($hash->{SSL}) {
  77. $client = IO::Socket::SSL->new(@opts);
  78. } else {
  79. $client = IO::Socket::INET->new(@opts);
  80. }
  81. if($client) {
  82. $hash->{FD} = $client->fileno();
  83. $hash->{CD} = $client; # sysread / close won't work on fileno
  84. $hash->{BUF} = "";
  85. $hash->{CONNECTS}++;
  86. $selectlist{$name} = $hash;
  87. $hash->{STATE} = "Connected";
  88. RemoveInternalTimer($hash);
  89. Log3 $name, 3, "$name: connected to $server:$port";
  90. } else {
  91. telnet_ClientDisconnect($hash, 1);
  92. }
  93. }
  94. ##########################
  95. sub
  96. telnet_ClientDisconnect($$)
  97. {
  98. my ($hash, $connect) = @_;
  99. my $name = $hash->{NAME};
  100. close($hash->{CD}) if($hash->{CD});
  101. delete($hash->{FD});
  102. delete($hash->{CD});
  103. delete($selectlist{$name});
  104. $hash->{STATE} = "Disconnected";
  105. InternalTimer(gettimeofday()+AttrVal($name, "connectInterval", 60),
  106. "telnet_ClientConnect", $hash, 0);
  107. if($connect) {
  108. Log3 $name, 4, "$name: Connect failed.";
  109. } else {
  110. Log3 $name, 3, "$name: Disconnected";
  111. }
  112. }
  113. ##########################
  114. sub
  115. telnet_Define($$$)
  116. {
  117. my ($hash, $def) = @_;
  118. my @a = split("[ \t][ \t]*", $def);
  119. my ($name, $type, $pport, $global) = split("[ \t]+", $def);
  120. my $port = $pport;
  121. $port =~ s/^IPV6://;
  122. my $isServer = 1 if(defined($port) && $port =~ m/^\d+$/);
  123. my $isClient = 1 if($port && $port =~ m/^(.+):\d+$/);
  124. return "Usage: define <name> telnet { [IPV6:]<tcp-portnr> [global] | ".
  125. " [IPV6:]serverName:port }"
  126. if(!($isServer || $isClient) ||
  127. ($isClient && $global));
  128. # Make sure that fhem only runs once
  129. if($isServer) {
  130. my $ret = TcpServer_Open($hash, $pport, $global);
  131. if($ret && !$init_done) {
  132. Log3 $name, 1, "$ret. Exiting.";
  133. exit(1);
  134. }
  135. return $ret;
  136. }
  137. if($isClient) {
  138. $hash->{isClient} = 1;
  139. telnet_ClientConnect($hash);
  140. }
  141. }
  142. ##########################
  143. sub
  144. telnet_Read($)
  145. {
  146. my ($hash) = @_;
  147. my $name = $hash->{NAME};
  148. if($hash->{SERVERSOCKET}) { # Accept and create a child
  149. my $chash = TcpServer_Accept($hash, "telnet");
  150. return if(!$chash);
  151. $chash->{canAsyncOutput} = 1;
  152. $chash->{encoding} = AttrVal($name, "encoding", "utf8");
  153. $chash->{prompt} = AttrVal($name, "prompt",
  154. AttrVal('global','title','fhem'));
  155. if($chash->{prompt} =~ m/^{.*}$/s) {
  156. $chash->{prompt} = eval $chash->{prompt};
  157. $chash->{prompt} =~ s/\n//;
  158. }
  159. $chash->{prompt} .= '>'; # Not really nice, but dont know better.
  160. syswrite($chash->{CD}, sprintf("%c%c%c", 255, 253, 0) )
  161. if( AttrVal($name, "encoding", "") ); #DO BINARY
  162. $chash->{CD}->flush();
  163. my $auth = Authenticate($chash, undef);
  164. syswrite($chash->{CD}, sprintf("%c%c%cPassword: ", 255, 251, 1)) # WILL ECHO
  165. if($auth);
  166. $chash->{Authenticated} = 0 if(!$auth);
  167. return;
  168. }
  169. my $buf;
  170. my $ret = sysread($hash->{CD}, $buf, 256);
  171. if(!defined($ret) || $ret <= 0) {
  172. if($hash->{isClient}) {
  173. telnet_ClientDisconnect($hash, 0);
  174. } else {
  175. delete $hash->{canAsyncOutput};
  176. CommandDelete(undef, $name);
  177. }
  178. return;
  179. }
  180. if(ord($buf) == 4) { # EOT / ^D
  181. CommandQuit($hash, "");
  182. return;
  183. }
  184. $buf =~ s/\r//g;
  185. my $sname = ($hash->{isClient} ? $name : $hash->{SNAME});
  186. if(!defined($hash->{Authenticated}) || $hash->{Authenticated}) {
  187. $buf =~ s/\xff..//g; # Telnet IAC stuff
  188. $buf =~ s/\xfd(.)//; # Telnet Do ?
  189. syswrite($hash->{CD}, sprintf("%c%c%c", 0xff, 0xfc, ord($1)))
  190. if(defined($1)) # Wont / ^C handling
  191. }
  192. $hash->{BUF} .= $buf;
  193. my @ret;
  194. my $gotCmd;
  195. while($hash->{BUF} =~ m/\n/) {
  196. my ($cmd, $rest) = split("\n", $hash->{BUF}, 2);
  197. $hash->{BUF} = $rest;
  198. if(!defined($hash->{Authenticated})) {
  199. syswrite($hash->{CD}, sprintf("%c%c%c\r\n", 255, 252, 1)); # WONT ECHO
  200. if(Authenticate($hash, $cmd) != 2) {
  201. $hash->{Authenticated} = 1;
  202. next;
  203. } else {
  204. if($hash->{isClient}) {
  205. telnet_ClientDisconnect($hash, 0);
  206. } else {
  207. delete($hash->{rcvdQuit});
  208. CommandDelete(undef, $name);
  209. }
  210. return;
  211. }
  212. }
  213. $gotCmd = 1;
  214. if($cmd || $hash->{prevlines}) {
  215. if($cmd =~ m/\\\s*$/) { # Multi-line
  216. $cmd =~ s/\\\s*$//;
  217. $hash->{prevlines} .= $cmd . "\n";
  218. } else {
  219. if($hash->{prevlines}) {
  220. $cmd = $hash->{prevlines} . $cmd;
  221. undef($hash->{prevlines});
  222. }
  223. $cmd = latin1ToUtf8($cmd) if( $hash->{encoding} eq "latin1" );
  224. $ret = AnalyzeCommandChain($hash, $cmd);
  225. push @ret, $ret if(defined($ret));
  226. }
  227. } else {
  228. $hash->{showPrompt} = 1; # Empty return
  229. if(!$hash->{motdDisplayed}) {
  230. my $motd = $attr{global}{motd};
  231. push @ret, $motd if($motd && $motd ne "none");
  232. $hash->{motdDisplayed} = 1;
  233. }
  234. }
  235. next if($rest);
  236. }
  237. $ret = "";
  238. $ret .= (join("\n", @ret) . "\n") if(@ret);
  239. $ret .= ($hash->{prevlines} ? "> " : $hash->{prompt}." ")
  240. if($gotCmd && $hash->{showPrompt} && !$hash->{rcvdQuit});
  241. $ret =~ s/\n/\r\n/g if($hash->{Authenticated}); # only for DOS telnet
  242. telnet_Output($hash, $ret, 1);
  243. if($hash->{rcvdQuit}) {
  244. if($hash->{isClient}) {
  245. delete($hash->{rcvdQuit});
  246. telnet_ClientDisconnect($hash, 0);
  247. } else {
  248. CommandDelete(undef, $name);
  249. }
  250. }
  251. }
  252. sub
  253. telnet_Output($$$)
  254. {
  255. my ($hash,$ret,$nonl) = @_;
  256. if($ret) {
  257. $ret = utf8ToLatin1($ret) if( $hash->{encoding} eq "latin1" );
  258. if(!$nonl) { # AsyncOutput stuff
  259. $ret = "\n$ret\n$hash->{prompt} " if( $hash->{showPrompt});
  260. $ret = "$ret\n" if(!$hash->{showPrompt});
  261. }
  262. for(;;) {
  263. utf8::encode($ret) if(utf8::is_utf8($ret) && $ret =~ m/[^\x00-\xFF]/);
  264. my $l = syswrite($hash->{CD}, $ret);
  265. last if(!$l || $l == length($ret));
  266. $ret = substr($ret, $l);
  267. }
  268. $hash->{CD}->flush();
  269. }
  270. return undef;
  271. }
  272. ##########################
  273. sub
  274. telnet_Attr(@)
  275. {
  276. my ($type, $devName, $attrName, @param) = @_;
  277. my @a = @_;
  278. my $hash = $defs{$devName};
  279. if($type eq "set" && $attrName eq "SSL") {
  280. TcpServer_SetSSL($hash);
  281. if($hash->{CD}) {
  282. my $ret = IO::Socket::SSL->start_SSL($hash->{CD});
  283. Log3 $devName, 1, "$hash->{NAME} start_SSL: $ret" if($ret);
  284. }
  285. }
  286. if(($attrName eq "allowedCommands" ||
  287. $attrName eq "password" ||
  288. $attrName eq "globalpassword" ) && $type eq "set") {
  289. my $aName = "allowed_$devName";
  290. my $exists = ($defs{$aName} ? 1 : 0);
  291. AnalyzeCommand(undef, "defmod $aName allowed");
  292. AnalyzeCommand(undef, "attr $aName validFor $devName");
  293. AnalyzeCommand(undef, "attr $aName $attrName ".join(" ",@param));
  294. return "$devName: ".($exists ? "modifying":"creating").
  295. " device $aName for attribute $attrName";
  296. }
  297. return undef;
  298. }
  299. sub
  300. telnet_Undef($$)
  301. {
  302. my ($hash, $arg) = @_;
  303. delete($logInform{$hash->{NAME}});
  304. delete($inform{$hash->{NAME}});
  305. return TcpServer_Close($hash);
  306. }
  307. #####################################
  308. sub
  309. CommandTelnetInform($$)
  310. {
  311. my ($cl, $param) = @_;
  312. return if(!$cl);
  313. my $name = $cl->{NAME};
  314. return "Usage: inform {on|onWithState|off|raw|timer|log|status} [regexp]"
  315. if($param !~ m/^(on|onWithState|off|raw|timer|log|status)/);
  316. if($param eq "status") {
  317. my $i = $inform{$name};
  318. return $i ? ($i->{type} . ($i->{regexp} ? " ".$i->{regexp} : "")) : "off";
  319. }
  320. if($param eq "off") {
  321. delete($logInform{$name});
  322. delete($inform{$name});
  323. } elsif($param eq "log") {
  324. $logInform{$name} = sub($$){
  325. my ($me, $msg) = @_; # _NO_ Log3 here!
  326. telnet_Output($defs{$me}, $msg."\n", 1);
  327. }
  328. } elsif($param ne "off") {
  329. my ($type, $regexp) = split(" ", $param);
  330. $inform{$name}{NR} = $cl->{NR};
  331. $inform{$name}{type} = $type;
  332. if($regexp) {
  333. eval { "Hallo" =~ m/$regexp/ };
  334. return "Bad regexp: $@" if($@);
  335. $inform{$name}{regexp} = $regexp;
  336. }
  337. Log 4, "Setting inform to $param";
  338. }
  339. return undef;
  340. }
  341. sub
  342. telnet_ActivateInform($)
  343. {
  344. my ($cl) = @_;
  345. CommandTelnetInform($cl, "log");
  346. }
  347. 1;
  348. =pod
  349. =item helper
  350. =item summary telnet server for FHEM
  351. =item summary_DE FHEM telnet Server
  352. =begin html
  353. <a name="telnet"></a>
  354. <h3>telnet</h3>
  355. <ul>
  356. <br>
  357. <a name="telnetdefine"></a>
  358. <b>Define</b>
  359. <ul>
  360. <code>define &lt;name&gt; telnet &lt;portNumber&gt;
  361. [global|hostname]</code><br>
  362. or<br>
  363. <code>define &lt;name&gt; telnet &lt;servername&gt;:&lt;portNumber&gt;</code>
  364. <br><br>
  365. First form, <b>server</b> mode:<br>
  366. Listen on the TCP/IP port <code>&lt;portNumber&gt;</code> for incoming
  367. connections. If the second parameter is <b>not</b> specified,
  368. the server will only listen to localhost connections. If the second
  369. parameter is global, telnet will listen on all interfaces, else it wil try
  370. to resolve the parameter as a hostname, and listen only on this interface.
  371. <br>
  372. To use IPV6, specify the portNumber as IPV6:&lt;number&gt;, in this
  373. case the perl module IO::Socket:INET6 will be requested.
  374. On Linux you may have to install it with cpan -i IO::Socket::INET6 or
  375. apt-get libio-socket-inet6-perl; OSX and the FritzBox-7390 perl already has
  376. this module.<br>
  377. Examples:
  378. <ul>
  379. <code>define tPort telnet 7072 global</code><br>
  380. <code>attr tPort SSL</code><br>
  381. <code>attr allowed_tPort allowed</code><br>
  382. <code>attr allowed_tPort validFor tPort</code><br>
  383. <code>attr allowed_tPort globalpassword mySecret</code><br>
  384. </ul>
  385. Note: The old global attribute port is automatically converted to a
  386. telnet instance with the name telnetPort. The global allowfrom attibute is
  387. lost in this conversion.
  388. <br><br>
  389. Second form, <b>client</b> mode:<br>
  390. Connect to the specified server port, and execute commands received from
  391. there just like in server mode. This can be used to connect to a fhem
  392. instance sitting behind a firewall, when installing exceptions in the
  393. firewall is not desired or possible. Note: this client mode supprts SSL,
  394. but not IPV6.<br>
  395. Example:
  396. <ul>
  397. Start tcptee first on publicly reachable host outside the firewall.<ul>
  398. perl contrib/tcptee.pl --bidi 3000</ul>
  399. Configure fhem inside the firewall:<ul>
  400. define tClient telnet &lt;tcptee_host&gt;:3000</ul>
  401. Connect to the fhem from outside of the firewall:<ul>
  402. telnet &lt;tcptee_host&gt; 3000</ul>
  403. </ul>
  404. </ul>
  405. <br>
  406. <a name="telnetset"></a>
  407. <b>Set</b> <ul>N/A</ul><br>
  408. <a name="telnetget"></a>
  409. <b>Get</b> <ul>N/A</ul><br>
  410. <a name="telnetattr"></a>
  411. <b>Attributes:</b>
  412. <ul>
  413. <a name="prompt"></a>
  414. <li>prompt<br>
  415. Sets the string for the telnet prompt, the default is fhem&gt;
  416. </li><br>
  417. <a name="SSL"></a>
  418. <li>SSL<br>
  419. Enable SSL encryption of the connection, see the description <a
  420. href="#HTTPS">here</a> on generating the needed SSL certificates. To
  421. connect to such a port use one of the following commands:
  422. <ul>
  423. socat openssl:fhemhost:fhemport,verify=0 readline<br>
  424. ncat --ssl fhemhost fhemport<br>
  425. openssl s_client -connect fhemhost:fhemport<br>
  426. </ul>
  427. </li><br>
  428. <a name="allowfrom"></a>
  429. <li>allowfrom<br>
  430. Regexp of allowed ip-addresses or hostnames. If set, only connections
  431. from these addresses are allowed.<br>
  432. NOTE: if this attribute is not defined and there is no valid allowed
  433. device defined for the telnet/FHEMWEB instance and the client tries to
  434. connect from a non-local net, then the connection is refused. Following
  435. is considered a local net:<br>
  436. <ul>
  437. IPV4: 127/8, 10/8, 192.168/16, 172.16/10, 169.254/16<br>
  438. IPV6: ::1, fe80/10<br>
  439. </ul>
  440. </li><br>
  441. <a name="connectTimeout"></a>
  442. <li>connectTimeout<br>
  443. Wait at maximum this many seconds for the connection to be established.
  444. Default is 2.
  445. </li><br>
  446. <a name="connectInterval"></a>
  447. <li>connectInterval<br>
  448. After closing a connection, or if a connection cannot be estblished,
  449. try to connect again after this many seconds. Default is 60.
  450. </li><br>
  451. <a name="encoding"></a>
  452. <li>encoding<br>
  453. Sets the encoding for the data send to the client. Possible values are
  454. latin1 and utf8. Default is utf8.
  455. </li><br>
  456. <li>sslVersion<br>
  457. See the global attribute sslVersion.
  458. </li><br>
  459. <li>sslCertPrefix<br>
  460. Set the prefix for the SSL certificate, default is certs/server-, see
  461. also the SSL attribute.
  462. </li><br>
  463. </ul>
  464. </ul>
  465. =end html
  466. =begin html_DE
  467. <a name="telnet"></a>
  468. <h3>telnet</h3>
  469. <ul>
  470. <br>
  471. <a name="telnetdefine"></a>
  472. <b>Define</b>
  473. <ul>
  474. <code>define &lt;name&gt; telnet &lt;portNumber&gt;
  475. [global|hostname]</code><br> oder<br>
  476. <code>define &lt;name&gt; telnet &lt;servername&gt;:&lt;portNummer&gt;</code>
  477. <br><br>
  478. Erste Form, <b>Server</b>-mode:<br>
  479. &Uuml;berwacht den TCP/IP-Port <code>&lt;portNummer&gt;</code> auf
  480. ankommende Verbindungen. Wenn der zweite Parameter <b>nicht</b>
  481. angegeben wird, wird der Server nur auf Verbindungen von localhost achten.
  482. Falls der zweite Parameter global ist, dann wird telnet auf allen lokalen
  483. Netzwerk-Interfaces zuh&ouml;ren, ansonsten wird der Parameter als Hostname
  484. oder Adresse interpretiert, und nur diese lokale Adresse bedient.
  485. <br>
  486. F&uuml;r den Gebrauch von IPV6 muss die Portnummer als IPV6:&lt;nummer&gt;
  487. angegeben werden, in diesem Fall wird das Perl-Modul IO::Socket:INET6
  488. angesprochen. Unter Linux kann es sein, dass dieses Modul mittels cpan -i
  489. IO::Socket::INET6 oder apt-get libio-socket-inet6-perl nachinstalliert werden
  490. muss; OSX und Fritzbox-7390 enthalten bereits dieses Modul.<br>
  491. Beispiele:
  492. <ul>
  493. <code>define tPort telnet 7072 global</code><br>
  494. <code>attr tPort SSL</code><br>
  495. <code>attr allowed_tPort allowed</code><br>
  496. <code>attr allowed_tPort validFor tPort</code><br>
  497. <code>attr allowed_tPort globalpassword mySecret</code><br>
  498. </ul>
  499. Hinweis: Das alte (pre 5.3) "global attribute port" wird automatisch in
  500. eine telnet-Instanz mit dem Namen telnetPort umgewandelt. Im Rahmen dieser
  501. Umwandlung geht das globale Attribut allowfrom verloren.
  502. <br><br>
  503. Zweite Form, <b>Client</b>-mode:<br>
  504. Verbindet zu einem angegebenen Server-Port und f&uuml;hrt die von dort aus
  505. empfangenen Anweisungen - genau wie im Server-mode - aus. Dies kann
  506. verwendet werden, um sich mit einer fhem-Instanz, die sich hinter einer
  507. Firewall befindet, zu verbinden, f&uuml;r den Fall, wenn das Installieren
  508. von Ausnahmen in der Firewall nicht erw&uuml;nscht oder nicht m&ouml;glich
  509. sind. Hinweis: Dieser Client-mode unterst&uuml;tzt zwar SSL, aber nicht
  510. IPV6.<br>
  511. Beispiel:
  512. <ul>
  513. Starten von tcptee auf einem &ouml;ffentlich erreichbaren Host ausserhalb
  514. der Firewall:<ul>
  515. <code>perl contrib/tcptee.pl --bidi 3000</code></ul>
  516. Konfigurieren von fhem innerhalb der Firewall:<ul>
  517. <code>define tClient telnet &lt;tcptee_host&gt;:3000</code></ul>
  518. Verbinden mit fhem (hinter der Firewall) von ausserhalb der Firewall:<ul>
  519. <code>telnet &lt;tcptee_host&gt; 3000</code></ul>
  520. </ul>
  521. </ul>
  522. <br>
  523. <a name="telnetset"></a>
  524. <b>Set</b> <ul>N/A</ul><br>
  525. <a name="telnetget"></a>
  526. <b>Get</b> <ul>N/A</ul><br>
  527. <a name="telnetattr"></a>
  528. <b>Attribute</b>
  529. <ul>
  530. <a name="prompt"></a>
  531. <li>prompt<br>
  532. Gibt die Zeichenkette an, welche in der Telnet-Sitzung als
  533. Kommandoprompt ausgegeben wird. Die Voreinstellung ist fhem&gt;
  534. </li><br>
  535. <a name="SSL"></a>
  536. <li>SSL<br>
  537. SSL-Verschl&uuml;sselung f&uuml;r eine Verbindung aktivieren. <a
  538. href="#HTTPS">Hier</a> gibt es eine Beschreibung, wie das erforderliche
  539. SSL-Zertifikat generiert werden kann. Um eine Verbindung mit solch
  540. einem Port herzustellen, sind folgende Befehle m&ouml;glich:
  541. <ul>
  542. <code>
  543. socat openssl:fhemhost:fhemport,verify=0 readline<br>
  544. ncat --ssl fhemhost fhemport<br>
  545. openssl s_client -connect fhemhost:fhemport<br>
  546. </code>
  547. </ul>
  548. </li><br>
  549. <a name="allowfrom"></a>
  550. <li>allowfrom<br>
  551. Regexp der erlaubten IP-Adressen oder Hostnamen. Wenn dieses Attribut
  552. gesetzt wurde, werden ausschlie&szlig;lich Verbindungen von diesen
  553. Adressen akzeptiert.<br>
  554. Achtung: falls allowfrom nicht gesetzt ist, und keine g&uuml;tige
  555. allowed Instanz definiert ist, und die Gegenstelle eine nicht lokale
  556. Adresse hat, dann wird die Verbindung abgewiesen. Folgende Adressen
  557. werden als local betrachtet:
  558. <ul>
  559. IPV4: 127/8, 10/8, 192.168/16, 172.16/10, 169.254/16<br>
  560. IPV6: ::1, fe80/10<br>
  561. </ul>
  562. </li><br>
  563. <a name="connectTimeout"></a>
  564. <li>connectTimeout<br>
  565. Gibt die maximale Wartezeit in Sekunden an, in der die Verbindung
  566. aufgebaut sein muss. Standardwert ist 2.
  567. </li><br>
  568. <a name="connectInterval"></a>
  569. <li>connectInterval<br>
  570. Gibt die Dauer an, die entweder nach Schlie&szlig;en einer Verbindung
  571. oder f&uuml;r den Fall, dass die Verbindung nicht zustande kommt,
  572. gewartet werden muss, bis ein erneuter Verbindungsversuch gestartet
  573. werden soll. Standardwert ist 60.
  574. </li><br>
  575. <a name="encoding"></a>
  576. <li>encoding<br>
  577. Bezeichnet die Zeichentabelle f&uuml;r die zum Client gesendeten Daten.
  578. M&ouml;gliche Werte sind utf8 und latin1. Standardwert ist utf8.
  579. </li><br>
  580. <li>sslVersion<br>
  581. Siehe das global Attribut sslVersion.
  582. </li><br>
  583. <li>sslCertPrefix<br>
  584. Setzt das Pr&auml;fix der SSL-Zertifikate, die Voreinstellung ist
  585. certs/server-, siehe auch das SSL Attribut.
  586. </li><br>
  587. </ul>
  588. </ul>
  589. =end html_DE
  590. =cut
  591. 1;