{"id":858,"date":"2021-09-07T14:20:09","date_gmt":"2021-09-07T06:20:09","guid":{"rendered":"http:\/\/www.wccass.com\/?p=858"},"modified":"2021-09-07T14:20:13","modified_gmt":"2021-09-07T06:20:13","slug":"python%e5%b8%b8%e7%94%a8%e5%ba%93","status":"publish","type":"post","link":"https:\/\/blog.tongyunli.top\/?p=858","title":{"rendered":"python\u5e38\u7528\u5e93"},"content":{"rendered":"\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#python\">\u4f20\u667a\u64ad\u5ba2python\u5b66\u79d1<\/a><ul><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#pexpect\">pexpect<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#fabric\">fabric<\/a><ul><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#_1\">\u5b89\u88c5<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#_2\">\u5165\u95e8\u793a\u4f8b<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#fabric_1\">fabric\u5e38\u7528\u53c2\u6570<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#fabricapi\">fabric\u5e38\u7528API<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#fabric_2\">fabric\u5168\u5c40\u5c5e\u6027\u8bbe\u5b9a<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#1\">\u793a\u4f8b1\uff1a\u52a8\u6001\u83b7\u53d6\u8fdc\u7a0b\u76ee\u5f55\u5217\u8868<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#2\">\u793a\u4f8b2\uff1a\u4e0a\u4f20\u6587\u4ef6\u5e76\u6267\u884c<\/a><\/li><li><a href=\"http:\/\/127.0.0.1:51004\/view\/40#_3\">\u4ee3\u7801\u81ea\u52a8\u5316\u90e8\u7f72<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python\">\u4f20\u667a\u64ad\u5ba2python\u5b66\u79d1<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">http:\/\/www.itcast.cn\/subject\/pythonzly\/index.shtml\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pexpect\">pexpect<\/h3>\n\n\n\n<p>Pexpect \u662f Don Libes \u7684 Expect \u8bed\u8a00\u7684\u4e00\u4e2a Python \u5b9e\u73b0\uff0c\u662f\u4e00\u4e2a\u7528\u6765\u542f\u52a8\u5b50\u7a0b\u5e8f\uff0c\u5e76\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u5bf9\u7a0b\u5e8f\u8f93\u51fa\u505a\u51fa\u7279\u5b9a\u54cd\u5e94\uff0c\u4ee5\u6b64\u5b9e\u73b0\u4e0e\u5176\u81ea\u52a8\u4ea4\u4e92\u7684 Python \u6a21\u5757\u3002 Pexpect \u7684\u4f7f\u7528\u8303\u56f4\u5f88\u5e7f\uff0c\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u4e0e ssh\u3001ftp \u3001telnet \u7b49\u7a0b\u5e8f\u7684\u81ea\u52a8\u4ea4\u4e92\uff1b\u53ef\u4ee5\u7528\u6765\u81ea\u52a8\u590d\u5236\u8f6f\u4ef6\u5b89\u88c5\u5305\u5e76\u5728\u4e0d\u540c\u673a\u5668\u81ea\u52a8\u5b89\u88c5\uff1b\u8fd8\u53ef\u4ee5\u7528\u6765\u5b9e\u73b0\u8f6f\u4ef6\u6d4b\u8bd5\u4e2d\u4e0e\u547d\u4ee4\u884c\u4ea4\u4e92\u7684\u81ea\u52a8\u5316\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import pexpect\nimport sys\n\nchild <strong>=<\/strong> pexpect<strong>.<\/strong>spawn('ssh std20@123.57.211.212')\nchild<strong>.<\/strong>logfile <strong>=<\/strong> sys<strong>.<\/strong>stdout\n<em>#fout = file('mylog.txt', 'w')<\/em>\n<em>#child.logfile = fout<\/em>\nchild<strong>.<\/strong>expect('password:')\nchild<strong>.<\/strong>sendline('std20')\nchild<strong>.<\/strong>expect('std20.*')\nchild<strong>.<\/strong>sendline('ls \/')\nchild<strong>.<\/strong>expect('std20.*')\nchild<strong>.<\/strong>sendline('exit')\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><em>#coding=utf_8<\/em>\n\nfrom pexpect import pxssh\nimport sys\n\ns <strong>=<\/strong> pxssh<strong>.<\/strong>pxssh()\ns<strong>.<\/strong>logfile <strong>=<\/strong> sys<strong>.<\/strong>stdout\nhostname <strong>=<\/strong> '123.57.211.212'\nusername <strong>=<\/strong> 'std20'\npassword <strong>=<\/strong> 'std20'\ns<strong>.<\/strong>login(hostname, username, password)\ns<strong>.<\/strong>sendline('ls \/')\ns<strong>.<\/strong>prompt()  <em>#\u5339\u914d\u7cfb\u7edf\u63d0\u793a\u7b26<\/em>\ns<strong>.<\/strong>sendline('whoami')\ns<strong>.<\/strong>prompt()  \ns<strong>.<\/strong>logout()\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fabric\">fabric<\/h3>\n\n\n\n<p>\u9879\u76ee\u53d1\u5e03\u548c\u8fd0\u7ef4\u7684\u5de5\u4f5c\u76f8\u5f53\u673a\u68b0\uff0c\u9891\u7387\u8fd8\u86ee\u9ad8\uff0c\u5bfc\u81f4\u65f6\u95f4\u6d6a\u8d39\u5728\u6572\u5927\u91cf\u91cd\u590d\u7684\u547d\u4ee4\u4e0a\u3002<\/p>\n\n\n\n<p>\u4fee\u590dbug\u4ec0\u4e48\u7684\uff0c\u6d4b\u8bd5\uff0c\u63d0\u4ea4\u7248\u672c\u5e93(2\u5206\u949f)\uff0cssh\u5230\u6d4b\u8bd5\u73af\u5883pull\u90e8\u7f72\uff082\u5206\u949f\uff09\uff0crsync\u5230\u7ebf\u4e0a\u673a\u5668A,B,C,D,E\uff081\u5206\u949f\uff09\uff0c\u5206\u522bssh\u5230ABCDE\u4e94\u53f0\u673a\u5668\uff0c\u9010\u4e00\u91cd\u542f(8-10\u5206\u949f) = 13-15\u5206\u949f<\/p>\n\n\n\n<p>\u5176\u4e2d\u90c1\u95f7\u7684\u662f\uff0c\u6bcf\u6b21\u64cd\u4f5c\u90fd\u662f\u76f8\u540c\u7684\uff0c\u547d\u4ee4\u4e00\u6837\uff0c\u8981\u547d\u7684\u662f\u5728\u591a\u4e2a\u673a\u5668\u4e0a\uff0c\u5f88\u96be\u5728\u672c\u673a\u4e00\u4e2a\u811a\u672c\u641e\u5b9a\uff0c\u4e3b\u8981\u65f6\u95f4\u90fd\u6d6a\u8d39\u5728ssh\uff0c\u6572\u547d\u4ee4\u4e0a\u4e86\uff0c\u5199\u6210\u811a\u672c\uff0c\u5b8c\u5168\u53ef\u4ee5\u4e00\u952e\u6267\u884c\uff0c\u82b1\u4e24\u5206\u949f\u770b\u4e0b\u6267\u884c\u7ed3\u679c\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"_1\">\u5b89\u88c5<\/h4>\n\n\n\n<p>pip install fabric<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"_2\">\u5165\u95e8\u793a\u4f8b<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><em>#fabfile.py<\/em>\nfrom fabric.api import run\n\n<strong>def<\/strong> <strong>host_type<\/strong>():\n    run('uname -s')\n<\/pre>\n\n\n\n<p>\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">itcast@ubuntu:~\/tmp\/fab$ fab -H 127.0.0.1 host_type\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> Executing task 'host_type'\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> run: uname -s\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> Login password <strong>for<\/strong> 'itcast': \n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> out: Linux\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> out: \n\n\nDone.\nDisconnecting from 127.0.0.1... <strong>done<\/strong>.\nitcast@ubuntu:~\/tmp\/fab$ fab -H 127.0.0.1 host_type\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> Executing task 'host_type'\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> run: uname -s\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> Login password <strong>for<\/strong> 'itcast': \n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> out: Linux\n<strong>[<\/strong>127.0.0.1<strong>]<\/strong> out: \n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fabric_1\">fabric\u5e38\u7528\u53c2\u6570<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>-l : \u663e\u793a\u5b9a\u4e49\u597d\u7684\u4efb\u52a1\u51fd\u6570\u540d<\/li><li>-f : \u6307\u5b9afab\u5165\u53e3\u6587\u4ef6\uff0c\u9ed8\u8ba4\u5165\u53e3\u6587\u4ef6\u540d\u4e3afabfile.py<\/li><li>-H : \u6307\u5b9a\u76ee\u6807\u4e3b\u673a\uff0c\u591a\u53f0\u4e3b\u673a\u7528&#8221;,&#8221;\u53f7\u5206\u5272<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fabricapi\">fabric\u5e38\u7528API<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>local : \u6267\u884c\u672c\u5730\u547d\u4ee4\uff0c\u5982\uff1alocal(&#8216;uname -s&#8217;)<\/li><li>lcd : \u5207\u6362\u672c\u5730\u76ee\u5f55\uff0c\u5982\uff1alcd(&#8216;\/home&#8217;)<\/li><li>cd : \u5207\u6362\u8fdc\u7a0b\u76ee\u5f55\uff0c\u5982\uff1acd(&#8216;\/etc&#8217;)<\/li><li>run : \u6267\u884c\u8fdc\u7a0b\u547d\u4ee4\uff0c\u5982\uff1arun(&#8216;free -m&#8217;)<\/li><li>sudo : sudo\u65b9\u5f0f\u6267\u884c\u8fdc\u7a0b\u547d\u4ee4\uff0c\u5982\uff1asudo(&#8216;touch \/abc&#8217;)<\/li><li>put : \u4e0a\u4f20\u672c\u5730\u6587\u4ef6\u5230\u8fdc\u7a0b\u4e3b\u673a\uff0c\u5982\uff1aput(&#8216;\/hello&#8217;, &#8216;\/home\/itcast\/hello&#8217;)<\/li><li>get : \u4ece\u8fdc\u7a0b\u4e3b\u673a\u4e0b\u8f7d\u6587\u4ef6\u5230\u672c\u5730\uff0c\u5982\uff1aget(&#8216;\/home\/python\/world&#8217;, &#8216;\/home\/itcast\/world&#8217;)<\/li><li>reboot : \u91cd\u542f\u8fdc\u7a0b\u4e3b\u673a\uff0c\u5982\uff1areboot()<\/li><li>@task : \u51fd\u6570\u88c5\u9970\u5668\uff0c\u6807\u8bc6\u7684\u51fd\u6570\u4e3afab\u53ef\u8c03\u7528\u7684\uff0c\u975e\u6807\u8bb0\u7684\u5bf9fab\u4e0d\u53ef\u89c1\uff0c\u7eaf\u4e1a\u52a1\u903b\u8f91<\/li><li>@runs_once : \u51fd\u6570\u88c5\u9970\u5668\uff0c\u6807\u8bc6\u7684\u51fd\u6570\u53ea\u4f1a\u6267\u884c\u4e00\u6b21\uff0c\u4e0d\u53d7\u591a\u53f0\u4e3b\u673a\u5f71\u54cd<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fabric_2\">fabric\u5168\u5c40\u5c5e\u6027\u8bbe\u5b9a<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>env.host : \u5b9a\u4e49\u76ee\u6807\u4e3b\u673a\uff0c\u5982\uff1aenv.host=[&#8216;192.168.17.192&#8217;, &#8216;192.168.17.193&#8217;]<\/li><li>env.user : \u5b9a\u4e49\u7528\u6237\u540d\uff0c\u5982\uff1aenv.user=&#8221;root&#8221;<\/li><li>env.port : \u5b9a\u4e49\u76ee\u6807\u4e3b\u673a\u7aef\u53e3\uff0c\u9ed8\u8ba4\u4e3a22\uff0c\u5982\uff1aenv.port=&#8221;22&#8243;<\/li><li>env.password : \u5b9a\u4e49\u5bc6\u7801\uff0c\u5982\uff1aenv.password=&#8221;chuanzhi&#8221;<\/li><li>env.passwords : \u4e0d\u540c\u7684\u4e3b\u673a\u4e0d\u540c\u7684\u5bc6\u7801\uff0c\u5982\uff1aenv.passwords={&#8216;itcast@192.168.17.192:22&#8242;:&#8217;chuanzhi&#8217;, &#8216;itcast@192.168.17.193:22&#8242;:&#8217;python&#8217;}<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"1\">\u793a\u4f8b1\uff1a\u52a8\u6001\u83b7\u53d6\u8fdc\u7a0b\u76ee\u5f55\u5217\u8868<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">from fabric.api import <strong>*<\/strong>\n\nenv<strong>.<\/strong>hosts<strong>=<\/strong>['192.168.17.192', '192.168.17.193']\n<em>#env.password='python'<\/em>\nenv<strong>.<\/strong>passwords <strong>=<\/strong> {\n    'itcast@192.168.17.192:22':'python',\n    'itcast@192.168.17.193:22':'python',\n}\n\n@runs_once\n<strong>def<\/strong> <strong>input_raw<\/strong>():\n    <strong>return<\/strong> prompt(\"please input directory name:\", default<strong>=<\/strong>\"\/home\")\n\n<strong>def<\/strong> <strong>workask<\/strong>(dirname):\n    run('ls -l ' <strong>+<\/strong> dirname)\n\n@task\n<strong>def<\/strong> <strong>go<\/strong>():\n    <strong>print<\/strong>('start ...')\n    getdirname <strong>=<\/strong> input_raw()\n    workask(getdirname)\n    <strong>print<\/strong>('end ...')\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"2\">\u793a\u4f8b2\uff1a\u4e0a\u4f20\u6587\u4ef6\u5e76\u6267\u884c<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">from fabric.api import <strong>*<\/strong>\n\nenv<strong>.<\/strong>user <strong>=<\/strong> 'itcast'\nenv<strong>.<\/strong>hosts <strong>=<\/strong> ['192.168.17.192', '192.168.17.193']\nenv<strong>.<\/strong>password <strong>=<\/strong> 'python'\n\n@task\n@runs_once\n<strong>def<\/strong> <strong>tar_task<\/strong>():\n    <strong>with<\/strong> lcd('\/home\/itcast\/testdemo'):\n        local('tar zcvf demo.tar.gz demo.py')\n\n@task\n<strong>def<\/strong> <strong>put_task<\/strong>():\n    run('mkdir -p \/home\/itcast\/testdemo')\n    <strong>with<\/strong> cd('\/home\/itcast\/testdemo'):\n        put('\/home\/itcast\/testdemo\/demo.tar.gz', '\/home\/itcast\/testdemo\/demo.tar.gz')\n\n@task\n<strong>def<\/strong> <strong>check_task<\/strong>():\n    lmd5 <strong>=<\/strong> local('md5sum \/home\/itcast\/testdemo\/demo.tar.gz', capture<strong>=<\/strong>True)<strong>.<\/strong>split(' ')[0]\n    rmd5 <strong>=<\/strong> run('md5sum \/home\/itcast\/testdemo\/demo.tar.gz')<strong>.<\/strong>split(' ')[0]\n    <strong>if<\/strong> lmd5 <strong>==<\/strong> rmd5:\n        <strong>print<\/strong>('OK ...')\n    <strong>else<\/strong>:\n        <strong>print<\/strong>('ERROR ...')\n\n@task\n<strong>def<\/strong> <strong>run_task<\/strong>():\n    <strong>with<\/strong> cd('\/home\/itcast\/testdemo'):\n        run('tar zxvf demo.tar.gz')\n        run('python demo.py')\n\n@task\n<strong>def<\/strong> <strong>go<\/strong>():\n    tar_task()\n    put_task()\n    check_task()\n    run_task()\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"_3\">\u4ee3\u7801\u81ea\u52a8\u5316\u90e8\u7f72<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">from fabric.api import <strong>*<\/strong>\n\nenv<strong>.<\/strong>user <strong>=<\/strong> 'itcast'\nenv<strong>.<\/strong>hosts <strong>=<\/strong> ['192.168.17.192', '192.168.17.193']\nenv<strong>.<\/strong>password <strong>=<\/strong> 'python'\n\n@runs_once\n@task\n<strong>def<\/strong> <strong>local_update<\/strong>():\n    <strong>with<\/strong> lcd(\"\/home\/itcast\/tmp\/itcasthello\"):\n        local(\"git add -A\")\n        local(\"git commit -m 'update'\")\n        local(\"git pull origin master\")\n        local(\"git push origin master\")\n\n\n@task\n<strong>def<\/strong> <strong>remote_update<\/strong>():\n    <strong>with<\/strong> cd(\"\/home\/itcast\/tmp\/itcasthello\"):\n        run(\"git checkout master\")\n        run(\"git pull origin master\")\n\n@task\n<strong>def<\/strong> <strong>deploy<\/strong>():\n    local_update()\n    remote_update()<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4f20\u667a\u64ad\u5ba2python\u5b66\u79d1 pexpect fabric \u5b89\u88c5 \u5165\u95e8\u793a\u4f8b fabric\u5e38\u7528\u53c2\u6570 fabric\u5e38\u7528 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[22],"class_list":["post-858","post","type-post","status-publish","format-standard","hentry","tag-projk"],"_links":{"self":[{"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/posts\/858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=858"}],"version-history":[{"count":1,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/posts\/858\/revisions"}],"predecessor-version":[{"id":859,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=\/wp\/v2\/posts\/858\/revisions\/859"}],"wp:attachment":[{"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tongyunli.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}