SWUtility:WinSCP
From Aino Wiki
Contents
Introduzione
WinSCP è un client per invece installare un Server SFTP, consiglio: freeFTPd.
Per info sul server vedere link interno: Protocol SFTP
Configurazione
Sono due gli eseguibili utili, il file *.exe ha anche una UI anche se può esser eseguito anche come applicazione console, il secondo file *.com è invece eseguibile solo come applicazione console.
winSCP è un client, per il server si suggerisce il programma gratuito e freeware "freeFTPs" della WeOnlyDosoftware. Al momento c'è la versione 1.0.13.
Per l'esecuzione batch
I parametri per l'esecuzione batch sono generabili direttamente attraverso l'interfaccia GUI dell'applicazione ecco come fare:
- Cliccare sul Tab "New Session
- Dalla finestra apertasi cliccare sul pulsante "Manage"
a questo punto copiare la URL e testarla eseguendo da shell di windows, segue un esempio:
C:\Program Files (x86)\WinSCP>WinSCP.com /ini=null /open sftp://UserName:Password;fingerprint=ssh-rsa-ChiaveEsadecimaleGenerataNellaUI@69.69.69.69:4321/
Esempi comandi in linea
Sintassi per una sequenza di comandi (comandi che includono spazi richiedono le doppie virgolette " )
winscp.com /command "open sftp://... -hostkey=""ssh-rsa ...""" "put ""C:\my file.dat""" <- Script command 1 -> <- Script command 2 ->
GET
Esegue il download di uno o più files, guida ufficiale, sintassi:
get <file> [ [ <file2> ... ] <directory>\[ <newname> ] ]
Si possono usare wildcard, caratteri jolly, per scaricare molteplici files con filtri, per tutti i files usare *
get *.html *.png d:\www\
Files multipli si separano semplicemente con lo spazio, es.:
get index.html about.html d:\www\
Quando si specificano esplicitamente i files il comando fallirà nel caso anche solo uno dei files non esiste ma si può modificare il comportamento usando option failonnomatch.
Parametri utili
Switch | Descrizione | Esempio | ||||
---|---|---|---|---|---|---|
-delete | Cancella il file o i files remoti se il trasferimento va a buon fine | get -delete index.html about.html .\ | ||||
-resume | Esegue automaticamente la "riesumazione", se possibile, nel caso ci sia una perdita di connessione | . | - | -transfer=<mode> | ascii|automatic | . |
PUT
Esegue l'upload di un file,se non si indica la cartella remota di destinazione i files finiranno in quella corrente. Guida ufficiale put
Sintassi:
put <file> [ [ <file2> ... ] <directory>/[ <newname> ] ]
Possono essere indicati puntualmente piu files ma separati da spazio. Esmpio:
put C:\Tmp\Miofile.txt /home/MiaCartella/
Esempio completo
In un'unica riga più comandi:
- si esegue l'apertura della connessione
- si effettua un upload di un fine in una specifica cartella remota 'SottoCartellaRemota'
- infine esegue l'uscita
C:\>"C:\Program Files (x86)\WinSCP\winscp.com" /command "open sftp://NomeUtente:PasswordUtente@10.10.10.10:6969/ -hostkey=""ssh-rsa 1024 chiaveCriptograficaLunga""" "put ""D:\Job_Log\CC_CV\Projects ES IT\IT\WinSCP_Down.log"" "/SottoCartellaRemota/" " " "close" "exit"
Scripting
Fonte winscp.net
E' possibile creare uno script in un file e poi eseguirlo usando l'opportuno comando da una finestra terminale\prompt comandi DOS. L'eseguibile da invocare è winscp.com
.
NOTA in tutti gli esempi la cartella locale è sempre quella in cui sì è lanciando l'eseguibile WinSCP da prompt DOS oppure va usato il comando "lcd
" (local current directory).
Esempi
Esempio d'uso con file di script
1
Segue file di script da indicare nell'esecuzione di WinSCP da prompt comandi. La URL include anche la porta ovvero 4321
# Connessione open sftp://UtenteLogIn:ParolaDOrdine@10.11.12.13:4321/ -hostkey="ssh-rsa 1024 blablablablablablablablablablablabla=" ################## Comandi ################ get *.* "D:\SFTP Digitalk\Milano\*.*" # Fine close exit
File di script salvato con nome SFTP_SincroMI.txt ed eseguito come segue:
C:\tmp>"C:\Program Files (x86)\WinSCP\winscp.com" /ini=null /script="D:\SFTP Digitalk\Scripts\SFTP_SincroMI.txt"
PS se non si conosce cosa mettere come parametro -hostkey
eseguire il comando senza tale parametro e la stringa ssH-rsa da usare sarà mostrata a video.
2
# Connect open sftp://user:password@example.com/ -hostkey="ssh-rsa 2048 xxxxxxxxxxx...=" # Change remote directory cd /home/user # Download file to the local directory d:\ get examplefile.txt d:\ # Disconnect close # Connect as a different user open sftp://user2:password@example.com/ # Change the remote directory cd /home/user2 # Upload the file to current working directory put d:\examplefile.txt # Disconnect close # Exit WinSCP exit
Che salvato nel file "example.txt" può esser eseguito come segue:
> winscp.com /ini=nul /script=example.txt
Il parametro /ini
indica il percorso del file INI di configurazione con cui eseguire script o comandi. /ini=nul
semplicemente indica di usare la configurazione di default.
Elenco Comandi
Elenco comandi usabili negli scripts, i commenti si inseriscono facendoli precedere da #
Command | Description |
---|---|
call | Executes arbitrary remote shell command |
cd | Changes remote working directory |
checksum | Calculates checksum of remote file |
chmod | Changes permissions of remote file |
close | Closes session |
cp | Duplicates remote file |
echo | Prints message onto script output |
exit | Closes all sessions and terminates the program |
get | Downloads file from remote directory to local directory |
help | Displays help |
keepuptodate | Continuously reflects changes in local directory on remote one |
lcd | Changes local working directory |
lls | Lists the contents of local directory |
ln | Creates remote symbolic link |
lpwd | Prints local working directory |
ls | Lists the contents of remote directory |
mkdir | Creates remote directory |
mv | Moves or renames remote file |
open | Connects to server |
option | Sets or shows value of script options |
put | Uploads file from local directory to remote directory |
pwd | Prints remote working directory |
rm | Removes remote file |
rmdir | Removes remote directory |
session | Lists connected sessions or selects active session |
stat | Retrieves attributes of remote file |
synchronize | Synchronizes remote directory with local one |
Logging
Fonte: winscp.net
Esempio:
> winscp.exe /script=example.txt /log="C:\winscp.log" /loglevel=0
Si può usare il parametro /logsize
per specificare la dimensione e\o la rotazione dei file di log
ad es. /logsize=5*10M
indica di usare un massimo di 5 file di 10 Mbyte di dimensione.
Altro es.:
winscp.exe /console /script="myscript.txt" /log="myscript.log"
Sincronizzazione
Comando synchronize
Fonte winscp.net. Consente di tenere aggiornato il contenuto di una cartella remota con una locale e viceversa o mutualmente, la sincronizzazione non è continua ma puntuale, viceversa usare il comando 'keepuptodate'.
E' un comando e va preceduto dalla parametro /command
oppure inserito nello script in un rigo tra i primi, sintassi:
synchronize local|remote|both [ <local directory> [ <remote directory> ] ]
-
local
solo i cambiamenti apportati sulla cartella remota sono riportati sulla cartella locale; -
remote
solo i cambiamenti apportati sulla cartella locale sono riportati sulla cartella remota; -
both
entrambe i cambiamenti, in remoto o in locale, sono aggiornati contemporaneamente.
Quando non son specificate le cartelle, saranno solo le cartelle di defualt ad essere interessate dalla sincronizzazione.
Esempio utilizzando un file di scripting
# Connessione open sftp://Utonto:cip%2ciop@10.11.12.13:1234/ -hostkey="ssh-rsa 1024 precipitevolissimevolmente_precipitevolissimev=" ################## Comandi ################ synchronize local "D:\SFTP Digitalk\Milano" / close exit
C:\> "C:\Program Files (x86)\WinSCP\winscp.com" /ini=null /script="D:\SFTP Digitalk\Scripts\SFTP_SincroMI_Test1.txt"
Per filtrare le estensioni dei files da sincronizzare è possibile usare il segeunte comando:
synchronize both -filemask="|*.bak; *.tmp"
Comando keepuptodate
Fonte winscp.net.
Come per il comando synchronize ma in questo caso la sincronizzazione è continua, purtroppo esegue SOLO la sincronizzazione della cartella locale verso la remota.
Sintassi:
keepuptodate [ <local directory> [ <remote directory> ] ]
Usando C#
Fonte:
Prima di tutto installare la libreria con NUGet (si potrebbe fare anche altrimenti ma occorre aggiungere manualmente le reference giuste). Segue esempio riportato esattamente dalla DOC di WinSCP.
using System; using WinSCP; class Example { public static int Main() { try { // Setup session options SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Sftp, HostName = "example.com", UserName = "user", Password = "mypassword", SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." }; using (Session session = new Session()) { // Connect session.Open(sessionOptions); // Upload files TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Binary; TransferOperationResult transferResult; transferResult = session.PutFiles(@"d:\toupload\*", "/home/user/", false, transferOptions); // Throw on any error transferResult.Check(); // Print results foreach (TransferEventArgs transfer in transferResult.Transfers) { Console.WriteLine("Upload of {0} succeeded", transfer.FileName); } } return 0; } catch (Exception e) { Console.WriteLine("Error: {0}", e); return 1; } } }
Esempio realistico:
using System; using WinSCP; class Example { private string Upload_ByWinSCP(AvayaRecording_CFG cfg) { string logOutput = string.Empty; SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Sftp, HostName = cfg.Host_URL, PortNumber = cfg.PortNr, UserName = cfg.UserName, Password = cfg.Password, SshHostKeyFingerprint = "ecdsa-sha2-nistp384 384 " + cfg.SSH_Key, }; bool isRemoveRemoteFile = true; using (Session session = new Session()) { //sessionOptions.Timeout = ? // Connect session.Open(sessionOptions); // Upload files TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Binary; //transferOptions.FileMask transferOptions.OverwriteMode = OverwriteMode.Overwrite; TransferOperationResult transferResult; //Es.: // = session.PutFiles(@"F:\AvayaRecording\_GwServer\Avaya\*.zip /_GoogleDestFolders/Avaya/", false, transferOptions); transferResult = session.PutFiles(string.Format("{0}{1}", cfg.LocalPath, cfg.FilesFilter) , cfg.RemotePath , isRemoveRemoteFile, transferOptions); // Throw on any error transferResult.Check(); // Print results foreach (TransferEventArgs transfer in transferResult.Transfers) { // (#) <-- stà per C# a differenza di (S) che stà per Command Prompt Script logOutput += string.Format("(#) UPLOADED:\r\n{0}\r\n", Path.GetFileName(transfer.FileName)); } // ? session.Close(); } return logOutput; } }
Esecuzione con SQL Management Studio
Download
Esegue il trasferimento file con output su file:
DECLARE @Cm dDOS AS varchar(256) = '', @CmdFull AS varchar(8000) = '', @NodeSiteCode varchar(5) = '', --RM MI @c_pathWinSCP AS varchar(256) = 'C:\Program Files (x86)\WinSCP\winscp.com', --'winscp.com', @c_pathScriptWinSCP AS varchar(256) = 'D:\Documents\CSDB\WinSCP_Scripts\', @c_FileScriptWinSCP AS varchar(256) = 'SFTP_Sincro§_CDR.txt', @c_pathLog AS varchar(256) = 'D:\Job_Log\CC_CV\MonthlyDashboard\', @ErrorDescription AS varchar(max) = '' SET @NodeSiteCode = 'RM' Print 'Acquisizione file dal nodo di Roma "' + @NodeSiteCode + '"' SET @CmdD OS = 'CMD /C ""' + @c_pathWinSCP + '" /ini=null /script="' + @c_pathScriptWinSCP + REPLACE(@c_FileScriptWinSCP, '§', @NodeSiteCode) + '"' + ' > ' + @c_pathLog + 'DGT_WinSCP_' + @NodeSiteCode + '.log "' Print 'Cm d WinSCP: ' + @c_CR + @CmdDOS EXEC @ShellReturnCode = xp_cm dshell @CmdDOS; IF @ShellReturnCode <> 0 BEGIN SET @ErrorDescription = 'Acquisizione dei files "' + @FileFilterMask + '" fallita!'; THROW 51000, @ErrorDescription, 1; END ELSE Print 'Acquisizione riuscita'
Sostanziialmente esegue il seguente
CMD /C ""C:\Program Files (x86)\WinSCP\winscp.com" /ini=null /script="D:\Documents\CSDB\WinSCP_Scripts\SFTP_SincroRM_CDR.txt" > D:\Job_Log\CC_CV\MonthlyDashboard\DGT_WinSCP_RM.log "
Upload
Il seguente esempio eseguirà l'upload di un file in una cartella specifica remota:
DECLARE @SourceFileName AS varchar(256) = 'Cravidi.xlsx', --Nome file importanto e da archiviare con Azione UPLOAD @SourceFilePath AS varchar(256) = 'D:\Documents\CC_CV\Projects ES IT\IT\FileDataSources\', @DtUpdate AS datetime = GETUTCDATE(), @tmpMessage AS varchar(255), @ShellCmdCurrStep AS nvarchar(2048) = '', @CmdShell AS nvarchar(4000) = '', @ShellCmdResult AS int = 0, @UpSFTPRemoteFolder AS varchar(255) = '/Cravidi/', @c_UpSFTPArchiveFolder AS varchar(255) = 'Processed/', @c_ClientSFTP_FullPath AS varchar(512) = '"C:\Program Files (x86)\WinSCP\winscp.com"', @c_ScriptWinSCP_Path AS varchar(512) = 'D:\Documents\CC_CV\Projects ES IT\IT\Batch Scripts\', @c_ScriptWinSCP_File AS varchar(512) = 'WinSCP_DownAll.txt', @c_WinSCPDwnLogFullPath AS varchar(512) = 'D:\Job_Log\CC_CV\Projects ES IT\IT\WinSCP_Down.log', @c_WinSCPUpLogFullPath AS varchar(512) = 'D:\Job_Log\CC_CV\Projects ES IT\IT\WinSCP_Up.log', @c_WinSCPUserName AS varchar(512) = 'CC_CV_Prj', @c_WinSCPUserPassword AS varchar(512) = 'password', @c_WinSCPSSHCode AS nvarchar(512) = 'chiaveSSH', @c_SP_Version AS varchar(10) = '0.01', --Codice di versione di questa Stored Procedure @c_CR AS nvarchar(10) = CHAR(13), --non andava: CHAR(10) @c_TAB AS nvarchar(10) = CHAR(9) /* C:\Users\zzgaino>"C:\Program Files (x86)\WinSCP\winscp.com" /command "open sftp://CC_CV_Prj:password@10.106.135.8:5302/ -hostkey=""ssh-rsa 1024 chiaveSSH""" "put ""D:\Job_Log\CC_CV\Projects ES IT\IT\WinSCP_Down.log"" "/Cravidi/" " "close" "exit" */ SET @ShellCmdCurrStep = @c_ClientSFTP_FullPath + ' /command "open sftp://' + @c_WinSCPUserName + ':' + @c_WinSCPUserPassword + '@10.10.10.10:6969/ -hostkey=""ssh-rsa 1024 ' + @c_WinSCPSSHCode + '""" "put ""' + @SourceFilePath + @SourceFileName + '"" "' + @UpSFTPRemoteFolder + @c_UpSFTPArchiveFolder + '" " ' + '"close" "exit"' SET @Cm dShell = 'CMD /S /C "' + @ShellCmdCurrStep + ' > "' + @c_WinSCPUpLogFullPath + '""' Print @c_TAB + @Cm dShell EXEC @ShellCm dResult = xp_cm dshell @Cm dShell; IF (@ShellCmdResult = 0) Print 'UPLOAD SFTP: Success' + @c_CR ELSE THROW 51000, 'UPLOAD SFTP Command shell outcome: Failure', 1;
Mappa e Link
Parole chiave: