Thứ Ba, 25 tháng 10, 2022

Sao lưu, đồng bộ file và thư mục với WinSCP

 

 File ftpscript.txt

option batch continue
option confirm off
open admin@192.168.1.42
synchronize remote "E:\Backup" "/media/DATA/BK"
exit

 .........................................................

File ftp.cmd

echo off

setlocal

set year=%date:~10,4%

set month=%date:~4,2%

set day=%date:~7,2%

set h=%time:~0,2%

set h=%h: =0%

set m=%time:~3,2%

set filename=log_%year%%month%%day%%h%%m%.txt

E:\WinSCP\winscp.com /script=E:\WinSCP\Scripts\ftpscript.txt >> E:\WinSCP\logs\%filename%

open ftp://user_ftp:pass_ftp@ip_ftp

synchronize remote [Source]  [Target]

exit

Thay thế các thông tin user_ftp, pass_ftp, ip_ftp bằng các thông tin tương ứng.

 https://winscp.net/eng/docs/task_synchronize 

https://winscp.net/eng/docs/task_synchronize_full

https://winscp.net/eng/docs/task_keep_up_to_date

https://winscp.net/eng/docs/scripting

https://winscp.net/eng/docs/scriptcommand_synchronize

..........................................................

File backup.cmd

echo off

setlocal

set year=%date:~10,4%

set month=%date:~4,2%

set day=%date:~7,2%

set h=%time:~0,2%

set h=%h: =0%

set m=%time:~3,2%

set filename=B7R2_%year%%month%%day%.rar
echo %filename%
E:\WinSCP\WinSCP.com ^
  /log="E:\WinSCP\WinSCP.log" /ini=nul ^
  /command ^
    "open sftp://admin:Password@192.168.1.42/ -hostkey=""ssh-ed25519 255 eusLUlvUyZC+VnuPmjHwoyNbxX9PfOUQ7kx3Jpmd9K8""" ^
    "put E:\Backup\%filename% /media/DATA/BK/" ^
    "exit"

set WINSCP_RESULT=%ERRORLEVEL%
if %WINSCP_RESULT% equ 0 (
  echo Success
) else (
  echo Error
)

exit /b %WINSCP_RESULT%

Giới thiệu giải pháp sao lưu, đồng bộ file và thư mục

Nhằm mục đích chia s kinh nghiệm trong công tác sao lưu, phục hồi các nguồn dữ liệu của cá nhân nói riêng và các nguồn dữ liệu của Tổng công ty Điện lực miền Nam nói chung, Công ty CNTT (SPCIT) hướng dẫn giải pháp đồng bộ file, thư mục bằng phần mềm WinSCP. Giải pháp đưa ra với giả định cần backup hoặc synchonize thư mục từ source đến target hoặc từ target đến source, trong đó target là thư mục được đặt ở FTP hoặc SFTP hoặc SCP.

Hiện nay có rất nhiều công cụ để đồng bộ như: FTPVoyager, SyncBackPro, WinScp..., tuy nhiên đa phần là có phí, nếu sử dụng miễn phí thì có FTPVoyager của hãng Solarwinds nhưng tốc độ copy dữ liệu khá chậm, SyncBackPro thì phải mất phí. Trong các phần mềm miễn phí có WinScp là chương trình dùng để copy dữ liệu với tốc độ nhanh, giao diện đơn giản và có đầy đủ tài liệu, chỉ cần đọc tài liệu và lập lịch trong windows/linux thì chúng ta có thể biến WinScp thành một công cụ hữu ích trong việc tự động đồng bộ  file cũng như thư mục chúng ta mong muốn. Sau đây hướng dẫn chi tiết:

Để thực hiện đầu tiên ta phải có phần mềm WinSCP, vào trang https://winscp.net/eng/download.php vào mục Download, phiên bản hiện tại là 5.17 (như hình dưới)

 

Tiếp theo ta chọn [Other Download], mình thường sử dụng WinScp dạng file portable để không cần cài đặt, tìm đến mục [Portable executable] và bấm nút download

Sau khi download về ta giải nén đến một thư mục cần làm việc, tuy nhiên cần sửa lại đường dẫn trong file script phía dưới, ở đây mình giải nén đến ổ D:\Softs\WinScp (như hình)

 

Bước tiếp theo là viết script file để thực thi, tạo một file có tên [winscpput.txt], sau đó gõ các dòng lệnh sau (gõ sau dấu nháy):

open ftp://user_ftp:pass_ftp@ip_ftp

synchronize remote [Source]  [Target]

exit

Thay thế các thông tin user_ftp, pass_ftp, ip_ftp bằng các thông tin tương ứng. Trong đó [Source] là thư mục cần backup, [Target] là nơi lưu trữ backup. Lưu file này vào thư mục D:\Softs\WinScp\Script. Ở đoạn lệnh trên nếu ta thay synchronize remote thành synchronize local thì sẽ chép file từ target về source.

Tiếp theo tạo file có tên [ScriptPut.bat] và open with file bằng notepad, sau đó gõ các lệnh sau (gõ sau dấu nháy):

echo off

setlocal

set year=%date:~10,4%

set month=%date:~4,2%

set day=%date:~7,2%

set h=%time:~0,2%

set h=%h: =0%

set m=%time:~3,2%

set filename=log_%year%%month%%day%%h%%m%.txt

"D:\Softs\WinSCP\winscp.com" /script=D:\Softs\WinScp\Script\winscpput.txt >> D:\Soft\Winscp\logs\%filename%

Lưu file này trong ổ D:\Softs\WinScp\Script. Lưu ý ta cần tạo thư mục [logs] trong ổ D:\Soft\Winscp\logs, mục đích khi WinScp thực thi sẽ tạo file log, chúng ta có thể đọc file log này để xác định xem tình hình đồng bộ, các lỗi.

Bước tiếp theo ta bấm vào file [ScriptPut.bat] để chạy thử, kiểm tra kết quả bằng cách xem log file trong thư mục [logs].

Để tự động hóa trong việc đồng bộ, ta tiến hành lập lịch (Scheduler) trong windows, trong quá trình lập lịch khi đến bước [Start Program] ta trỏ đến file [ScriptPut.bat] mà ta tạo lúc nãy.

 

Ngoài ra cần cho phép chạy task scheduler chạy với quyền cao nhất và không cần hỏi password. Bấm OK để kết thúc. Như vậy chúng ta đã lập xong một task tự động thực thi vào thời gian mà đã lập lịch.

Trên đây là các bước cơ bản để thực hiện việc backup, đồng bộ giữa 2 thư mục source và target, người dùng có thể vào trang https://winscp.net/eng/docs/start để tìm hiểu thêm các lệnh command line và gắn vào script trên. 

 

Synchronization Direction

There are three possible directions (targets) of synchronization.

With Local direction, changes from remote directory (source) are applied to local directory (target). Only the local directory is modified.

Remote mode is the same as Local, just in an opposite direction: changes from the local directory (source) are applied to the remote directory (target). Only the remote directory is modified.

In Both mode, both local and remote directories can be modified (both can act as both source and target).

 
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    

The Console Interface Tool

Learn about winscp.com, the console interface tool.

Verifying the Host Key or Certificate in Script

The first connection to an SSH server requires verification of the host key. To automate the verification in script, use -hostkey switch of open command to accept the expected host key automatically.

You can find the key fingerprint on Server and Protocol Information Dialog. You can also copy the key fingerprint to clipboard from the confirmation prompt on the first (interactive) connection using Copy key fingerprints to clipboard command (in the script, use SHA-256 fingerprint of the host key only). Learn more about obtaining host key fingerprint.

FTPS/WebDAVS TLS/SSL certificate signed by untrusted authority may also need to be verified. To automate the verification in script, use -certificate switch of open command to accept the expected certificate automatically.

Running a Script under a Different Account (e.g., Using a Scheduler)

If you are going to run the script under a different account (for example using the Windows Task Scheduler), make sure the script does not rely on a configuration settings that might differ on the other account. When using registry as configuration storage, the settings are accessible only for your Windows account. Ideally, make sure the script does not rely on any external configuration, to make it completely portable. Note that the configuration also includes verified SSH host keys and FTPS/WebDAVS TLS/SSL certificates.

For details, see the next section and Why does WinSCP not work in a new environment (operating system, machine, user account, network), when it works for me in a different environment already?

Sharing Configuration with Graphical Mode

In scripting/console mode, WinSCP shares configuration with graphical mode by default. While this can be useful in some cases, it can also be a disadvantage.

The disadvantage is that change to configuration in graphical mode may break your script (common example is enabling Existing files only option for synchronization). Also the script is not portable to other machines, when it relies on an external configuration.

If you want to protect your script from such inadvertent change or if you want to make the script portable, you should isolate its configuration from graphical mode explicitly.

The best way to do that is to configure all the options you need using script commands only (option command, switches of other commands, session URL), or if no such command is available, using raw site settings and raw configuration. Finally force scripting mode to start with the default configuration using /ini=nul command-line parameter.

Alternatively export your configuration to a separate INI file and reference it using /ini= command-line parameter. Also consider setting the INI file read-only, to prevent WinSCP writing to it, when exiting. Particularly, if you are running multiple scripts in parallel, to prevent different instances of WinSCP trying to write it at the same time.

Generating Script

You can have WinSCP generate a script template for you.

Advertisement

Example

In the example below, WinSCP connects to example.com server with account user, downloads file and closes the session. Then it connects to the same server with the account user2 and uploads the file back.

# 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

Save the script to the file example.txt. To execute the script file use the following command.

winscp.com /ini=nul /script=example.txt

For simple scripts you can specify all the commands on command-line using /command switch:

winscp.com /ini=nul /command "open sftp://user:password@example.com/ -hostkey=""ssh-rsa 2048 xxxxxxxxxxx...""" "get examplefile.txt d:\" "exit"

In Windows batch file, you can use ^ to split too long command-line to separate lines by escaping following new-line character:

winscp.com /ini=nul /command ^
    "open sftp://user:password@example.com/ -hostkey=""ssh-rsa 2048 xxxxxxxxxxx...""" ^
    "get examplefile.txt d:\" ^
    "exit"

See other useful example scripts.

Converting Script to Code Based on .NET Assembly

When you find yourself limited by scripting capabilities, you may consider converting your script to code that uses WinSCP .NET assembly
 

Không có nhận xét nào:

Đăng nhận xét