Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 55

0
votes
answers
32 views
+10

複製文件到Linux [python]的

-1

有哪些不同的模塊/方法來從Windows計算機複製文件到可用的Linux服務器在python複製文件到Linux [python]的

我使用FTPLIB API連接到Windows服務器的嘗試,但IM無法與錯誤的事 - socket.error:[錯誤111]拒絕連接

什麼是我可以連接到Windows計算機的目錄

+0

這要看是什麼樣的連接(即服務器/服務)你的Linux服務器提供(和你被允許訪問哪些)... –

+0

@sme的Windows計算機上生成一個文件(VPC),我需要在Linux服務器上覆制到我的磨刀石目錄,這是問題背後的基本思想。 我可以使用winscp bhi這個過程每天重複5次。 –

+0

你的意思是你有'ssh''訪問你的Linux服務器? –

沙发
0
0

如果下複製或列出文件中的其它模塊有權訪問Linux服務器,並自動在Windows上生成文件,您可以執行以下操作:

  1. 生成MACHING

  2. 將它添加到Linux機器的authorized_hosts您的Windows SSH密鑰

  3. 在Windows上安裝簡單的控制檯SCP工具

  4. 編寫簡單的CMD腳本來複制文件的幫助下,類似於:

    scp c: path to file.txt [email protected]:/home/user/file.txt

  5. 每次都會自動運行這個腳本,然後在windows主機上生成文件。

+0

感謝您的回覆。 這是我會選擇的最後一招。我想在Linux端創建一個腳本來獲取在Windows上生成的文件。 –

0
votes
answers
28 views
+10

從VBA調用WinSCP命令行時獲取「命令參數太多」

1

Upload file via FTP from Excel VBA非常有幫助,我使用代碼將本地文件夾同步到我的FTP服務器。從VBA調用WinSCP命令行時獲取「命令參數太多」

Call Shell(_ 
    CurrentProject.Path & "WinSCP.com /log=" & CurrentProject.Path & "ftp.log /command " & _ 
    """open ftp://user:[email protected]/"" " & _ 
    """synchronize local " & localfolder & " /www/remotefolder/wines -filemask=""*.png"" " & _ 
    """exit""") 

我想在結束時發出exit命令,但代碼讓我對命令「同步」一個

參數太多。

日誌中的線告訴我

synchronize local C:localfolderwines /www/remotefolder/wines -filemask=*.png exit 

exit是在同一行synchronize一個,當我使用put腳本,這不會發生。我能做些什麼來防止這種情況發生?

+0

確實清理換計算器錯誤,感謝poining出來 –

沙发
0
1

您錯過synchronize命令後的結束報價。並且-filemask價格的報價必須翻倍。或者實際上,您不需要它們,因爲該值不包含空格。

這樣做:

"""synchronize local " & localfolder & " /www/remotefolder/wines -filemask=*.png""" & _ 

https://winscp.net/eng/docs/commandline#syntax

+1

感謝您的快速回答,擔任我想它。喜歡你在WinSCP上的工作! –

0
votes
answers
34 views
+10

服務器vsFTPd連接失敗

-1

我試圖在ftp localhost上連接,但登錄名/密碼總是失敗。 我已經安裝了vsFTPd。 我想我必須修改passwd.conf。但我該如何處理? 我有這條線:服務器vsFTPd連接失敗

paul:x:1000:1000:paul,,,:/home/paul:/bin/false 

謝謝!

+1

請將您的問題移到[su]或[sf](在這裏刪除,重新發布)。這是[off-topic here](// stackoverflow.com/help/on-topic)。 –

沙发
0
0

您可以使用passwd(enter)設置新密碼。 或以root權限登錄並鍵入(sudo)passwd [username],然後更改密碼。

也許需要改變配置FTP服務器,並在/etc/vsftpd/vsftpd.conf文件配置設置local_enable=YESchroot_local_user=YES,用於允許用戶/etc/passwd登陸。

0
votes
answers
18 views
+10

如何在Docker中安裝和配置ftp

0

我確信有一種方法可以在docker中安裝ftp,但我無法找到如何解決。我看着其他人Dockerfile,但他們的代碼非常複雜。在Dockerfile中安裝和配置ftp有直接的前言嗎?如何在Docker中安裝和配置ftp

+0

你想通過FTP傳輸文件訪問容器呢?或者你想從容器ftp到外部服務器/位置?你最終的目標是什麼? – Juan

+0

@Juan我希望容器的行爲像一個FTP服務器。用戶應該能夠將文件傳入和傳出容器。 – Luke101

沙发
0
1

docker run -d -p 20-21:20-21 -p 65500-65515:65500-65515 -v /tmp:/var/ftp:ro metabrainz/docker-anon-ftp

這是對ftp://localhost打開一個匿名FTP服務器的更簡單的方法,只需更換的/ tmp爲您的首選目錄。

而且其Dockerfile看起來很簡單https://github.com/metabrainz/docker-anon-ftp/blob/master/Dockerfile

0
votes
answers
22 views
+10

ASP.NET使用瀏覽器下載SFTP文件

-3

我試圖使用C#和asp.net下載SFTP文件(.csv),但所有示例都需要我有一個遠程文件目錄。ASP.NET使用瀏覽器下載SFTP文件

對於這種情況,我需要瀏覽器下載文件,而不是放在目錄中,因爲瀏覽器(客戶端)無法直接將文件放入目錄。

有沒有人以前做過這個?

我試圖使用SSH.NET,但沒有找到辦法做到這一點。

+0

「一個SFTP文件」。 SFTP是Secure FTP協議,不是一種文件類型。完全不清楚你在問什麼,或者它是如何與ASP.NET相關的。 –

+0

除非瀏覽器能夠使用SFTP(你可能不能依賴的東西),否則瀏覽器將不會涉及到這一點。你的服務器需要適當的庫。它需要下載文件,然後允許用戶像從其他文件一樣從Web服務器下載文件。 – mason

+0

您可以考慮編寫能SFTP服務器流的文件並立即寫字節到HTTP響應流中,因此,你的服務器成爲代表一個瀏覽器的適配器(不理解SFTP)的處理程序和SFTP服務器(這不明白http) –

沙发
0
0

解決了這個,通過SFTP將文件移動到我的服務器,然後normaly下載文件。

string host = @"host"; 
     string username = "user"; 
     string password = "pass"; 
     string remoteDirectory = "/remote"; 

     string localDirectory = Server.MapPath(@"pdf"); 

     using (var sftp = new SftpClient(host, username, password)) 
     { 
      sftp.Connect(); 
      var files = sftp.ListDirectory(remoteDirectory); 

      foreach (var file in files) 
      { 
       string remoteFileName = file.Name; 
       if (remoteFileName == "APADEAATTT.csv") 
       { 

        using (Stream file1 = File.OpenWrite(localDirectory + "APADEAATTT.csv")) 
        { 
         sftp.DownloadFile(remoteDirectory + "APADEAATTT.csv", file1); 
        } 
       } 
      } 

     } 

     FileInfo fileInfo = new FileInfo(localDirectory+"APADEAATTT.csv"); 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment;filename=" + fileInfo.Name); 
     Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
     Response.ContentType = "text/csv"; 
     Response.Flush(); 
     Response.WriteFile(fileInfo.FullName); 
     Response.End(); 
836
votes
answers
32 views
+10

How to recursively download a folder via FTP on Linux [closed]

I'm trying to ftp a folder using the command line ftp client, but so far I've only been able to use 'get' to get individual files.

up vote 593 down vote accepted favorite
沙发
+5930
+50

You could rely on wget which usually handles ftp get properly (at least in my own experience). For example:

wget -r ftp://user:pass@server.com/

You can also use -m which is suitable for mirroring. It is currently equivalent to -r -N -l inf.

If you've some special characters in the credential details, you can specify the --user and --password arguments to get it to work. Example with custom login with specific characters:

wget -r --user="user@login" --password="Pa$$wo|^D" ftp://server.com/

EDIT As pointed out by @asmaier, watch out that even if -r is for recursion, it has a default max level of 5:

       -r
       --recursive
           Turn on recursive retrieving.

       -l depth
       --level=depth
           Specify recursion maximum depth level depth.  The default maximum depth is 5.

If you don't want to miss out subdirs, better use the mirroring option, -m:

       -m
       --mirror
           Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets infinite
           recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l inf
           --no-remove-listing.

You can set infinite recursion level with -l 0, so no need of using --mirror which may have some unwanted side effects such as .listing files – Hnatt Mar 8 '12 at 21:52

I use wget --ask-password -rl 99 ftp://user@server.com. This way the password is not visible with ps and does not remain in the history. Of course, by the nature of ftp it is sent unencrypted to the server. – Walter Tross Oct 25 '13 at 22:25

Reminder for bash newbs: you'll have to use single quotes if your username or password have control characters (like $), e.g. --user='user' --password='pa$$word' – tobek Sep 15 '15 at 0:48

+1570

Just to complement the answer given by Thibaut Barrère.

I used

wget -r -nH --cut-dirs=5 -nc ftp://user:pass@server//absolute/path/to/directory

Note the double slash after the server name. If I don't put an extra slash the path is relative to the home directory of user.

  • -nH avoids the creation of a directory named after the server name
  • -nc avoids creating a new file if it already exists on the destination (it is just skipped)
  • --cut-dirs=5 allows me to take the content of /absolute/path/to/directory and to put it in the directory where I launch wget. The number 5 is used to filter out the 5 components of the path. The double slash means an extra component.

Brilliant. The ability to skip files that already exist is great for catching up with the latest additions on a server migration. rsync is more efficient and more flexible, but sometimes that option is just not available, and only FTP can be used. – Jason Oct 23 '12 at 19:50

Nice params here especially -nc and --cut-dirs. Thanks for sharing! – Lance Cleveland Oct 24 '13 at 22:50

I don't always trust "skip existing files" because one of either might be incomplete or different in size and contents but good he mentioned the option – Daniel W. Nov 14 '13 at 8:48

Even today, I still use this wget command when unable to use rsync. The -nc and --cut-dirs is so useful! – Half Crazed Jan 27 '15 at 19:11

Awesome! And if you don't want to put your password on the command line, you can use --ftp-user=USER and --ask-password. – shoover Jun 5 '15 at 23:03

+250
ncftp -u <user> -p <pass> <server>
ncftp> mget directory

I couldn't login to a FTP-server using the params, but using the structure open ftp://USERNAME:PASSWORD@HOST after starting ncftp… – feeela Oct 7 '11 at 10:22

+1 - I know this post is old, but I just came across it and ncftp was real easy to use. I used -R for recursive getting with ncftpget – Zack Macomber Feb 20 '12 at 22:57

definitely more reliable than wget, and faster too in TAR mode. Thanks! – lencinhaus Nov 22 '13 at 11:04

This doesn't work as stated on Ubuntu 14.04. The syntax that worked for me was "get -R directory" instead of mget. – Ivan Sep 3 '14 at 16:39

Worked for me on Ubuntu 14.04. I didnt have to mget it was all just there. – ashley Dec 8 '15 at 11:24

+200

If lftp is installed on your machine, use mirror dir. And you are done. See the comment by Ciro below if you want to recursively download a directory.

btw, mirror -R dir does recursive directory upload/update – Ciro Santilli 新疆改造中心996ICU六四事件 May 13 '13 at 21:02

也可以使用mirror ./在當前路徑中遞歸下載所有文件和文件夾。 - Nabi KAZ 2014年7月9日0:38

您也可以只為當前目錄及其子文件夾鍵入mirror。 - 邁克爾2016年5月23日11:52

+170

If you can use scp instead of ftp, the -r option will do this for you. I would check to see whether you can use a more modern file transfer mechanism than FTP.

我投了這個,因為這完全是我的第一個想法,即使它沒有嚴格按照原樣回答問題。 - metao 09年9月22日9:04

你建議哪一個@ greg-hewgill?我有類似的問題 - Michal 2016年8月25日11:25

scp仍然會嘗試使用ssh,如果你只有FTP憑據,這將無法使用。感覺很奇怪回應2008年的評論,說我堅持的技術並不現代:( 2008年好,我在你發表評論的那天你年滿18歲。 - aexl 17年6月17日19:34

+80

Use WGet instead. It supports HTTP and FTP protocols.

wget -r ftp://mydomain.com/mystuff

Good Luck!

reference: http://linux.about.com/od/commands/l/blcmdl1_wget.htm

+70

There is 'ncftp' which is available for installation in linux. This works on the FTP protocol and can be used to download files and folders recursively. works on linux. Has been used and is working fine for recursive folder/file transfer.

Check this link... http://www.ncftp.com/

ncftp也在Windows上工作 - Ilya 08年9月22日9:14

我喜歡ncftp!謝謝。 - jocull 12年12月26日19:39

+30

If you can, I strongly suggest you tar and bzip (or gzip, whatever floats your boat) the directory on the remote machine—for a directory of any significant size, the bandwidth savings will probably be worth the time to zip/unzip.

也許在2008年,但在2013年帶寬無關緊要你可能有FTP而不是控制台訪問:-) - Daniel W. 13年11月14日在8:49

+30

If you want to stick to command line FTP, you should try NcFTP. Then you can use get -R to recursively get a folder. You will also get completion.

+20

wget -r ftp://url

Work perfectly for Redhat and Ubuntu

+10

You should not use ftp. Like telnet it is not using secure protocols, and passwords are transmitted in clear text. This makes it very easy for third parties to capture your username and password.

To copy remote directories remotely, these options are better:

  • rsync is the best-suited tool if you can login via ssh, because it copies only the differences, and can easily restart in the middle in case the connection breaks.

  • ssh -r is the second-best option to recursively copy directory structures.

See:

不安全,只是ftp - JosFabre 2015年9月25日16:34

它是2015年。不應使用FTP。 - Tilo 2015年9月29日3:22

我同意。並且應該始終提出更好的安全性建議。但問題是關於FTP,所以說不應該使用它沒有幫助 - JosFabre 2015年10月8日8:43

我恭敬地不同意。他們使用錯誤的工具來完成工作。他們應該學習使用安全和當前的工具,而不是1980年代的ftp。更具體地說,沒有人應該再運行ftp服務器了:P-Tilo 2015年10月9日5:14

對不起,但就在上週我訪問的服務器只有FTP連接。我的任務是遠離它。 - Antti Haapala 2016年3月11日19:37

-60

toggle the prompt by PROMPT command.

Usage:

ftp>cd /to/directory    
ftp>prompt    
ftp>mget  *

Down0-voted:mget不是遞歸的。 - Lance Cleveland 2013年10月24日22:49

0
votes
answers
37 views
+10

服務器到服務器文件傳輸端口?

0

我使用bash腳本(https://github.com/johnnywoof/FTP-Bash-Backup)將我的Debian www目錄備份到ftp服務器。一切順利,但傳輸被防火牆阻止。每次使用單獨的端口的腳本,所以我不能通過防火牆解除阻止。有什麼方法可以指定一個端口服務器到服務器文件傳輸端口?

的bash腳本

# FTP server settings 
USERNAME="" 
PASSWORD="" 
SERVER="" 
PORT=21 

BACKUPDIR="/" 

ndays=7 

LOCAL_DIRECTORY="/home" 

TEMP_BACKUP_STORE="/tmp" 

ENCRYPT_BACKUP=false 

AES_PASSWORD_FILE="" 

timestamp=$(date --iso) 

backup_remote_file_name="$timestamp.tar.gz" 
backup_file="$TEMP_BACKUP_STORE/$backup_remote_file_name" 

MM=`date --date="$ndays days ago" +%b` 
DD=`date --date="$ndays days ago" +%d` 

echo "Removing files older than $MM $DD" 

listing=`ftp -i -n $SERVER $PORT <<EOMYF 
user $USERNAME $PASSWORD 
binary 
cd $BACKUPDIR 
ls 
quit 
EOMYF` 

lista=($listing) 

for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do 
    # month (element 5), day (element 6) and filename (element 8) 
    #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}   File: ${lista[`expr $FNO+8`]} 

    if [ ${lista[`expr $FNO+5`]}=$MM ]; 
    then 
     if [[ ${lista[`expr $FNO+6`]} -lt $DD ]]; 
     then 
      echo "Removing ${lista[`expr $FNO+8`]}" 
      ftp -i -n $SERVER $PORT <<EOMYF2 
      user $USERNAME $PASSWORD 
      binary 
      cd $BACKUPDIR 
      delete ${lista[`expr $FNO+8`]} 
      quit 
      EOMYF2 
     fi 
    fi 
done 

echo "Creating backup..." 

tar -czf $backup_file $LOCAL_DIRECTORY 

if [ "$ENCRYPT_BACKUP" == "true" ] 
then 
    echo "Encrypting backup using OpenSSL..." 
    output_encrypted_file="$backup_file.enc" 
    openssl enc -aes-256-cbc -salt -in $backup_file -out $output_encrypted_file -pass file:$AES_PASSWORD_FILE 
    rm $backup_file 
    backup_file=$output_encrypted_file 
fi 

echo "Uploading backup $backup_file ..." 

ftp -n -i $SERVER $PORT <<EOF 
user $USERNAME $PASSWORD 
cd $BACKUPDIR 
put $backup_file $backup_remote_file_name 
quit 
EOF 

echo "Deleting temporary files..." 
rm $backup_file 
echo "Backup complete." 
+0

腳本應該始終連接到相同的端口 - 端口21。你是說你的本地(客戶端)防火牆阻止在端口21在服務器上直接出站(客戶端)的流量? – hnefatl

+0

不使用隨機端口,21端口暢通 –

+0

順便說一句:請看看:http://www.shellcheck.net/ – Cyrus

沙发
0
2

切換到被動模式:

插入passive在新行後user命令。


參見:Active FTP vs. Passive FTP, a Definitive Explanation

+0

工作像魅力 –

0
votes
answers
19 views
+10

啓用ssh-dss公鑰算法的Python FTP util

0

我使用FTP連接處理python腳本。我無法通過ftplib.FTP和pysftp連接到FTP。啓用ssh-dss公鑰算法的Python FTP util

手動FTP連接有效,但我必須啓用在當前openSSH版本中默認禁用的dss-ssh算法。 腳本中缺少哪種配置?

手動連接:

$ sftp -oHostKeyAlgorithms=+ssh-dss ftp_address 

我的腳本中使用pysftp:

import pysftp 
srv = pysftp.Connection(host=my_host, password=my_pass) 

堆棧跟蹤:

Traceback (most recent call last): 
    File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 2411, in <module> 
    globals = debugger.run(setup['file'], None, None, is_module) 
    File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1802, in run 
    launch(file, globals, locals) # execute the script 
    File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile 
    exec(compile(contents+"
", file, 'exec'), glob, loc) 
    File "/ftp_tool.py", line 8, in <module> 
    srv = pysftp.Connection(host=my_host, password=my_pass) 
    File "/ftp_service/venv/lib/python3.4/site-packages/pysftp/__init__.py", line 132, in __init__ 
    self._tconnect['hostkey'] = self._cnopts.get_hostkey(host) 
    File "/ftp_service/venv/lib/python3.4/site-packages/pysftp/__init__.py", line 71, in get_hostkey 
    raise SSHException("No hostkey for host %s found." % host) 
paramiko.ssh_exception.SSHException: No hostkey for host my_host found. 

使用Python 3.4.3

+1

也許你可以試試['paramiko'](http://docs.paramiko.org/en/2.4/api/sftp.html#module-paramiko.sftp) – mhawke

+0

的確,根據mhawke和Martin的指示,我使用paramiko。 我的另一個問題是主機名未由paramiko解決。 現在我直接使用IP地址。 如果時間允許,我會進一步調查。 – Tsachi

沙发
0
1

SFTP和FTP兩種完全沒有關係編輯協議。

您無法使用FTP協議(ftplib)連接到SFTP服務器。

pysftp/Paramiko應該工作。如果沒有,請發佈一個關於pysftp/Paramiko的新問題,並提供更多詳細信息。

+0

謝謝Martin。 pysftp不起作用 - 我編輯了我的問題以包含pysftp代碼+異常。 – Tsachi

+1

你有兩個問題。一個關於爲SFTP選擇庫(我已經回答)。還有一個關於pysftp不起作用的問題。這是一個不同的問題。考慮另外一個問題。並確保您指定了您正在使用的Paramiko和pysftp的版本。 –

0
votes
answers
31 views
+10

使用WinSCP將超過180天的文件上傳到SFTP服務器?

0

我的要求是我想通過使用批處理文件將Windows機器上的所有本地文件上傳到SFTP服務器,這些文件比180天要早。應該上傳所有子目錄中的相關文件,在SFTP服務器上重新創建本地文件夾目錄結構。使用WinSCP將超過180天的文件上傳到SFTP服務器?

以下是我必須通過在命令提示符上運行以上載SFTP服務器中的Windows Server文件來嘗試的命令,它正在按預期運行 ,因爲我不知道如何使用時間值(180天)的條件,所以我已經嘗試沒有時間段的條件, 但我想通過創建一個批處理文件(使用WinSCP命令)自動執行此過程要上傳所有文件,包括180天以上的子文件夾。

@echo off 

set USERNAME=myusername 
set PASSWORD=mypassword 
winscp.com /script=script.txt 

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

script.txt的:

open [email protected] 
cd /logsarchive 
lcd D:Logs 
lcd WEBSERVER1 
cd WEBSERVER1 
exit 

任何示例/建議,將不勝感激。

+0

@MartinPrikryl:請檢查更新的問題,謝謝! –

+0

@MartinPrikryl:請檢查最新的問題,謝謝你的快速回復。 –

+0

對不起,實際上我只想移動這些文件,但它也應該創建本地文件夾目錄到SFTP服務器_(在第一次上傳/創建目錄後,我只想將文件上傳到SFTP中各個較舊的目錄中比180天)_希望這個清除需求。謝謝! –

沙发
0
0

要上傳的文件早於180天(同時仍再現服務器上的本地目錄結構)使用方法:

put * -filemask=<180D 

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

0
votes
answers
37 views
+10

老重複的數據包

-1

我發現這個問題在本書叫彼得大號Dordal計算機網絡的介紹,我遇到了這個問題,我發現它有點棘手:老重複的數據包

在TFTP協議:

如果客戶端在後續連接上更改其端口號,但服務器沒有,防止服務器發送的舊重複數據包被新客戶端接受?

如果服務器在後續連接上更改其端口號,但客戶端沒有,防止服務器發送的舊重複數據包被新客戶端接受?

http://intronetworks.cs.luc.edu/current/html/udp.html?highlight=cumulative#old-duplicate

沙发
0
0

TFTP不應該被用來當連接不是近乎完美(=本地,很少跳)。 UDP本身並不可靠,並且TFTP在這方面做得不夠好。

但是,這個例子有點假設。客戶端和服務器都可能使用OS選擇的臨時端口。重複數據包匹配的時間窗口非常小 - 路由器之間的隊列刷新時間 - 以及臨時端口號需要同時繞回兩端。

也就是說,TFTP只能用於安全無關緊要的短連接 - 如果有的話。有更多的現代替代方案可靠和安全的文件傳輸。