1. 程式人生 > >python小白之paramiko(1)

python小白之paramiko(1)

python paramiko

樓主python小白一枚,無任何編程經驗。近期研究python自動化運維技術與最佳實踐,今天在看paramiko模塊,依葫蘆畫瓢,實現了兩個小程序,分享如下!


首先,簡單介紹下paramiko這個模塊。paramiko是基於python實現的SSH2遠程安全連接、支持認證及密鑰方式,實現遠程命令執行,文件傳輸,中間ssh代理等,相對Pexpect,封裝的層次更高,更貼近SSH協議的功能。


安裝的話,采用pip安裝即可,指令很簡單:pip install paramiko

當然,前提需要配置好pip。


廢話不多說,上代碼:

1、示例1:

該代碼讀取當前目錄下commands.txt(該文件記錄需要執行的命令)文件的內容,並進行處理,返回命令行列表,然後在main()函數中直接調用paramiko模塊相關方法,順次執行文件中的命令,並打印出輸出結果。

[root@cenos paramiko]# more simple1.py
#!/usr/bin/python

import sys
import os
import paramiko

def get_cmds(fp=‘commands.txt‘):
if os.path.isfile(fp) and os.access(fp,os.R_OK):
f = open(fp,‘rb‘)
lines = f.readlines()
f.close()

cmds = map(lambda x:x.rstrip(),lines)
return cmds

else:
sys.exit()
return None


def main():
if len(sys.argv) == 4:
host = sys.argv[1]
user = sys.argv[2]
passwd = sys.argv[3]
else:
print "Usage:%s host user passwd"%(sys.argv[0])
sys.exit()


paramiko.util.log_to_file(‘syslogin.log‘)
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=host,username=user,password = passwd)
cmds = get_cmds()
for cmd in cmds:
stdin,stdout,stderr = ssh.exec_command(cmd)
print stdout.read()

ssh.close()


if __name__ == "__main__":
main()



在該示例中,commands.txt文件的內容如下(可以根據自己實際需要將命令寫入這個文件即可,無需修改原始代碼):

[root@cenos paramiko]# more commands.txt
free -m
uptime
uname -a
df -h
who


指令結果如下:

[root@cenos paramiko]# ./simple1.py
Usage:./simple1.py host user passwd #遠程server的主機名,用戶名,密碼通過命令行參數輸入,此處未給定,直接輸出了用法提示。

[root@cenos paramiko]# ./simple1.py 192.168.0.200 root 123456
total used free shared buff/cache available
Mem: 984 96 733 6 154 728
Swap: 3967 0 3967

18:33:17 up 1 day, 4:38, 1 user, load average: 0.00, 0.01, 0.05

Linux admin-node 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 36G 1.4G 34G 4% /
devtmpfs 482M 0 482M 0% /dev
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 493M 6.8M 486M 2% /run
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
tmpfs 99M 0 99M 0% /run/user/0

root tty1 2017-10-16 09:09


該例子比較簡單,如果需要在多臺服務器上同時執行指令,可以把遠程主機信息通過字典的格式存入列表,通過循環順次執行。此處不再贅述,樓主自己也沒有碼相關的代碼。


2、示例2:

該代碼首先篩選出給定目錄下(含子目錄)後綴為.py的所有文件,並將文件名稱存入列表;然後通過tar_files函數將文件打包,最後通過put_files函數將打包文件上傳到遠端服務器,而put_files函數使用了paramiko的put方法。

[root@cenos paramiko]# more simple2.py
#!/usr/bin/python

import sys
import os
import tarfile
import datetime
import paramiko


def get_files(dir_path,files=[]):
for name in os.listdir(dir_path):
full_path = os.path.join(dir_path,name)
if os.path.isfile(full_path) and os.path.splitext(full_path)[1]==‘.py‘:
files.append(full_path)

if os.path.isdir(full_path):
get_files(full_path,files)

return files


def tar_files(files,dst):
if isinstance(files,list):
tar = tarfile.open(dst,‘w:gz‘)
for file in files:
tar.add(file)
tar.close()

else:
sys.exit()


def put_files(host,user,passwd,localpath,remotepath):
tran = paramiko.Transport((host,22))
tran.connect(username=user,password=passwd)
sftp = paramiko.SFTPClient.from_transport(tran)
sftp.put(localpath,remotepath)
tran.close()


def main():
try:
files = get_files(‘/root/python‘)
suffix = datetime.datetime.now().strftime("%Y%m%d%H%M")
dst = "/tmp/tar_%s.tar.gz"%(suffix)
tar_files(files,dst)
remotepath = dst
put_files(‘192.168.0.200‘,‘root‘,‘123456‘,dst,remotepath)

except Exception,e:
print str(e)
sys.exit()


if __name__ == "__main__":
main()


執行該腳本:

[root@cenos paramiko]# ./simple2.py

本端主機上的壓縮文件

[root@cenos tmp]# pwd
/tmp
[root@cenos tmp]# ls -al *.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 17:55 tar_201710201755.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 18:41 tar_201710201841.tar.gz
-r--r--r--. 1 root root 60654199 Sep 25 2016 VMwareTools-9.6.0-1294478.tar.gz


遠端主機上的壓縮文件:

[root@admin-node ~]# cd /tmp
[root@admin-node tmp]# ls -al *.tar.gz
-rw-r--r-- 1 root root 27179 Oct 16 11:40 tar_201710161140.tar.gz
-rw-r--r-- 1 root root 27179 Oct 16 12:14 tar_201710161214.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 17:55 tar_201710201755.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 18:41 tar_201710201841.tar.gz


完美實現文件的壓縮和上傳,哈哈!


今天僅僅學習了paramiko的SSHClient和SFTPClient兩個類,也僅僅了解了最基本的使用方法,後續再學習,再更新,與各位共勉!

本文出自 “python小白進階之路” 博客,請務必保留此出處http://ccczlb611.blog.51cto.com/3588825/1974706

python小白之paramiko(1)