Sample script of using PuTTYs psftp and plink to:
- login to a remote linux host using plink via ssh,
- run a find command to return a list of files in a directory tree,
- build a psftp batch script to grab and move the remote files
- login again using psftp and run the batch script
- convert the grabbed files from unix to dos line ends
option explicit dim oshell, ofso, oScriptExec dim sftp_batch_file, local_dir, remote_base_dir, dim UNX, WIN, archive_dir, linux_host, pw, user, ret dim PLINK, unix_cmd, PSFTP, TODOS, PLINK_EXE, PSFTP_EXE, PUTTY_DIR dim ar ' set variables ' unix directory separator UNX = "/" ' windows dir sep WIN = "\" ' this is the top path I am looking for ' files in remote_base_dir = "/u6/app/erp/edilive/out" ' file to store PuTTY psftp commands sftp_batch_file = "sftp.batch" local_dir = "d:\EDI\edilive\out" archive_dir = remote_base_dir & UNX & "transfer-archive/archive" linux_host = "linux_server" pw = "mypassword" user = "myuser" ' this is a windows unix2dos utility ' http://www.thefreecountry.com/tofrodos/ TODOS = "d:\EDI\cmd\todos.exe" ' the fantastic PuTTY command line ' utilities plink and psftp PUTTY_DIR = "C:\Program Files (x86)\PuTTY\" PLINK_EXE = PUTTY_DIR & "plink.exe" PSFTP_EXE = PUTTY_DIR & "psftp.exe" ' create objects set oShell = createobject("Wscript.shell") set ofso = createobject("scripting.filesystemobject") ' find command look for all files under ' skipping certain paths ' find /u6/app/erp/edilive/out \( -path "*transfer-archive" -o -path "*cinv-nys" \) -prune -o -type f -print unix_cmd = """" & "find /u6/app/erp/edilive/out \( -path " & _ """" & "*transfer-archive" & """" & _ " -o -path " & """" & "*cinv-nys" & """" _ & " \) -prune -o -type f -print" & """" ' ' runs the the find command which looks for and ' returns a list of remote files ' the output of plink ' is captured by oScriptExec.StdOut PLINK = """" & PLINK_EXE & """" & _ " -l " & user & " -pw " & _ """" & pw & """" & " " & linux_host & " " & unix_cmd 'ret = oShell.run(plink, 0, true) Set oScriptExec = oShell.Exec(plink) 'pipe the result into a variable ret = oScriptExec.StdOut.ReadAll sendErr ret 'serr = oScriptExec.StdErr.ReadAll 'wscript.echo serr if len(ret) = 0 then wscript.echo "No remote files so exiting" wscript.quit end if ' trim the trailing line feed (\n) ' so you don't get an empty ' array element when you use split ret = left(ret,Len(ret)-1) ' convert the output to an array ar = split(ret, vbLF) build_sftp_batch ar PSFTP = """" & PSFTP_EXE & """" & _ " -l " & user & " -pw " & pw & " " & _ linux_host & " -b " & sftp_batch_file Set oScriptExec = oShell.Exec(PSFTP) ret = oScriptExec.StdOut.ReadAll 'log the transfer in eventvwr sendErr ret ' pass all the files we get ' from erp and convert to dos format convert_todos ar sub convert_todos(afiles) dim x, i, file_name, get_local_dir for each x in afiles wscript.echo "Remote: " & x i = instrRev(x, UNX) - 1 'wscript.echo i file_name = right(x, len(x) - i - 1) wscript.echo "File name: " & file_name get_local_dir = local_dir & replace(replace(left(x,i), remote_base_dir, ""), UNX, WIN) wscript.echo "Local: " & get_local_dir if ofso.fileExists(get_local_dir & WIN & file_name) then oshell.run TODOS & " " & """" & get_local_dir & WIN & file_name & """" end if next end sub ' build the psftp batch file ' that will run the commands to grab ' the remote files sub build_sftp_batch(afiles) dim x, osftp_batch, i, file_name, get_local_dir set osftp_batch = ofso.CreateTextFile(sftp_batch_file, true) for each x in afiles wscript.echo "Remote: " & x i = instrRev(x, UNX) - 1 'wscript.echo i file_name = right(x, len(x) - i - 1) wscript.echo "File name: " & file_name get_local_dir = local_dir & replace(replace(left(x,i), remote_base_dir, ""), UNX, WIN) wscript.echo "Local: " & get_local_dir wscript.echo "Remote archive: " & archive_dir osftp_batch.writeline "lcd " & get_local_dir osftp_batch.writeline "get " & x osftp_batch.writeline "ren " & x & " " & _ archive_dir & UNX & file_name & "-" & date_stamp next osftp_batch.writeline "quit" osftp_batch.close end sub ' create a YYYY-MM-DD-HHMMSS timestamp function date_stamp() dim tnow, Y, M, D, H, S tnow = now() Y = YEAR(tnow) M = MONTH(tnow) if Len(M) = 1 then M = "0" & M end if D = DAY(tnow) if len(D) = 1 then D = "0" & D end if S = Second(tnow) if len(S) = 1 then S = "0" & S end if H = Hour(tnow) if len(H) = 1 then H = "0" & H end if M = minute(tnow) if len(M) = 1 then M = "0" & M end if date_stamp = Y & "-" & M & "-" & D & "-" & H & M & S end function sub sendErr(sError) wscript.echo sError oshell.LogEvent 0, sError end sub
Example of the psftp.batch file
lcd d:\edi\edilive\out\cinv get /u6/app/erp/edilive/out/cinv/CINV20005.004 ren /u6/app/erp/edilive/out/cinv/CINV20005.004 /u6/app/erp/edilive/out/transfer-archive/archive/CINV20005.004-2013-26-04-162658 quit
0 Comments