標籤:python paramiko
樓主python小白一枚,無任何編程經驗。近期研究python自動化營運技術與最佳實務,今天在看paramiko模組,依葫蘆畫瓢,實現了兩個小程式,分享如下!
首先,簡單介紹下paramiko這個模組。paramiko是基於python實現的SSH2遠程安全連線、支援認證及密鑰方式,實現遠程命令執行,檔案傳輸,中間ssh代理等,相對Pexpect,封裝的層次更高,更貼近SSH協議的功能。
安裝的話,採用pip安裝即可,指令很簡單:pip install paramiko
當然,前提需要配置好pip。
廢話不多說,上代碼:
1、樣本1:
該代碼讀取目前的目錄下commands.txt(該檔案記錄需要執行的命令)檔案的內容,並進行處理,返回命令列列表,然後在main()函數中直接調用paramiko模組相關方法,順次執行檔案中的命令,並列印出輸出結果。
[[email protected] 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檔案的內容如下(可以根據自己實際需要將命令寫入這個檔案即可,無需修改原始代碼):
[[email protected] paramiko]# more commands.txt
free -m
uptime
uname -a
df -h
who
指令結果如下:
[[email protected] paramiko]# ./simple1.py
Usage:./simple1.py host user passwd #遠程server的主機名稱,使用者名稱,密碼通過命令列參數輸入,此處未給定,直接輸出了用法提示。
[[email protected] 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方法。
[[email protected] 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()
執行該指令碼:
[[email protected] paramiko]# ./simple2.py
本端主機上的壓縮檔
[[email protected] tmp]# pwd
/tmp
[[email protected] 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
遠端主機上的壓縮檔:
[[email protected] ~]# cd /tmp
[[email protected] 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)