home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
scripts
/
ckermit
/
autossh
< prev
next >
Wrap
Text File
|
2008-04-02
|
6KB
|
155 lines
#!/opt/local/bin/kermit +
;
; a u t o s s h
;
; Illustration of scripted SSH session using C-Kermit 8.0 or K95 2.0.
; Also illustrates client/server features such as client query of server
; variables and sending e-mail containing a script-composed text body
; through the server.
;
; In Unix, adjust the top line to point to your C-Kermit 8.0 executable.
;
; F. da Cruz, Columbia University Kermit Project, July 2002.
;
; Command-line parameters:
; 1. Hostname or address
; 2. Username on host
; 3. Name of file to send
; 4. Directory on host in which to store the file
; 5. Email address for status report.
;
; Parameters not supplied are prompted for.
;
; The following version-check works with older Kermit versions.
;
define badversion {
echo Sorry - C-Kermit 8.0 or K95 2.0 or later required.
exit 1
}
if not equal "\v(program)" "C-Kermit" badversion
if LLT \v(version) 800200 badversion
; From here down we make free use of C-Kermit 8.0 / K95 2.0 features.
define ERRQUIT { ; Macro to exit appropriately
if kerbang exit 1 \%1 ; If Kerbang script, exit all the way.
stop 1 \%1 ; Otherwise return to Kermit prompt.
}
while not def \%1 { ; If hostname/address not supplied
ask \%1 { Host: } ; prompt for one until we get it.
if > \fsplit(\%1,,,.) 1 { ; Allow only one "word" here
echo Just the address please. ; (no TCP port number).
undef \%1
}
}
if not def \%2 { ; If username not supplied
ask \%2 { User [\v(user)]: } ; Prompt for one, but default
if not def \%2 assign \%2 \v(user) ; to local user ID.
} ;
; Note: if you have key files the following step can and should be skipped.
if not def \%3 { ; If password not supplied
askq \%3 { Password: } ; Prompt for one.
}
; As a sample, let's suppose we want to access a Unix host, upload a file
; to a certain directory, and then send mail to somebody when it's uploaded.
; Accept these items from the command line and prompt for any that are missing.
;
while not def filename { ; If filename not supplied
ask filename { File: } ; Prompt for one.
if not def filename continue
if not readable \m(filename) {
echo \m(filename): not found or not readable
continue
}
}
.filename := \fcontents(\%3)
; Note: \fcontents() is used to avoid over-evaluating DOS pathnames that
; contain backslashes.
while not def \%4 { ; Target directory for uploading
ask \%4 { Target directory: }
}
.directory := \fcontents(\%4)
while not def \%5 { ; Email address for upload report
ask \%5 { Email address for report: }
}
.address := \fcontents(\%5)
;;; log session session.log ; Uncomment to log the host session
set input echo off ; Change to ON to watch the session
echo Making SSH connection to \%1 as user \%2...
; Bypass network directory lookup to avoid finding an entry of that name that
; specifies a different connection method.
;
set network directory ""
; In Unix, we make the connection through a pseudoterminal to the external SSH
; client, which prompts you for the host password unless you have the
; appropriate public and private keys installed for SSH. The only way to
; avoid the password prompt is to install the needed keys.
;
; If you are running this script in Unix and it fails, it is most likely due
; to a peculiarity of the underlying PTY driver. Try changing "set host /pty"
; to "set host /pipe" below.
;
if k-95 { ; K-95 has SSH built in
set host /network:ssh /user:\%2 /password:\%3 \%1
} else { ; C-Kermit uses external SSH client
set host /pty ssh -e none -l \%2 \%1
}
if fail errquit {Can't open SSH connection to \%1.}
echo Connected to \%1.
; At this point we have a connection to the host. Everything from here
; here down is specific to the host's prompts, commands, and applications,
; and of course, what you want to do once you have a connection.
;
; In this example we start the host's Kermit server and use it. The method
; used to start the server depends on the host allowing typeahead and there
; being no interactive non-shell prompt prior to login (adjust as necessary,
; e.g. to respond to prompts and/or wait for a specific shell prompt). It
; also assumes a relatively up-to-date C-Kermit version is installed on the
; host as "kermit" in your PATH.
;
set xfer display brief ; No fancy screen stuff
set exit warning off ; Exit without asking
lineout kermit -x ; Start Kermit server
input 20 "READY TO SERVE..." ; Wait for server's ready message
if fail stop 1 Server didn't start ; Check
remote cd \m(directory) ; CD to download directory on server
if fail stop 1 REMOTE CD \m(directory) failure
query kermit directory ; Get full remote directory path
if success .directory := \v(query)
set flag off ; For remembering transfer status
send \m(filename) ; Upload the file
if success set flag on ; Remember file-transfer status
; Send a report by e-mail through the server. This illustrates not only
; how to send email but also how to have the message body in memory rather
; than in a file by creating a small array containing the lines of the
; message.
;
declare \&a[4] ; Declare a 4-element array
.\&a[1] := File: \fpath(\m(filename)) ; Full pathname of source file
.\&a[2] := Size: \fsize(\m(filename)) ; Size of source file
.\&a[3] := To directory: \m(directory) ; Target directory
if flag { ; Status
.\&a[4] := Status: Success
} else {
.\&a[4] := Status: Failure \v(xfermsg)
}
send /mail:\m(address) /array:a /text /subject:"Upload status"
; Shut down the server and close the connection
bye
exit \v(status)