paramiko上傳文件
1. python中paramiko模塊 sftp上傳後文件內容每行都是^M結尾,請教怎麼解決
^M好像是回車的意思。
如果你這個是文本文件,那你用replace函數先把^M這個字元替換成空格,然後在strip一下就沒了。
2. 如何進行伺服器的批量管理以及python 的paramiko的模塊
最近對公司的通道機賬號進行改造管理,全面的更加深入的理解了公司賬號管理的架構。(註:基本上所有的機器上的ssh不能使用,只有部分機器能夠使用。為了安全的角度考慮,安裝的不是公版的ssh,而都是定製版的ssh,(限制了機器上的源IP地址即可))。
自動化管理伺服器,有兩種方法:
第一種方法,是我們公司自己開發的(伺服器大概是3W台),基本上伺服器之間不能夠通過ssh互相連通,只能是一台伺服器能夠連到所有的伺服器上,這台伺服器我們稱之為通道機(也叫堡壘機),當我們想登某台伺服器的時候,需要先登上這台通道機,然後經過一系列的驗證之後,就能自動的登上你要登到的伺服器上。
並且我們自己開發了一套叫做通道機API的方式,來管理3W台伺服器,比如收集各台伺服器的信息等。其這個API的本質就是使用的是POST的方式將命令post到目標機上,然後返回結果進行處理即可。這是一個大概的思想。
第二種方法,就是使用ssh的協議進行管理,使用python的paramiko來進行管理,下面會進行介紹:
有一些想法,可以使用python的paramiko模塊來進行管理名下伺服器,前提是能夠ssh到各個伺服器上。
下面對這個paramiko的模塊做個簡單的介紹和分享:
1.簡介:
paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程伺服器的連接。
由於使用的是python這樣的能夠跨平台運行的語言,所以所有python支持的平台,如linux, Solaris, BSD, MacOS X,Windows等,paramiko都可以支持,因此,如果
需要使用SSH從一個平台連接到另外一個平台,進行一系列的操作時,paramiko是最佳工具之一。
舉個常見的例子,現有這樣的需求:需要使用windows客戶端,遠程連接到Linux伺服器,查看上面的日誌狀態,大家通常使用的方法會是:
1:用telnet
2:用PUTTY
3:用WinSCP
4:用XManager等…
那現在如果需求又增加一條,要從伺服器上下載文件,該怎麼辦?那常用的辦法可能會是:
1:Linux上安裝FTP並配置
2:Linux上安裝Sambe並配置…
大家會發現,常見的解決方法都會需要對遠程伺服器必要的配置,如果遠程伺服器只有一兩台還好說,如果有N台,還需要逐台進行配置,或者需要使用代碼進行以上操作
時,上面的辦法就不太方便了。
使用paramiko可以很好的解決以上問題,比起前面的方法,它僅需要在本地上安裝相應的軟體(python以及PyCrypto),對遠程伺服器沒有配置要求,對於連接多台服
務器,進行復雜的連接操作特別有幫助。
2.使用的幾個簡單的案例:
下面是兩種使用paramiko連接到linux伺服器的代碼:
方式一:
1 ssh = paramiko.SSHClient()2 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())3 ssh.connect("IP地址",22,"用戶名","密碼")
上面的第二行代碼的作用是允許連接不在know_hosts文件中的主機。
方式二:
1 t = paramiko.Transport(("IP地址","埠"))2 t.connect(username = 「用戶名」, password = 「口令」)3 如果連接遠程主機需要提供密鑰,上面第二行代碼可改成:4 t.connect(username = 「用戶名」, password = 「口令」, hostkey=」密鑰」)
3.一些簡單的例子:
如果linux伺服器開放了22埠,在windows端,我們可以使用paramiko遠程連接到該伺服器,並執行任意命令,然後通過 print或其它方式得到該結果。
3. python遠程操作windows伺服器有什麼方案
可以使用python+paramiko。 paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程伺服器的連接。 使用paramiko可以很好的解決以下問題: 需要使用windows客戶端, 遠程連接到Linux伺服器,查看上面的日誌狀態,批量配置遠程伺服器,文件上傳,文件下載等 具體可以參考: http://www.paramiko.org/
4. 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伺服器並讓其開機自動執行。
5. python 使用paramiko模塊ssh遠程linux伺服器,linux伺服器已經使用公鑰認證免密碼登陸,請問怎麼寫。
實例1:
#!/usr/bin/python
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("172.16.1.3",22,"root","333333")
stdin, stdout, stderr = ssh.exec_command("df -h")
print stdout.readlines()
ssh.close()
實例2:
#!/usr/bin/python
import paramiko
t = paramiko.Transport(("172.16.1.2",322))
t.connect(username = "root", password = "222222")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath='/opt/test.txt'
localpath='/opt/test.txt'
sftp.put(localpath,remotepath)
#sftp.get(remotepath, localpath)
t.close()