摘要:是基于實現的遠程安全連接,支持認證及密鑰方法。利用函數發送到,通過函數獲取回顯。如下全局屬性設定對象的作用是定義的全局設定,支持多個屬性及自定義屬性。相比確實簡化了不少。出現異常時,發出警告,繼續執行,不要終止。
paramiko
paramiko是基于Python實現的SSH2遠程安全連接,支持認證及密鑰方法。可以實現遠程命令執行,文件傳輸,中間SSH代理等功能,相對于Pexpect,封裝層次更高。
pip install Paramiko
http://www.paramiko.org/
demo:https://github.com/paramiko/p...
如果在linux環境,還需安裝依賴:crypto,ecdsa,python3-devel。
paramiko包含兩個核心組件:SSHClient類,SFTPClient類
密鑰方式登錄import paramiko, base64,getpass paramiko.util.log_to_file("syslogin.log") #日志記錄 try: key=paramiko.RSAKey.from_private_key_file("pk_path") except paramiko.PasswordRequiredException: password = getpass.getpass("RSA key password: ") key = paramiko.RSAKey.from_private_key_file("pk_path", password) # 需要口令的私鑰 #key = paramiko.RSAKey(data=base64.decodestring("AAA...")) client = paramiko.SSHClient() # client.get_host_keys().add("ssh.example.com", "ssh-rsa", key) client.load_system_host_keys()#~/.ssh/known_hosts client.connect("ssh.example.com", 22,username="strongbad", password="thecheat",pkey=key) stdin, stdout, stderr = client.exec_command("ls") # stdin, stdout, stderr=ssh.exec_command("sudo su") # stdin.write("123456") for line in stdout: print("... " + line.strip(" ")) #使用send # cmds=["sudo su ", "cd /var/log ", "ls "] #利用send函數發送cmd到SSH server,添加" "做回車來執行shell命令。注意不同的情況,如果執行完telnet命令后,telnet的換行符是 # ssh=s.invoke_shell() #在SSH server端創建一個交互式的shell,且可以按自己的需求配置偽終端,可以在invoke_shell()函數中添加參數配置。 # for cmd in cmds: # time.sleep(1) # ssh.send(cmd) #利用send函數發送cmd到SSH server, # out = ssh.recv(1024) #.recv(bufsize)通過recv函數獲取回顯。 # print out client.close()用戶名密碼方式登錄
##################################################################################### import paramiko paramiko.util.log_to_file("syslogin.log") #日志記錄 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect("192.168.8.248", 22, username="root", password="password", timeout=4) stdin, stdout, stderr = client.exec_command("ls -l") #print(stdout.read()) for line in stdout.readlines(): print(line) client.close()
SSHClient方法參數說明
connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None)
pkey-私鑰類型
key_filename-str or list(str) 私鑰文件或其列表
timeout-以秒為單位
allow_agent-為False時禁用連接到SSH代理
look_for_keys-為False時禁用在~/.ssh中搜索私鑰文件
exec_command(command, bufsize=-1, timeout=None, get_pty=False)
command-字符串
load_system_host_keys(filename=None)指定公鑰文件,默認為~/.ssh/known_hosts
set_missing_host_key_policy(policy):設置連接的遠程主機沒有本地主機密鑰時的策略。目前支持三種: RejectPolicy (the default), AutoAddPolicy, WarningPolicy
上傳與下載文件#上傳批量文件到遠程主機 import paramiko import os import datetime hostname = "74.63.229.*" username = "root" password = "abc123" port = 22 local_dir = "/tmp/" remote_dir = "/tmp/test/" if __name__ == "__main__": # try: t = paramiko.Transport((hostname, port)) t.connect(username=username, password=password) sftp = paramiko.SFTPClient.from_transport(t) # files=sftp.listdir(dir_path) files = os.listdir(local_dir) for f in files: "#########################################" "Beginning to upload file %s " % datetime.datetime.now() "Uploading file:", os.path.join(local_dir, f) # sftp.get(os.path.join(dir_path,f),os.path.join(local_path,f)) sftp.put(os.path.join(local_dir, f), os.path.join(remote_dir, f)) "Upload file success %s " % datetime.datetime.now() t.close()
參考http://www.cnblogs.com/yangsh...
FabricFabric是基于paramiko的基礎上做了一層更高的封裝,操作起來更加方便。
官網:http://www.fabfile.org/index....
github:https://github.com/fabric/fab...
依賴crypto,paramiko.注意:fabric目前不支持Python3.不過github上有個支持py3的版本https://github.com/mathiasert...
在windows上的安裝:
1、安裝pycrypto.
有幾種方式安裝:
A.win7下安裝 MSVC2010,然后通過pip install pycrypto編譯安裝.
B.選擇別人編譯好的。
pycrypto-for-python-3-2及以下
pycrypto-for-python-3-4
2、支持Python3的版本安裝:pip install Fabric3
fabfile.py from fabric.api import run def host_type(): run("uname -s")
通過fab命令執行。-f指定文件,-H指定主機列表.
$ fab -f fabfile.py -H localhost,linuxbox host_type
fab參數說明:
-f 指定入口3文件
-g 指定網關設備(中轉,堡壘機)IP
-H 指定目標主機,多個用“,”分割
-P 異步運行多主機任務
-R 指定角色,以角色來區分機組
-t 設備連接超時時間,秒
-T 遠程主機命令執行超時時間,秒
-w 當命令執行失敗,發出警告,而不是終止任務。
當然我們完全可以在代碼中設定這些選項值,而無需在命令行指定。如下:全局屬性設定
env對象的作用是定義fabfile的全局設定,支持多個屬性及自定義屬性。
env.hosts,定義目標主機,列表
env.exclude_hosts,排除主機,列表
env.user,定義用戶名,str
env.port , 定義端口,str
env.password,定義密碼,str
env.passwords,字典,但是形式如下:env.passwords={ "root@192.168.1.21:22":"123456","root@192.168.2.21:22":"1234"}
env.key_filename=None 指定SSH密鑰文件,str or list
env.gateway指定網關設備(中轉,堡壘機)IP,str
env.roledefs定義角色分組,字典:env.roledefs={ "web":["192.168.1.21","192.168.1.23"],"db":["192.168.1.22","192.168.1.24"]}
env.parallel=False是否并發執行任務
env.path=" " 定義在run/sudo/local使用的$PATH環境變量
env.command_timeout=None
env.timeout=10
env.shell=“/bin/bash -l -c”
env.ssh_config_path=“$HOME/.ssh/config”
env.sudo_password=None
env.sudo_passwords={}
env.use_ssh_config=False
env.warn_only=False,如果為True,當操作遇到錯誤時,發出警告并繼續執行,而不是終止
env.變量名 自定義變量
例如:
@roles("web") def webtask(): run("/etc/init.d/nginx start") @roles("db") def dbtask(): run("/etc/init.d/mysql start") @roles("web","db") def publicstask(): run("uptime") def deploy(): execute(webtask) execute(dbtask) execute(publictask)
然后終端執行命令就可以了
$ fab deploy
命令行傳參:
def hello(name="world"): print("Hello %s!" % name) $ fab hello:name=Jeff Hello Jeff! Done.常用API
fabric.api模塊:
local,執行本地命令,如local("uname -s")
lcd,切換本地目錄,如lcd("/home")
cd,切換遠程目錄
run,執行遠程命令
sudo,sudo方式執行遠程命令
put,上傳文件到遠程主機 put("/home/aaa","/home/xby/aaa")
get,從遠程主機下載文件到本地 get("/opt/bbb","/home/bbb")
prompt,獲取用戶輸入
confirm,獲得提示信息確認,如confirm("Continue[Y/N]?")
reboot,重啟遠程主機,如reboot()
@task函數裝飾器,標識函數為fab可調用的,否則對fab不可見
@runs_once,標識函數只會執行一次,不受多臺主機影響。
@roles,表示函數執行時的主機角色
@parallel(pool_size=)
@with_settings()
fabric.contrib.console.confirm(question, default=True) 用戶輸入Y/n,返回True/False
示例1:查看本地與遠程主機信息:from fabric.api import * env.user="root" env.hosts=["192.168.1.2","192.168.1.3"] env.password="123" @runs_once #即使有多臺主機,但它只會執行一次 def local_task(): local("uname -a") def remote_task(): with cd("/data/logs"): #這個with的作用是讓后面的表達式語句繼承當前的狀態,實現"cd /data/logs && ls -l"的效果。 run("ls -l") $ fab -f sample.py local_task $ fab -f sample.py remote_task示例2:動態獲取遠程目錄
from fabric.api import * from fabric.contrib.console import confirm env.user="root" env.hosts=["192.168.1.2","192.168.1.3"] env.password="123" @runs_once def input_raw(): return prompt("please input dir name:",default="/home") def worktask(dirname): run("ls -l "+dirname) @task def go(): dirname=input_raw() worktask(dirname)示例3:網關模式文件上傳與執行
其實只要定義好env.gateway的ip就行了。相比paramiko確實簡化了不少。
from fabric.api import * from fabric.contrib.console import confirm from fabric.context_managers import * env.user="root" env.hosts=["192.168.1.2","192.168.1.3"] env.password="123" env.gateway="192.168.22.2" lpath="/home/install/lnmp.tar.gz" rpath="/tmp/install" @task def put_task(): run("mkdir -p /tmp/install") with settings(warn_only=True): #put出現異常時,發出警告,繼續執行,不要終止。 result=put(lpath,rpath) #上傳 if result.failed and not confirm("put failed,continue[Y/N]?"): abort("Aborting") @task def run_task(): with cd("/tmp/install"): run("tar -zxvf lnmp.tar.gz") with cd("lnmp"): run("./install.sh") @task go(): put_task() run_task()多彩輸出
fabric.colors.blue(text, bold=False)
fabric.colors.cyan(text, bold=False)
fabric.colors.green(text, bold=False)
fabric.colors.magenta(text, bold=False)
fabric.colors.red(text, bold=False)
fabric.colors.white(text, bold=False)
fabric.colors.yellow(text, bold=False)
from fabric.colors import red, green print(red("This sentence is red, except for " + green("these words, which are green") + "."))示例-Fabric部署Flask應用
示例1:它可以把當前的源代碼上傳至服務器,并安裝到一個預先存在 的 virtual 環境:
from fabric.api import * # 使用遠程命令的用戶名 env.user = "appuser" # 執行命令的服務器 env.hosts = ["server1.example.com", "server2.example.com"] def pack(): # 創建一個新的分發源,格式為 tar 壓縮包 local("python setup.py sdist --formats=gztar", capture=False) def deploy(): # 定義分發版本的名稱和版本號 dist = local("python setup.py --fullname", capture=True).strip() # 把 tar 壓縮包格式的源代碼上傳到服務器的臨時文件夾 put("dist/%s.tar.gz" % dist, "/tmp/yourapplication.tar.gz") # 創建一個用于解壓縮的文件夾,并進入該文件夾 run("mkdir /tmp/yourapplication") with cd("/tmp/yourapplication"): run("tar xzf /tmp/yourapplication.tar.gz") # 現在使用 virtual 環境的 Python 解釋器來安裝包 run("/var/www/yourapplication/env/bin/python setup.py install") # 安裝完成,刪除文件夾 run("rm -rf /tmp/yourapplication /tmp/yourapplication.tar.gz") # 最后 touch .wsgi 文件,讓 mod_wsgi 觸發應用重載 run("touch /var/www/yourapplication.wsgi")
參考:<
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44217.html
摘要:子程序執行將在新進程中完成。要在上執行子程序,該類將使用該函數。如果是字符串,則字符串指定要通過執行的命令。如果是任何其他負值,則表示完全緩沖。它用于通過網絡進行系統管理和應用程序部署。 showImg(https://segmentfault.com/img/remote/1460000018833620); 來源 | 愿碼(ChainDesk.CN)內容編輯 愿碼Slogan |...
摘要:自動化部署最近因為工作需要學習了把這幾天所學的東西做了個總結,和大家分享一下什么是能干什么是新出現的自動化運維工具,基于開發,集合了眾多運維工具的優點,實現了批量系統配置批量程序部署批量運行命令等功能。 ansible自動化部署 最近因為工作需要學習了ansible,把這幾天所學的東西做了個總結,和大家分享一下: 1、什么是ansible?ansible能干什么? ansible是新出...
摘要:背景在下安裝的時候,總是安裝不成功,在執行命令的時候,總是會拋出錯誤。解決方案安裝替代系統默認的再安裝包系統默認自帶的版本是下載安裝包在的官網下載頁面下載的源碼包。在下安裝就省事很多。附上執行簡單部署的一份代碼例子,僅供參考。 背景 在Centos6.3下安裝fabric的時候,總是安裝不成功,在執行fab命令的時候,總是會拋出錯誤。 Traceback (most recent ...
摘要:是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,值得一說的是,和內部的遠程管理就是使用的來現實。 paramiko paramiko是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。 1、下載安裝 pycrypto,由于 paramiko 模塊內部...
閱讀 1226·2023-04-25 15:53
閱讀 2101·2021-11-19 09:40
閱讀 3488·2021-10-11 10:59
閱讀 2066·2019-08-30 15:55
閱讀 1955·2019-08-30 15:54
閱讀 2293·2019-08-29 13:03
閱讀 2754·2019-08-28 18:17
閱讀 1510·2019-08-27 10:51