xt.nroff
上传用户:duobangkj
上传日期:2007-01-07
资源大小:70k
文件大小:39k
源码类别:

Telnet客户端

开发平台:

Unix_Linux

  1. .ds ]V version 1.2 JPRadley 8 July 1997
  2. .tm
  3. .tm xt.nroff *(]V
  4. .tm
  5. .ta 4 4 4 4 4 4 4 4
  6. .if n .po 0
  7. .if n .nrLL 7.9i
  8. .lln(LLu
  9. .ltn(LLu
  10. .TH XT 1
  11. .SH Name
  12. xt - communications program using telnet
  13. .SH Syntax
  14. .B xt
  15. [
  16. .RB [ -n hostname]
  17. |
  18. .RB [ -s script]
  19. ]
  20. .SH Description
  21. .B Xt
  22. connects to a remote host using the telnet protocol. It can manage an
  23. interactive session or be called from
  24. .BR cron (C).
  25. It has various means for transferring files between computers, and can be
  26. partially or totally under the control of scripts.
  27. .B Xt
  28. starts up by reading the file 
  29. .IR .xtrc ,
  30. which is sought for in this order: in "XT_PATH", in the current directory,
  31. in your
  32. .I HOME
  33. directory, or in a default directory defined at compile time. This startup
  34. file may contain any of the valid
  35. .I SET
  36. commands described below. 
  37. .B Xt
  38. then displays the current settings, and presents an
  39. .I <XT>
  40. prompt, unless the fB-sfR option was used.
  41. .SS fIOptionsfR
  42. .TP 11
  43. .BI -n hostname
  44. Connect to the specified fIhostnamefR, which may be given as a Fully
  45. Qualified Domain Name (e.g., who.excitement.com) or as an IP octet
  46. (e.g., 198.207.210.2). If a telnet command issued from a shell prompt can
  47. reach a site, then
  48. .B xt
  49. can reach it too.
  50. .TP
  51. .BI -s script
  52. Execute the specified
  53. .I script
  54. after program startup.
  55. .TP
  56. The two options are mutually exclusive.
  57. .SS fIEnvironmentfR
  58. The environment may contain a variable called "XT_PATH", consisting
  59. of colon separated absolute paths to directories. If this variable is set to,
  60. say, "/usr/joe/xt:/usr/lib/xt", then those two directories are the
  61. first places searched for any scripts.
  62. .SS fICommand ModefR
  63. When entering characters in command mode (that is, at the 
  64. .I <XT>
  65. prompt), control characters echo as ^x, where "x" is the control character that
  66. was entered. Backspacing (using whatever key is defined in the current
  67. environment) backspaces over both positions of the displayed control character,
  68. as expected. 
  69. An "interpreted" key can be added in a manner similar to that of
  70. .BR vi (C);
  71. simply type ^V followed by the character to insert (backspace, delete,
  72. carriage return, or newline).
  73. The following commands are available at the
  74. .I <XT>
  75. command prompt:
  76. .TS
  77. tab(@);
  78. l1B lw(54) .
  79. c
  80. cis@T{
  81. Respond to an ENQ signal for a CIS B-Plus protocol transfer. This command is
  82. used for both uploading and downloading from CompuServe.
  83. T}
  84. n fIhostname
  85. nethost fIhostnamefR@T{
  86. Establish a telnet connection to fIhostnamefR, then enter terminal mode.
  87. T}
  88. s fIfile
  89. script fIfilefR@T{
  90. Execute fIfilefR, which contains appropriate fBxtfR
  91. script commands. Enters terminal mode when the script is complete.
  92. T}
  93. set fR[fIoptionsfR]@T{
  94. Display or set the parameters used by fBxtfR. See below.
  95. T}
  96. t
  97. term@Enter terminal mode.
  98. x
  99. q
  100. exit
  101. quit@Exit program. Return to invoking program/shell.
  102. ?
  103. help@T{
  104. Displays a brief summary of fBxtfR commands, the SET options, and
  105. terminal-escape commands.
  106. T}
  107. .TE
  108. .P
  109. [Note: a compile-time option can disable the following three options to
  110. prevent any access to shells or other programs outside of
  111. .BR xt .]
  112. .TS
  113. tab(@);
  114. l6B lw(56) .
  115. ! fIcommandfR@T{
  116. Execute the specified fIcommandfR as a child process. If fIcommandfR is
  117. omitted, execute a local interactive shell.
  118. (A space is required between the fB!fR and the fIcommandfR.)
  119. T}
  120. !!@Re-execute the last shell command string. 
  121. $ fIcommandfR@T{
  122. Execute a shell fIcommandfR with stdin and stdout redi%rected to the
  123. telnet socket. This effectively puts the computer into a "host" mode.
  124. (A space is required between the fB$fR and the fIcommandfR.)
  125. T}
  126. .TE
  127. .SS fIUsing the SET CommandfR
  128. The
  129. .I SET
  130. command is used to display and set/reset
  131. .BR xt 's
  132. tunable parameters. Any of these commands may be placed in the
  133. .I .xtrc
  134. file which is read upon starting up
  135. .BR xt .
  136. Used alone,
  137. .I SET
  138. displays
  139. .BR xt 's
  140. current parameters.
  141. The following parameters can be set (note that except in the case of
  142. .IR name s,
  143. these commands are case-fIinfRsensitive, and that there are alternative forms
  144. of the commands shown on the XT help screen):
  145. .TS
  146. tab(@) ;
  147. l1 lw(54) .
  148. set auto on|off@T{
  149. Sets the auto-capture feature. When entering terminal mode, capturing
  150. commences without the necessity to manually request it.
  151. T}
  152. set cfile fInamefR@Set the fInamefR of the capture file.
  153. set cis on|off@T{
  154. Set response to a CompuServe file transfer request (<ENQ>). An "on" value
  155. specifies that when in terminal mode, an <ENQ> character will launch a CIS
  156. B-Plus protocol transfer. This parameter should be set "off" when not
  157. connecting to CompuServe, as line noise may cause a bogus file transfer
  158. request.
  159. T}
  160. set cr on|off@T{
  161. In uploads using B-Plus protocol, setting this option "on" will insert a
  162. carriage-return after each newline in an ASCII file. If you expect your ASCII
  163. upload to be captured by DOS users, it is best to set cr "on". If your ASCII
  164. upload is meant strictly for Unix users, then you may set cr "off".
  165. The B-Plus protocol implementation used by fBxtfR
  166. will always strip end-of-line carriage-returns from incoming ASCII files.
  167. T}
  168. set dir fInamefR@Set the current working directory.
  169. set menu on|off@T{
  170. By default, a one-line menu is displayed above the fI<XT>fR prompt to
  171. remind the user of options most frequently chosen at this point:
  172. "[t]erminal mode [q]uit [s]cript [?]help".
  173. Setting the option "off" turns off this display.
  174. T}
  175. set nl on|off@T{
  176. If this option is set "on", then newlines are sent as
  177. carriage-returns. If this option is set "off", then newlines are sent as
  178. newlines (carriage-returns are in any case always sent as carriage-returns).
  179. This option applies to input from the keyboard, or from a disk file using the
  180. "fBXCAPEfR fBFfR" facility or a script "type" command (See below).
  181. This option has no effect on B-Plus protocol transmissions,
  182. and has no effect on incoming data.
  183. T}
  184. set xcape fIcharfR
  185. set escape fIcharfR@T{
  186. Set the fBXCAPEfR character (see below) to fIcharfR. This should be set to
  187. some non-printing character (other than backspace, tab, newline, of course).
  188. The character may be entered by depressing the Control key first
  189. and then typing a letter, or by typing a caret (^) followed by a letter.
  190. T}
  191. .TE
  192. .SS fITerminal ModefR
  193. In terminal mode, all characters typed at the keyboard are sent to the
  194. telnet connection, except that newline characters (0x0A) are translated to
  195. carriage-returns (0x0D) when you have "set nl 'on'"; all characters received
  196. from the telnet connection are displayed on the local terminal screen.
  197. fBXCAPEfR is a key that will, when typed in terminal mode, introduce an
  198. .B xt
  199. "escape" command. Don't confuse fBXCAPEfR with the <ESCAPE> key.
  200. The default definition for fBXCAPEfR is ASCII 1, or Control-A. It can 
  201. be redefined at run time with the "set escape fICfR" command (or it can be
  202. redefined in the
  203. .I .xtrc
  204. startup script).
  205. When the fBXCAPEfR key is typed in terminal mode, the program will examine
  206. the next key pressed. If this key has been "bound" to perform a certain
  207. function, that function will be performed; otherwise, the second character is
  208. sent to the telnet connection. Thus, to send the fBXCAPEfR character through
  209. the telnet connection, it is necessary to press the key TWICE.
  210. Thus the ESCAPE key itself would be a terrible choice for fBXCAPEfR, because
  211. it is used so often by other programs: if you were logged into a remote system
  212. and running, say, fBvifR, it would be a great annoyance to have to hit ESCAPE
  213. twice to get it transmitted once.
  214. The following keys (case fIinfRsensitive) are bound at startup time. Others
  215. may be added through the binding commands available in 
  216. .B xt
  217. scripts.
  218. .TS
  219. tab(@) ;
  220. l2 l2 l
  221. l2B l2 l .
  222. Command@Function@Description
  223. XCAPE /@Help@Display the table of bound keys
  224. XCAPE ?@Help@Display the table of bound keys
  225. XCAPE f@fIFfRile@T{
  226. Send a file through the telnet connection (ASCII transfer).
  227. T}
  228. XCAPE s@fISfRcript@fBXtfR will request the name of a script to execute.
  229. XCAPE yfR@Capture fIYfRes@T{
  230. Open the capture file in APPEND mode (text received over the telnet connection
  231. accumulates at the end of the file). If the file is already open, a message is
  232. printed to that effect.
  233. T}
  234. XCAPE nfR@Capture fINfRo@T{
  235. Close the capture file. If it wasn't open, a message of regret is printed.
  236. T}
  237. XCAPE xfR@efIXfRit@Exit terminal mode back to fI<XT>fR command mode.
  238. XCAPE q@fIQfRuit@Quit fBxtfR altogether.
  239. .TE
  240. .SS fIScriptsfR
  241. The
  242. .B xt
  243. script language is intended to be closely similar to the Unix Bourne shell
  244. language. Unfortunately, it isn't identical to the Bourne shell, so it has
  245. the same problem that the
  246. .BR awk (C)
  247. program does for those experienced in the C language: an
  248. .B awk
  249. script LOOKS like C, but it isn't, really; and in the same way, an
  250. .B xt
  251. script LOOKS like a Bourne shell script, but isn't. So the operation of the
  252. Bourne shell, if you're familiar with it, is useful as an analogy in
  253. understanding the
  254. .B xt
  255. script language, but only as an analogy.
  256. An
  257. .B xt
  258. script consists of lists of commands. Commands are set off from each other
  259. within a list by either a newline ('\n') or a semicolon (;), as is the case
  260. with the Bourne shell. The semicolon and the newline have identical effect as
  261. command separators, so (anticipating a bit here) you could say either
  262. .nf
  263.   if counter morethan 5
  264.   then
  265.     transmit "bye^M"
  266.     quit
  267.   endif
  268. or
  269.   if counter morethan 5; then transmit "bye^M"; quit; endif
  270. .fi
  271. and the result will be the same either way. The newline and the semicolon
  272. are treated the same way as in the Bourne shell, except that a newline cannot
  273. be quoted so as to remove its interpretation as a command terminator (in
  274. other words, a quoted string cannot contain a newline).
  275. Commands are composed of
  276. .IR word s
  277. separated by spaces or tab characters, and a
  278. .I word
  279. can be one of the following:
  280. .TP 3
  281. *
  282. One of the
  283. .B xt
  284. script language keywords, which are listed below, with appropriate explanations.
  285. .TP
  286. *
  287. A number, meaning a sequence consisting only of digits, with
  288. an optional leading minus sign to indicate a negative number.
  289. .TP
  290. *
  291. A literal string of characters surrounded by double-quotation marks ('"'); such
  292. a string can be no longer than 80 characters. A double-quotation mark can be
  293. imbedded within the string by preceding it with a backslash ('\"'); when the
  294. string is interpreted, the backslash is disregarded and the double-quotation
  295. mark is treated as part of the string. Mismatched quotation marks result in a
  296. syntax error.
  297. .TP
  298. *
  299. The name of a user variable, which can have either a string or a numeric value.
  300. The name of a user variable must begin with an alphabetic character.
  301. .TP
  302. *
  303. The name of a shell environment variable, preceded by a dollar sign ('$'). The
  304. .B xt
  305. script language examines the Unix environment for the specified variable and,
  306. if such a variable exists, substitutes the value of that variable. The result
  307. is treated as if it were a quoted literal string, and, therefore, should not be
  308. more than 80 charac%ters long, or else it will be truncated to its first 80
  309. characters. Similarly, such an environment variable should not contain a
  310. newline.
  311. .TP
  312. *
  313. An expression surrounded by back-quotation marks ('`'). This sort of expression
  314. operates similarly to the Bourne shell's command-substi%tution mechanism: the
  315. contents of the back-quotes are passed to the Bourne shell, and the standard
  316. output of the back-quoted command is treated as if it were a quoted literal
  317. string. Therefore, the command's output should not be more than 80 characters
  318. long, nor contain a newline. Also, the contents of the back-quotes cannot be
  319. longer than 80 characters, nor contain a newline.
  320. .TP
  321. *
  322. An expression introduced by a pound-sign (or number-sign: '#'), which is
  323. treated as a comment. All characters from the '#' until the end of the
  324. physical line are ignored. This comment mechanism is the same as in the
  325. Bourne shell.
  326. .TP
  327. *
  328. A limitation of the script language is that only one character string can be
  329. passed as an argument to any of the script commands. The fIbind_functionfR,
  330. fIbind_scriptfR, and fIbind_stringfR commands thus need to use a decimal
  331. digit to represent the key that is to be bound. The ASCII value of the the key
  332. is employed. As an example, Control-C is identified as 3, Control-Z is 26, the
  333. ESCAPE key is 27, a space is 32, the number "1" is 49; letters are
  334. .RI case- in sensitive
  335. so that identifying the bound key as "65" or as "97" will always bind 
  336. .I both 
  337. "a" and "A" to the same command.
  338. .P
  339. Quoted literal strings (and the two other mechanisms that act like quoted
  340. literal strings, shell environment variables and back-quoted shell commands)
  341. may be up to 80 characters long. All other words must be no longer than 16
  342. characters, and are treated case-independently (which is to say, uppercase
  343. is the same as lowercase); note, though, that the names of shell environment
  344. variables are case-dependent (uppercase must match uppercase and lowercase
  345. must match lowercase), because they are case-dependent in the shell.
  346. Any word not recognizable within the foregoing categories is treated as the
  347. name of a new user variable. Such a word, if longer than 16 characters, is
  348. considered to be a syntax error.
  349. User variables are created with the 'assign' script keyword, and may have
  350. either numeric or string values. The type of a user variable is determined
  351. by how it's created; if it's assigned to a string, it's a string variable,
  352. and if it's assigned to a number, it's a numeric variable. The value of any
  353. user variable can be changed with another 'assign' command, and numeric
  354. variables can be changed to string variables and vice-versa. Shell
  355. environment variables cannot be changed within an
  356. .B xt
  357. script, but the value of a shell environment variable can be assigned to a user
  358. variable, and the value of the user variable can thereafter be changed.
  359. Scripts are contained in ASCII text disk files, one script to a file. A
  360. script can invoke another script as a subroutine with the 'call' keyword; up
  361. to 5 scripts can be nested in this way at any single time.
  362. With all this said, the following list of
  363. .B xt
  364. script language commands should be comprehensible. The format "<something>"
  365. means that a token, or word-type, of the "something" type is meant rather than
  366. the literal sequence 'something'.
  367. .SS fIScript Language CommandsfR
  368. Note that all the commands are case-fIinfRsensitive!
  369. .TP 4
  370. .I affirm
  371. Syntax: affirm
  372. Reads a string from the terminal, and returns TRUE if the string begins with
  373. &'y' or 'Y'; otherwise, returns FALSE.  Used in evaluating conditional
  374. expressions.  The string must be terminated by a newline or carriage-return.
  375. Example:
  376.   echo -n "Continue (y/n)? "
  377.   if affirm
  378.   then
  379.     continue
  380.   else
  381.     break
  382.   endif
  383. .TP
  384. .I assign
  385. Syntax: assign <varname> eq <number>
  386.         assign <varname> eq "string"
  387.         assign <varname> eq "string" ["string"|<varname>] ...
  388.         assign <varname1> eq <varname2>
  389.         assign <varname> eq <script-command>
  390. Assigns to user variable <varname> the value following "eq"; if that value is a
  391. number, then <varname> becomes a numeric user variable; if that value is a
  392. string, then <varname> becomes a string user variable. If <varname> does not
  393. already exist as a user variable, it is created. Variable space is allocated
  394. dynamically, but running out of memory space for variables is unlikely. All
  395. variables are global across scripts that run at the same time via the 'call'
  396. keyword, and all variables vanish when a script, called directly from
  397. .B xt
  398. as opposed to called from another script, exits. In other words, variable
  399. values are not static except during 'call' execution. Variable names cannot be
  400. longer than 8 characters. Successive 'assigns' are permissible, and the type of
  401. the variable changes according to the type of the value following "eq". A user
  402. variable is destroyed with the 'unassign' keyword.
  403. If a variable is assigned the value of a script command, then it becomes a
  404. numeric variable with value TRUE or FALSE, depending on the status returned by
  405. the script command. If a variable is assigned the value of a back-quoted
  406. command, it becomes a string variable with the value of the first 80 characters
  407. of the back-quoted command. If a variable is assigned equal to an environment
  408. variable, it becomes a string variable with the value of the first 80
  409. characters of the value of the environment variable.
  410. If the third form given above is used, then the various strings are
  411. concatenated. A string variable can be created from a numerical variable
  412. with 'assign "" numvar' or 'assign "" 678'.
  413. Examples:
  414.   assign numvar eq 5
  415.   assign strvar eq "This variable is a string"
  416.   assign strvar eq "This" " variable is a " 7 " word string"
  417.   assign mydir eq $HOME
  418.   assign numvar2 eq numvar
  419.   assign strvar2 eq strvar
  420.   assign numvar eq true
  421.   assign today eq `date`; echo "today is " today
  422. .TP
  423. .I beep
  424. Syntax: beep
  425. Sends a Control-G to the terminal. Useful for alerting the user that some event
  426. has occurred, for example the end of a lengthy file transfer operation.
  427. .TP
  428. .I bind_function
  429. Syntax: bind_function fIcodefR "function"
  430. Bind the character identified by the number specified by fIcodefR to the
  431. fBxtfR builtin function "function".
  432. The "function" may be one of the following (case is ignored):
  433.   CAPTEND Turn off terminal mode capture
  434.   CAPTYES Turn on terminal mode capture
  435.   DIVCHAR Send file through the telnet connection
  436.   DOSCRPT Execute script file (prompts interactively)
  437.   EMITSTR Emit string
  438.   ENDCHAR Exit terminal mode
  439.   HLPCHAR Display terminal mode key bindings
  440.   QUITCHR Quit program
  441.   SCRPCHR Prompt for script file
  442. Example:
  443.   bind_function 26 "quitchr"
  444. This binds Control-Z to quit the XT program.
  445. .TP
  446. .I bind_script
  447. Syntax: bind_script fIcodefR "scriptname"
  448. Bind the character identified by the number specified by fIcodefR to execute
  449. the script named by "scriptname".
  450. Upon termination of the script, the program will resume terminal mode, unless
  451. the "quit" script function was executed.
  452. Examples:
  453.   bind_script 18 "/usr/lib/xt/.rz"
  454. This binds Control-R to execute the script /usr/lib/xt/.rz. The .rz script
  455. supplied with the source code contains:
  456.   tty "on"
  457.   echo -n "What files are to be received? "
  458.   read FILES
  459.   transmit "sz -y "
  460.   transmit FILES
  461.   transmit "^M"
  462.   echo "Starting ZMODEM Receive (rz -y)"
  463.   pipe "rz -y"
  464. Pressing fBXCAPEfR fB^RfR will ask for some file name(s), and start an
  465. .B sz
  466. command on the remote system, and an
  467. .B rz
  468. on the local system to receive the file(s).
  469.   bind_script 19 "/usr/lib/xt/.sz"
  470. This binds Control-S to execute the script /usr/lib/xt/.sz. The .sz script
  471. supplied with the source code contains:
  472.   tty "on"
  473.   echo -n "What files are to be sent? "
  474.   read FILES
  475.   echo "Starting ZMODEM send (sz -y " FILES ")"
  476.   pipe "sz -y " FILES
  477. Pressing fBXCAPEfR fB^SfR will ask for some file name(s), and then launch
  478. .B sz
  479. on the current system.
  480. .B Sz
  481. will itself start an
  482. .B rz
  483. process on the remote system.
  484. .TP
  485. .I bind_string
  486. Syntax: bind_string fIcodefR "string"
  487. Bind the character identified by the number specified by fIcodefR to emit the
  488. string specified by "string".
  489. The string is sent to the telnet connection untranslated; eg, it is not
  490. examined for embedded terminal mode escapes.
  491. Example:
  492.   bind_string 49 "pwd^M"
  493. This binds "1" to send the sequence to report your current directory
  494. on a remote system.
  495. .TP
  496. .I break
  497. Syntax: break
  498. Exits from the immediately enclosing 'while' loop. Identical to the C language
  499. &'break', and to the Bourne shell 'break' except that the
  500. .B xt
  501. script language 'break' does not take a numeric argument.
  502. .TP
  503. .I call
  504. Syntax: call "scriptname"
  505. Suspends execution of the current script, and attempts to load and run the
  506. specified scriptname. The scriptname must be a quoted literal string. There is
  507. no
  508. .B xt
  509. analogue of the Bourne shell "exec" command; all subscripts in
  510. .B xt
  511. are treated as sub-routines. All variables are global across subscripts, so if
  512. a subscript changes the value of a variable, then that change will remain in
  513. effect after return to the parent script. Shell environment variables cannot be
  514. changed by any
  515. .B xt
  516. script.
  517. .TP
  518. .I capture
  519. Syntax: capture "on"
  520.         capture "off"
  521. Turns the file-capture function on or off. Note that the arguments must be
  522. quoted literal strings. Note also that when the script exits into terminal
  523. mode, the file-capture function is turned off. If you have 'set auto "on"',
  524. then you will begin capturing immediately upon entering, or returning to,
  525. terminal mode. If not, then you must manually type "fBXCAPEfR fBYfR" to
  526. start capturing when entering terminal mode.
  527. .TP
  528. .I continue
  529. Syntax: continue
  530. Resumes execution at the top of the immediately enclosing 'while' loop.
  531. Identical to the C language 'continue' instruction, and to the Bourne shell
  532. &'continue' command except that no numeric argument is accepted.
  533. .TP
  534. .I debug
  535. Syntax: debug "on"
  536.         debug "off"
  537. If the 'debug' option is on, then
  538. .B xt
  539. will make many parenthetical comments about what it's doing while it runs the
  540. script. These comments can sometimes be helpful in debugging script logic. Note
  541. that the argument must be a quoted literal string.
  542. While debugging a script containing a password, turn this option off, then on
  543. again, to reduce the excitement-level of any colleagues collected circa your
  544. screen.
  545. See, below, the fIDebuggingfR Section.
  546. .TP
  547. .I decr
  548. Syntax: decr <numeric-variable>
  549. Decrements the value of the specified numeric user variable by 1. Useful in
  550. controlling loop execution. If the specified variable isn't numeric, or doesn't
  551. exist, a syntax error results.
  552. .TP
  553. .I echo
  554. Syntax: echo "string" <variable> ...
  555.         echo -n "string" <variable> ...
  556. This command sends its arguments to the user's terminal. The number of
  557. arguments is optional, except that the total result may not exceed 80
  558. characters. Variables and back-quoted shell commands are expanded as necessary.
  559. If the "-n" switch is present, then no carriage-return/newline sequence is
  560. appended to the output.
  561. Examples:
  562.   echo "The time and date are now " `date`
  563.   echo "My terminal type is " $TERM
  564.   echo "My terminal type is " $TERM " today."
  565. Note that whitespace isn't echoed unless it's part of a quoted literal string.
  566. .TP
  567. .I exit
  568. Syntax: exit
  569. Terminates execution of the current script. If a script reaches its end, it
  570. exits automatically, so 'exit' is useful mainly to terminate a script
  571. prematurely.
  572. .TP
  573. .I false
  574. Syntax: false
  575. Same as the Unix 'false' command. Does nothing, but returns a FALSE status
  576. value. Useful within conditional expressions.
  577. Example:
  578.   if waitfor "CONNECT" 30 eq false
  579.   then
  580.     quit
  581.   endif
  582. Note that above example could be rewritten using the negating modifier "!":
  583.   if ! waitfor "CONNECT" 30
  584.   then
  585.     quit
  586.   endif
  587. and note too that the "!" must be separated from its argument by whitespace.
  588. .TP
  589. .I file
  590. Syntax: file <script-command>
  591. The standard output of the specified script command is sent to the current
  592. capture file. If the "capture" option is not set, then an error message is
  593. displayed, but script execution continues.
  594. Examples:
  595.   file echo "--------- CUT HERE ----------"
  596. Sends the output of the 'echo' command to the current capture file, provided
  597. that the "capture" option is now "on".
  598.   file echo `date`
  599. Sends a timestamp to the current capture file, provided that the "capture"
  600. option is now "on". The same thing could have been done with
  601.   file shell "date"
  602. .TP
  603. .I host
  604. Syntax: host "hostname"
  605. Open a telnet connection to a hostname, given either as a domain name or a
  606. dotted quad. If there is a current telnet connection open, it will be
  607. terminated with extreme prejudice.
  608. .TP
  609. .I if  
  610. Syntax: if <list1>; then <list2>; [ else <list3>; ] endif
  611. If <list1> evaluates as TRUE, performs <list2>; otherwise, if <list3> is
  612. specified, performs <list3>; then resumes execution immediately following
  613. &'endif'. To accommodate those whose minds wander while writing scripts, 'fi'
  614. is an acceptable synonym for 'endif'.
  615. Each list may consist of any number of script commands separated by semicolons
  616. or newlines. The value of <list1> is determined by inclusively OR'ing the value
  617. of each directive in the list, so that if any of the directives in <list1>
  618. evaluates as TRUE, then so will <list1>. <list1> is performed in its entirety
  619. regardless of the value of any of its component commands.
  620. The keywords 'then', 'else', and 'endif' (or 'fi') must be immediately preceded
  621. by command separators, either a semicolon or a newline, just as is the case in
  622. the Bourne shell.
  623. For conditional evaluation in 'if' and 'while' constructions, the following
  624. comparators are available in addition to the script directives mentioned
  625. elsewhere:
  626.   <varname1> eq "string"
  627.   <varname1> eq <number>
  628.   <varname1> eq <varname2>
  629.   <varname1>
  630.   "string"
  631. evaluates as TRUE if the value of user variable <varname1> is the same as that
  632. of a specified string or numeric constant or of a specified second variable
  633. name. If the variable name <varname1> is not followed by anything else, then
  634. the expression evaluates as TRUE if the variable is numeric and has a non-zero
  635. value, or if the variable is a string variable and has a non-zero length;
  636. otherwise, the expression evaluates as FALSE. Comparing a string variable to a
  637. numeric variable, or vice-versa, causes a syntax error.
  638. If a conditional expression consists only of a quoted literal string, the
  639. expression evaluates as TRUE if the string's length is non-zero, and otherwise
  640. evaluates to FALSE. Because environment variables and back-quoted shell
  641. commands are treated as if their output/value were quoted literal strings, this
  642. allows direct testing of a shell command or of an environment for non-zero
  643. length. Nonexistent environment variables are treated as if they exist with the
  644. value "" (a string of zero length).
  645.   <varname1> neq "string"
  646.   <varname1> neq <number>
  647.   <varname1> neq <varname2>
  648. evaluates as TRUE if the value of user variable <varname1> is not equal to that
  649. of a specified string or numeric constant or of a specified second variable
  650. name. Comparing a string variable to a numeric variable, or vice-versa, causes
  651. a syntax error.
  652.   <varname1> lessthan "string"
  653.   <varname1> lessthan <number>
  654.   <varname1> lessthan <varname2>
  655. evaluates as TRUE if the value of user variable <varname1> is less than that of
  656. a specified string or numeric constant or of a specified second variable name.
  657. String variables are compared lexically according to ASCII value.
  658.   <varname1> morethan "string"
  659.   <varname1> morethan <number>
  660.   <varname1> morethan <varname2>
  661. operates identically to 'lessthan', except in reverse.
  662. The value of any conditional expression may be negated by preceding it with an
  663. exclamation point followed by a space or tab.
  664. Examples:
  665.   if counter eq 0; then break; endif;
  666.   if var1 eq var2; then echo "identical"; endif
  667.   if counter morethan 20; then break; endif;
  668.   if counter lessthan 0; then break; endif;
  669.   if ! counter; then echo "counter is " counter; endif
  670. To perform a list if any of a set of conditions exist:
  671.   if counter morethan 5;
  672.     counter eq brkvalue;  # a second comparator
  673.   then break;
  674.   endif;
  675. i.e., perform the 'break' directive if the value of numeric user
  676. variable 'counter' is greater than the numeric constant 5, or if the value
  677. of 'counter' is equal to that of the user numeric variable 'brkvalue'.
  678. .TP
  679. .I incr
  680. Syntax: incr <numeric-variable>
  681. Increments the value of the specified numeric user variable by 1. The
  682. opposite of 'decr'.
  683. .TP
  684. .I pause
  685. Syntax: pause <number>
  686. Suspends execution for the specified <number> of SECONDS. Identical to Unix
  687. "sleep."
  688. .TP
  689. .I pipe
  690. Syntax: pipe "<shell-command>"
  691. The standard input and standard output of the specified shell command are
  692. connected to the telnet connection, and the command is executed. This is the
  693. equivalent of the command mode "$" command.
  694. Examples:
  695.   pipe "echo \"\177\""
  696. sends a DELETE character to the telnet connection.
  697.   pipe "rz"
  698. performs a file receive via ZMODEM, assuming that Chuck Forsberg's 'rz/sz'
  699. programs reside on your system.
  700. .TP
  701. .I quit
  702. Syntax: quit
  703. Exits the script and terminates
  704. .B xt
  705. entirely. The user's terminal will be restored to the state it was in when
  706. .B xt
  707. was invoked.
  708. .TP
  709. .I read
  710. Syntax: read <variable-name>
  711. Takes a string from the user's keyboard and places it into the specified user
  712. variable. Any previous value of the specified variable is discarded.
  713. .TP
  714. .I seen
  715. Syntax: seen "string" <number>
  716. Evaluates as TRUE if "string" has occurred within the last <number> characters
  717. received during the most recent 'waitfor' command. Only up to 2048 characters
  718. are remembered at any one time during 'waitfor' processing. If no <number> is
  719. specified, then all the characters received during the most recent 'waitfor'
  720. command are examined, up to a maximum of 2048. The 'seen' buffer is reset at
  721. the beginning of each 'waitfor' command. This is useful to tell which of
  722. several strings has been received.
  723. Example:
  724.   if waitfor "string1" 20
  725.   then
  726.     echo "Received 'string1'."
  727.   else
  728.     if seen "string2"
  729.     then
  730.       echo "Received 'string2' instead."
  731.     endif
  732.   endif
  733. .TP
  734. .I set 
  735. Syntax: set
  736. .RB < xt -set-option>
  737. <value>
  738. This command is the same as the command-mode
  739. .B xt
  740. &'set' command, such as "set bps 1200", "set cis on", and so forth, except that
  741. a string <value> must be enclosed within double-quotation marks.
  742. Examples:
  743.   set cis "on"
  744.   set cfile "newfilename"
  745.   set auto "on"
  746.   set bps 2400
  747. .TP
  748. .I shell
  749. Syntax: shell "<shell-command>"
  750. The shell command enclosed within the double-quotation marks is executed. This
  751. is similar to the
  752. .B xt
  753. command-mode "!" command. Remember that if the shell command contains
  754. double-quotation marks, they must be escaped with backslashes.
  755. .TP
  756. .I timeout
  757. Syntax: timeout <number>
  758. If <number> is greater than zero, starts a timer which will cause the MOST
  759. DEEPLY NESTED script to exit when <number> of MINUTES expire. If <number> is
  760. zero, then any pending timeout is cancelled. If <number> is negative, nothing
  761. happens.
  762. Expiration of the specified timeout causes the most deeply nested script to
  763. exit, not to terminate
  764. .BR xt .
  765. To cause the program to quit if a timeout expires, use a subscript.
  766. Example:
  767.   'script1' contains:
  768.     call "script2"
  769.     if expired
  770.     then
  771.       quit
  772.     endif
  773.     # more commands
  774.   'script2' contains:
  775.     assign expired eq 1
  776.     timeout 5      # limit of 5 minutes
  777.     while ! waitfor "login:" 30
  778.     do
  779.       xmitbrk
  780.     done
  781.     assign expired eq 0
  782.     exit
  783. When 'script2' exits, the numeric variable 'expired' will be set to 1 if
  784. &'script2' timed out, and will be 0 otherwise. 'script1' can act on this
  785. information accordingly.
  786. .TP
  787. .I transmit
  788. Syntax: transmit "string"
  789. Sends a string to the telnet connection.
  790. Within the string, any alphabetic character preceded by a caret (^) is
  791. translated to the corresponding Control-character.
  792. Example:
  793.   transmit "date^M"
  794. sends the string "date" to the telnet connection, followed by a carriage-return
  795. character.
  796. .TP
  797. .I true
  798. Syntax: true
  799. Does nothing, but always evaluates as TRUE. Useful in conditional
  800. expressions. The opposite of 'false'.
  801. .TP
  802. .I tty 
  803. Syntax: tty "on"
  804.         tty "off"
  805. Ordinarily, during script execution, characters received from the telnet
  806. connection
  807. are echoed to the user's terminal screen. This happens only during 'waitfor'
  808. and 'type' execution, so it may be a bit choppy. This echoing can be turned
  809. off with
  810.   tty "off"
  811. and turned back on with
  812.   tty "on"
  813. Note that "on" and "off" must be enclosed in quotation marks.
  814. .TP
  815. .I type
  816. Syntax: type "<filename>"
  817. Sends the specified ASCII file to the telnet connection. This is the same as
  818. the
  819. .B xt
  820. terminal-mode "send ASCII file" escape.
  821. .TP
  822. .I unassign
  823. Syntax: unassign <variablename>
  824. Erases the specified user variable. The variable may be either numeric or
  825. string type. The variable name must not be enclosed in quotation marks, because
  826. variable names are considered to be
  827. .B xt
  828. script keywords, and not literal strings.
  829. .TP
  830. .I waitfor
  831. Syntax: waitfor "string" <number>
  832. Scans input from the telnet connection for an occurrence of the specified
  833. string,
  834. which must be enclosed in quotation marks. The scanning continues for the
  835. specified <number> of SECONDS or until the specified string is identified in
  836. the telnet input stream, whichever comes first. This command evaluates as TRUE
  837. if the specified string is found, and as FALSE if the specified <number> of
  838. SECONDS elapses and the string isn't found within that time. The default time,
  839. if no <number> is specified, is roughly 30 seconds.
  840. String matching is performed on a case-fIinfRsensitive basis.
  841. Within the string, any alphabetic character preceded by a caret (^) is
  842. translated to the corresponding Control-character.
  843. Examples:
  844.   assign counter eq 1
  845.   while ! waitfor "login:" 15
  846.   do
  847.     xmitbrk; incr counter; if counter morethan 5
  848.     then
  849.       quit
  850.     endif
  851.   done
  852. If in a CompuServe Forum the "prompt character" has been set by the user to
  853. be a backspace, this test will log off if the main prompt is not seen in the
  854. next sixty seconds:
  855.   if ! waitfor "forum !^H" 60
  856.   then
  857.     transmit "bye^M"; quit
  858.   endif
  859. If the 'cis' option has been set to "on", either in the
  860. .I .xtrc
  861. startup script, or by a direct 'set' command from command mode, or with
  862.   set cis "on"
  863. within a current script, and if during 'waitfor' processing a CIS B-Plus
  864. protocol file transfer request is received, then the B-Plus protocol transfer
  865. is performed, the <number> argument is reset to its original value, and
  866. &'waitfor' processing continues. This allows automatic B-Plus protocol file
  867. transfers from within a script.
  868. .TP
  869. .I while
  870. Syntax: while <list1>; do <list2>; done
  871. Operates similarly to the 'if' command, except that <list2> is executed
  872. repeatedly so long as <list1> evaluates as TRUE. All the conditional
  873. comparators and rules for comparisons that apply for the 'if' command also
  874. apply to 'while'. (Note that 'while' loops can be nested within 'if' commands
  875. and vice-versa.)
  876. .SS fIFile TransfersfR
  877. When transferring files using CompuServe B-Plus protocol, the format of the
  878. file is specified by the host. An ASCII mode will force
  879. .B xt
  880. to perform TEXT mode translation; a BINARY mode will not do any translation.
  881. This means that, in either direction, a BINARY mode will send bytes "as is",
  882. whereas in ASCII mode, an incoming file will always be stripped of end-of-line
  883. carriage-returns, while an ASCII file being uploaded may or may not have
  884. carriage-returns added after each newline, depending on the "on" or "off"
  885. setting of the "cr" option.
  886. When using a CompuServe B-Plus download command,
  887. .B xt
  888. will check if the file name you specify already exists on your system, and ask
  889. for an OK to overwrite the file, or for an alternative name. In the CompuServe
  890. case, there will also be an option to "Resume" a download. If the CRC checksum
  891. of the bytes that you already have in the file matches CompuServe's checksum on
  892. the the same initial bytes in its version of the file, file transfer will
  893. proceed from that point onwards. This saves connect time when a very large
  894. download has been interrupted during a prior session.
  895. Script-driven file transfers using the CompuServe B-Plus protocol are more or
  896. less built into the
  897. .B xt
  898. script language, since during 'waitfor' processing, a file transfer request
  899. from the telnet connection will trigger a B-Plus transfer if the "cis" mode is
  900. set.
  901. The difficulty in performing such transfers isn't in the transfer itself, but
  902. rather in the maneuvering required to get into position to transfer the correct
  903. file, and is something that probably only experienced script writers should
  904. wrestle with. However, if we assume that in the midst of a script, you've
  905. reached a point where you can issue a "download" command to CompuServe, for
  906. instance a "Disposition" prompt during a File Library "BROWSE" command, and you
  907. want to download the present file, which is "XCALL.C" on CompuServe, and
  908. "xcall.c" does not exist in your current working directory, you'd use the
  909. following sequence of script commands to do it:
  910.   set cis on    # can't do auto file B-Plus transfer otherwise
  911.   transmit "dow^M"
  912.   pause 2     # wait for CIS to display protocol menu
  913.   transmit "2^M"  # B-Plus is number 2 on that menu 
  914.   transmit "xcall.c^M" # "file name for your computer:"
  915.   waitfor "Disposition"
  916. During the final "waitfor" processing, the CompuServe ENQ character will
  917. be recognized and the transfer will proceed automatically. Then 'waitfor'
  918. will continue waiting for the "Disposition" prompt, after which your script
  919. can proceed. The same sort of thing can be done with file uploads, but once
  920. again, the difficulty isn't with the transfer, but rather with setting things
  921. up so that the transfer will be requested at the correct place.
  922. A shell script,
  923. .B cisdownload
  924. provided with the distribution, can automatically retrieve a single file from a
  925. CompuServe library.
  926. For XMODEM, YMODEM, and ZMODEM transfers,
  927. we strongly recommend that you obtain Chuck Forsberg's excellent,
  928. shareware utility called "RZSZ", which can handle XMODEM, XMODEM-1K,
  929. YMODEM, and ZMODEM transfers and which can be used from within
  930. .B xt
  931. with the 'pipe' command, or from command mode with the '$' command, or using
  932. the examples under the 
  933. .I bind_script
  934. command above.
  935. .SS fIDebuggingfR
  936. There are three varieties of debugging in
  937. .BR xt .
  938. The script command (set debug "on" or set debug "off") will control echoing
  939. of each line of a script to the screen.
  940. If the program was compiled with LOG set to 1 in xt.h, all screen output
  941. will be captured in a file called
  942. .I xt.log
  943. in the current directory, providing that it exists before entering
  944. .BR xt,
  945. and providing that output is not being diverted to a current capture file. The
  946. .I xt.log
  947. file is overwritten each time
  948. .B xt
  949. is run. 
  950. If you forgot to turn on capturing, if the program was compiled with
  951. LOG set to 1, and if
  952. .I xt.log
  953. exists, all is not lost: your session is recorded in
  954. .IR xt.log .
  955. Note that capturing to files is turned off when exiting terminal mode, and
  956. this includes running the built-in B+ protocol.
  957. Finally, in the xtb+.c module, there is a CIS_DEBUG definition line which
  958. is normally commented out. If this definition is uncommented, then a B+
  959. transfer will record every byte in a file called
  960. .IR xtb+log .
  961. This file is created if needed, in the current directory, and overwritten
  962. on each run of
  963. .BR xt .
  964. .SH Exit Codes
  965. .TS
  966. tab(@) ;
  967. c2B lw(60) .
  968. 0@Successful, uneventful completion.
  969. 1@Error in command-line arguments.
  970. 2@Failure in forking to execute a command or run a shell.
  971. 6@No environment variable TERM has been set.
  972. 7@No entry for the current TERM setting in the terminfo database.
  973. .TE
  974. .SH Copyright
  975. .B Xt
  976. and its source files and sample scripts and manual page are Copyright 1995,
  977. 1997 by Jean-Pierre Radley.
  978. Permission is granted to the public to use this code in any manner, without
  979. any warranty, implied or otherwise, of fitness for a particular purpose.
  980. By virtue of a restriction previously placed upon all code derivative from
  981. .BR xcomm ", the " xt
  982. code and associated files may not be sold by anyone to anyone, nor incorporated
  983. into any product that is not also free. It's OK to transfer them for free.
  984. .SH Authors
  985. This manual page was written by Fred Buck (1989) and Jean-Pierre Radley
  986. (1990-1997).
  987. .B Xt
  988. itself is the product of many synergistic wise minds. See the README document.
  989. .SH Version
  990. This edition of the manual is for XT *(]V.