Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

SWUtility:WinSCP

From Aino Wiki

Jump to: navigation, search

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 dir.png

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"
WinSCP help 01.png
WinSCP help 02.png
WinSCP help 03.png

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/
WinSCP help 04.png

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


Software Utility


Applicazioni


Parole chiave:

Author Giuseppe AINO