python实现批量文件上传

批量上传文件,到多个linux主机上面

在前面,我曾说过 Python 的批量执行linux 命令,具体可以点击这里查看,今天把上传文件的也贴上,个人写的,因为在工作中用到了。

用法呢,还是和之前的一样,唯一的区别就是没有 --cmd 的选项,而多了 --localfile--remotefile 选项,表示的是本地文件路径,也远程文件路径。可以使用查看帮助,来看一下,如下:

root@ba2df80873f0:~# python upload.py -h
Usage: batch_upload [options]
Options:
  -h, --help            show this help message and exit
  --ip=IPADDR           target host ip address
  --ipfile=IPFILE       ip list file
  --port=PORT           ssh port number
  --username=USERNAME   ssh user name
  --password=PASSWORD   ssh password
  --localfile=LOCALFILE
                        local path and file
  --remotefile=REMOTEFILE
                        target path and file
root@ba2df80873f0:~#

代码如下:

#!/usr/bin/python
# -- coding: utf-8 --

import paramiko
from optparse import OptionParser
from sys import argv


def put(ip, port, username, password, localfile, remotefile):
    for hosts in ip:
        try:
            t = paramiko.Transport((hosts, port))
            t.connect(username=username, password=password)
            sftp = paramiko.SFTPClient.from_transport(t)
            print "%s start upload file %s %s" % (hosts, localfile, remotefile)
            sftp.put(localfile, remotefile)
            t.close()
        except Exception, Msg:
            print Msg


if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option("--ip",
                      dest="ipaddr",
                      help="target host ip address"
                      )
    parser.add_option("--ipfile",
                      dest="ipfile",
                      help="ip list file"
                      )
    parser.add_option("--port",
                      dest="port",
                      help="ssh port number"
                      )
    parser.add_option("--username",
                      dest="username",
                      help="ssh user name"
                      )
    parser.add_option("--password",
                      dest="password",
                      help="ssh password"
                      )
    parser.add_option("--localfile",
                      dest="localfile",
                      help="local path and file"
                      )
    parser.add_option("--remotefile",
                      dest="remotefile",
                      help="target path and file"
                      )
    (options, args) = parser.parse_args()
    if "--ip" in argv and "--ipfile" in argv:
        print "Accept only one argument, use  --ip or --ipfile"
        exit(1)
    if options.ipaddr == None:
        ip_list = open(options.ipfile, "r")
        ip = ip_list.read().split("\n")[:-1]
        ip_list.close()

    if options.ipfile == None:
        ip_list = options.ipaddr
        ip = ip_list.split(",")

    port = int(options.port)
    username = options.username
    password = options.password
    localfile = options.localfile
    remotefile = options.remotefile

    put(ip, port, username, password, localfile, remotefile)

将代码复制,并保存到一个文件里,比如我的文件名是 upload.py

示例:

# 单个主机
python upload.py --ip 192.168.1.22 --port 22 --username root --password qq123.com --localfile /root/file.name --remotefile /root/new_file.name

# 多个主机
python upload.py --ip 192.168.1.22,192.168.7.19,192.168.10.189 --port 22 --username root --password qq123.com --localfile /root/file.name --remotefile /root/new_file.name

# 使用IP列表文件
python upload.py --ipfile /root/kvmip.txt --port 22 --username root --password qq123.com --localfile /root/file.name --remotefile /root/new_file.name

 

猜您喜欢
    4条评论
    • 0
      aaaa 回复

      你这个password 有没有文件类型的啊!

      • ainy 回复私信

        暂时没有,不过可以添加

      • ainy 回复私信

        代码里面没有这个功能,不过可以添加上,而且这个代码是单线程的,批量上传一些小文件可以,如果文件稍大一点,会比较慢

        • ainy 回复私信

          多线程的我已经弄好了,只是还没有写到博客上来