本文目錄一覽:
- 1、python 實現ssh的執行遠端命令和scp的不同機器文件傳輸功能
- 2、如何把python代碼上傳到服務器上
- 3、python 怎麼實現兩台服務器上批量複製文件
- 4、如何使用python在局域網上傳送文件
- 5、python里tcpip通訊客戶端和服務器端傳文件怎麼寫?
- 6、怎麼用http上傳一個文件到服務器 python
python 實現ssh的執行遠端命令和scp的不同機器文件傳輸功能
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn(‘ssh root@%s “%s”‘ % (ip, cmd))
try:
i = ssh.expect([‘password:’, ‘continue connecting (yes/no)?’], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline(‘yes\n’)
ssh.expect(‘password: ‘)
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ssh.read()
print r
ret = 0
except pexpect.EOF:
print “EOF”
ssh.close()
ret = -1
except pexpect.TIMEOUT:
print “TIMEOUT”
ssh.close()
ret = -2
return ret
利用pexpect模塊我們可以做很多事情,由於他提供了自動交互功能,因此我們可以實現ftp,telnet,ssh,scp等的自動登錄,還是比較實用的。根據上面的代碼相信讀者已經知道怎麼實現了(python就是那麼簡單!)。
用
上面的代碼去完成任務還是比較費時間的,因為程序要等待自動交互出現,另外ubuntu用ssh連接就是比較慢,要進行一系列的驗證,這樣才體現出ssh
的安全。我們要提高效率,在最短的時間內完成。後來我發現了python裡面的paramiko模塊,用這個實現ssh登錄更加簡單。看下面的代碼:
複製代碼 代碼如下:
#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
for m in cmd:
stdin, stdout, stderr = ssh.exec_command(m)
# stdin.write(“Y”) #簡單交互,輸入 ‘Y’
out = stdout.readlines()
#屏幕輸出
for o in out:
print o,
print ‘%s\tOK\n’%(ip)
ssh.close()
except :
print ‘%s\tError\n’%(ip)
if __name__==’__main__’:
cmd = [‘cal’,’echo hello!’]#你要執行的命令列表
username = “” #用戶名
passwd = “” #密碼
threads = [] #多線程
print “Begin……”
for i in range(1,254):
ip = ‘192.168.1.’+str(i)
a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
a.start()
上面的程序還是有些技巧的:
1.
利用多線程,同時發出登錄請求,同時去連接電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個一個挨着執行的話,大約5~10秒鐘才能對一台電
腦操作完,具體時間要根據命令的來決定,如果是軟件安裝或者卸載時間要更長一些。這樣下來怎麼也要一二十分鐘,用多線程後就快多了,所有的命令執行完用了
不到2分鐘!
2.最好用root用戶登錄,因為安裝或者卸載軟件的時候如果用普通用戶又會提示輸入密碼,這樣又多了一次交互,處理起來就比較麻
煩!安裝軟件時apt-get install xxx
最好加上“-y”參數,因為有時安裝或刪除軟件時提示是否繼續安裝或卸載,這又是一次自動交互!加上那個參數後就沒有人機交互了。
3. 循環時循環所有ip,因為計算機的ip是路由器自動分配的,保險起見,最好全部都執行,保證沒有遺漏的主機
4.遠端執行命令時如果有交互,可以這樣用 stdin.write(“Y”)來完成交互,“Y”就是輸入“Y”。
5.把所有的命令放到一個列表裡面,遍歷列表可以依次執行列表裡面的命令
6.為了更好的進行控制,最好在電腦上提前把root用戶打開,裝好ssh服務器並讓其開機自動執行。
如何把python代碼上傳到服務器上
使用pip或easy_install可以管理和安裝python的package包,實際上它們都是從pypi服務器中搜索和下載package的。目前在pypi服務器上,有超過三萬多個package,同時還允許我們將自己的代碼也上傳發布到服務器上。這樣,世界上的所有人都能使用pip或easy_install來下載使用我們的代碼了。
具體步驟如下:
首先創建項目文件和setup文件。
目錄文件結構如下:
project/
simpletest/
__init__.py
test.py
setup.py
假設項目文件只有一個simpletest包,裡面有一個test.py文件。
創建的setup.py文件格式大致如下,其中,install_requires字段可以列出依賴的包信息,用戶使用pip或easy_install安裝時會自動下載依賴的包。詳細的格式參考文檔。
from setuptools import setup, find_packages
setup(
name = ‘simpletest’,
version = ‘0.0.1’,
keywords = (‘simple’, ‘test’),
description = ‘just a simple test’,
license = ‘MIT License’,
install_requires = [‘simplejson=1.1’],
author = ‘yjx’,
author_email = ‘not@all.com’,
packages = find_packages(),
platforms = ‘any’,
)
然後將代碼打包。
打包只需要執行python
setup.py xxx命令即可,其中xxx是打包格式的選項,如下:
# 以下所有生成文件將在當前路徑下 dist 目錄中
python setup.py bdist_egg # 生成easy_install支持的格式
python setup.py sdist # 生成pip支持的格式,下文以此為例
發布到pypi。
發布到pypi首先需要註冊一個賬號,然後進行如下兩步:
註冊package。輸入python setup.py register。
上傳文件。輸入python setup.py sdist upload。
安裝測試
上傳成功後,就可以使用pip來下載安裝了。
另外,pypi還有一個測試服務器,可以在這個測試服務器上做測試,測試的時候需要給命令指定額外的”-r”或”-i”選項,如python
setup.py register -r “”,python
setup.py sdist upload -r “”,pip
install -i “” simpletest。
發布到測試服務器的時候,建議在linux或cygwin中發布,如果是在windows中,參考文檔,需要生成.pypirc文件
python 怎麼實現兩台服務器上批量複製文件
1、把excel里文件名那一列複製,粘進一個空白的文本文件,命名為filelist.txt,上傳到服務器。
2、在服務器上使用腳本導出,python腳本 fileCp.py 。
代碼示例:
#! python
#coding:utf-8
##!/usr/bin/python
# Filename : fileCp.py
import sys
import os
import shutil
fileList=’filelist.txt’
targetDir=’files’
filedir = open(fileList)
line = filedir.readline()
log = open(‘running.log’,’w’)
while line:
line = line.strip(‘\n’);
basename = os.path.basename(line)
exists = os.path.exists(line)
if exists :
print ‘copy ‘+line+’ to ‘+os.getcwd()+’/’+targetDir+’/’+basename
log.write(‘copy ‘+line+’ to ‘+os.getcwd()+’/’+targetDir+’/’+basename+’\r\n’)
shutil.copy(line,targetDir+’/’+basename)
else:
print line+’ not exists’
log.write(line+’ not exists’+’\r\n’)
line = filedir.readline()
log.close()
如何使用python在局域網上傳送文件
可以使用python做HTTP服務器,然後就可以傳文件了
首先確保裝了Python,Python內置了一個簡單的HTTP服務器,只需要在命令行下面敲一行命令,一個HTTP服務器就起來了:
python -m SimpleHTTPServer 80
後面的80端口是可選的,不填會採用缺省端口8000。注意,這會將當前所在的文件夾設置為默認的Web目錄,試着在瀏覽器敲入本機地址:
如果當前文件夾有index.html文件,會默認顯示該文件,否則,會以文件列表的形式顯示目錄下所有文件。這樣已經實現了最基本的文件分享的目的,你可以做成一個腳本,再建立一個快捷方式,就可以很方便的啟動文件分享了。如果有更多需求,完全可以根據自己需要定製,具體的請參見官方文檔SimpleHTTPServer,或者直接看源碼。我拷貝一段,方便參考:
import SimpleHTTPServer
import SocketServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer((“”, PORT), Handler)
print “serving at port”, PORT
httpd.serve_forever()
python里tcpip通訊客戶端和服務器端傳文件怎麼寫?
最簡單的,先傳一個定長的字節表示文件的長度,然後開傳。其實ftp就是標準的tcp/ip下傳文件的應用啊。
怎麼用http上傳一個文件到服務器 python
首先,標準HTTP協議對上傳文件等表單的定義在這裡:wwwietforg/rfc/rfc1867txt 大概數據包格式如下:
單文件:
Content-type: multipart/form-data, boundary=AaB03x
–AaB03x
content-disposition: form-data; name=”field1″
Joe Blow
–AaB03x
content-disposition: form-data; name=”pics”; filename=”file1.txt”
Content-Type: text/plain
… contents of file1.txt …
–AaB03x–
多文件:
Content-type: multipart/form-data, boundary=AaB03x
–AaB03x
content-disposition: form-data; name=”field1″
Joe Blow
–AaB03x
content-disposition: form-data; name=”pics”
Content-type: multipart/mixed, boundary=BbC04y
–BbC04y
Content-disposition: attachment; filename=”file1.txt”
其次,python上傳文件的幾種方法:
1 自己封裝HTTP的POST數據包:http//stackoverflowcom/questions/680305/using-multipartposthandler-to-post-form-data-with-python
import httplibimport mimetypesdef post_multipart(host, selector, fields, files): content_type, body = encode_multipart_formdata(fields, files) h = httplib.HTTP(host) h.putrequest(‘POST’, selector) h.putheader(‘content-type’, content_type) h.putheader(‘content-length’, str(len(body))) h.endheaders() h.send(body) errcode, errmsg, headers = h.getreply() return h.file.read() def encode_multipart_formdata(fields, files): LIMIT = ‘———-lImIt_of_THE_fIle_eW_$’ CRLF = ‘\r\n’ L = [] for (key, value) in fields: L.append(‘–‘ + LIMIT) L.append(‘Content-Disposition: form-data; name=”%s”‘ % key) L.append(”) L.append(value) for (key, filename, value) in files:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/244882.html