【Linux】实现从Linux服务器获取windows文件

问题描述

​ 工作中需要从Linux服务器端去拿windows端的文件,linux服务器之间底层互传文件可以用scp很容易实现,但是

不同的操作系统之间实现文件传输,如,windows 和linux之间,又如何实现呢?

  • 子问题1

    • 描述:ftp ip 需要手动输入win ftpserver所在的win用户名密码后才可以执行抓取等操作,怎么能跳过手动的验证?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost AuthServer]# ftp 10.192.44.183
    Connected to 10.192.44.183 (10.192.44.183).
    220 Microsoft FTP Service
    Name (10.192.44.183:root): linhongxun
    331 Password required
    Password:
    230 User logged in.
    Remote system type is Windows_NT.
    ftp>

    • 解决方案:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #!/bin/sh
      ftp -n <<- EOF
      #win 端IP
      open ip
      #win 端用户名密码
      user username password
      #传输格式
      ascii(or bin)
      #操作
      put *(or get)
      #退出
      bye
      EOF

  • 子问题2:

解决方案
  • ftp:需要在windows端搭建ftpserver服务,在linux端安装ftp工具

  • scp

    工作中使用了ftp的方案,本文着重讲解ftp实现从Linux服务器获取windows文件

实现
windows 端搭建ftpserver

​ 问一下度娘,很简单,在这不耽误时间,推荐

Linux 端安装ftp工具
  • rpm包方式安装
  • yum 安装
    • yum list |grep ftp #查看可安装版本ftp
    • yum install ftp…
ftp实现抓取windows端的文件到指定路径

​ example:实现将win端的路径下文件cp 到linux端同一路径下:downloadjson.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#!/bin/sh
# $1 是第一个参数,即路径,执行的脚本为: ./downloadjson.sh /nas/test/test/DocumentVoucher.json
param1=`echo $1 |awk -F "DocumentVoucher" '{printf $1}'`
#echo ${param1}
ftp -n <<- EOF
open ftpserverip
user username password
ascii
cd ${param1}
get DocumentVoucher.json
bye
EOF
mkdir -p ${param1}
cp DocumentVoucher.json ${param1}


go语言执行脚本

​ 项目中,上层应用是http 协议,目的是请求到含有文件路径报文的同时,将文件下载到Linux服务器端,故在http协议绑定的接口函数里面实现了执行该脚本,逻辑如下

1
2
3
4
5
6
7
8
9
command := "./downloadjson.sh " + documentPath
fmt.Println(command)
cmd := exec.Command("/bin/sh", "-c", command)
bytes, err := cmd.Output()
if err != nil {
fmt.Println(err)
}
resp := string(bytes)
fmt.Println(resp)
常见问题FAQ
  1. ​ ftp ip 时连接超时

    1
    2
    3
    4
    [root@localhost AuthServer]# ftp 10.192.44.183
    ftp: connect: Connection timed out
    ftp>

    解决方案:关闭win端的防火墙

ftp常用指令
  1. 连接ftp服务器
      格式:

    1
    ftp [hostname| ip-address]

      a)在linux命令行下输入:

    1
    ftp 192.168.26.66

      b)服务器询问你用户名和口令,分别输入用户名和相应密码,待认证通过即可。

 2. 下载文件

  下载文件通常用get和mget这两条命令。
  a) get
  格式:

1
get [remote-file] [local-file]

  将文件从远端主机中传送至本地主机中.
  如要获取服务器上e:\rose\1.bmp,则

1
ftp> get /rose/1.bmp 1.bmp (回车)

  b) mget      
  格式:

1
mget [remote-files]

  从远端主机接收一批文件至本地主机.
  如要获取服务器上e:\rose\下的所有文件,则

1
2
ftp> cd /rose
ftp> mget *.* (回车)

  注意:文件都下载到了linux主机的当前目录下。比如,在 /root/yint下运行的ftp命令,则文件都下载到了/root/yint 下。

 3.上传文件

  a) put

1
格式:put local-file [remote-file]

  将本地一个文件传送至远端主机中.
  如要把本地的1.bmp传送到远端主机e:\rose,并改名为333.bmp

1
 ftp> put 1.bmp /rose/333.bmp (回车)

  b) mput

1
格式:mput local-files

  将本地主机中一批文件传送至远端主机.
  如要把本地当前目录下所有bmp文件上传到服务器e:\rose 下

1
2
ftp> cd /rose (回车)
ftp> mput *.bmp (回车)

  注意:上传文件都来自于主机的当前目录下。比如,在 /root/test下运行的ftp命令,则只有在/root/test下的文件linux才会 上传到服务器e:\rose 下。

 4. 断开连接
  bye:中断与服务器的连接。

  

1
   ftp> bye (回车)

scp常用

​ scp是安全的文件拷贝,基于ssh的登录

​ 假定你想把本地计算机/home下的一个名为a.tar.tz的文件拷贝到远程服务器192.168.0.2上的/home/tmp。而且你在远程服务器 上的帐号名为root。可以用这个命令:

1
scp /home/a.tar.tz root@192.168.0.2:/home/tmp/

​ 如果把文件从远程机器拷贝到本机当前目录用这个命令:

1
scp root@192.168.0.2:/home/a.tar.tz

​ 拷贝远程机器的整个目录下的文件

1
scp -r root@192.168.0.2:/home/* ./