我想用python web为什么不火写个web界面简单执行远程linux命令 web界面要能自由填写执行shell命令和脚本

共发布过11门课程
后邀请好友注册,您和好友将分别获赠3个实验豆!
0% Complete
加载中,精彩就在后面...
截取实验桌面
上传本地图片
因业务调整,日起购买的训练营课程服务标准将进行如下更新:
训练营课程不再提供24小时内的答疑服务和会员赠送,课程教师及助教将会不定期回复讨论区的提问。训练营课程价格也进行了相应调整。
注:日之前购买的训练营服务内容不受影响,仍然可以继续享有课程有效期内的答疑服务。具体服务内容以购买时页面显示服务内容为准。
好的,知道了
购买成功!课程上线时,您将收到邮件提醒
一个实验正在进行,是否停止它,开始新实验?
为了让评估结果更加准确,请注意以下操作:
完成实验后点击「停止实验」按钮
将代码提交到代码库
尽可能详尽的撰写实验报告
尽可能在实验操作的关键步骤截图
尽可能减少无用操作
尽可能高效的利用内存/CPU资源
评估课还在不断完善中,我们真挚希望你能通过我们提供的这个平台,找到更好的发展机会。
该实验默认环境
Shell 是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,是用户使用 Linux 内核的桥梁。本次课程将通过 Python 来实现一个简易的 Shell。
您有 -1 个实验豆,激活本课程需要消耗 0 个实验豆!
激活后可不限次数学习本课。
获取验证码
选择支付方式
下次自动登录
注册表示您已经同意我们的使用ansible批量管理远程服务器 - 文章 - 伯乐在线
& 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器
本地需要管理远程的一批服务器,主要执行以下任务:
1) 将本地的文件复制到远端所有服务器;
2) 需要在远程服务器中执行一个个命令;
远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问;
比如在.bashrc中定义$app_path=/opt/app/bin
最终选择ansible,使用这个自动化运维工具可以满足我的需求;
下面介绍下对于我这种场景需要使用的ansible的主要模块;
关于ansible是什么以及安装配置请自行百度;
使用copy模块,可以将本地文件一键复制到远程服务器;
-a后跟上参数,参数中指定本地文件和远端路径;
ansible myservers -m copy -a "src=/opt/app/bin/transfer.tar dest=~/"
ansible myservers -m copy -a "src=/opt/app/bin/transfer.tar dest=~/"
ansible通过ssh登录到远程服务器后,并不执行.bash_profile来设置用户自定义的环境变量;如果我们需要管理的目标服务器的路径不同,就不能直接写绝对路径,也不能写变量替换的路径;
比如:针对服务器A的目标复制路径为 /opt/app/user1/bin ,服务器B的目标复制路径为/opt/app/user2/ 这两个路径在各自的服务器中的路径变量都设置为$ 但在copy模块中,我们不能直接使用dest = $bin/;
路径设置一般放在.bashrc /.bash_profile文件,但ansible模块登录后并不加载这两个文件;
解决方法:
针对这种情况,可以将dest路径设置为~/,都复制到用户目录,后续再通过远程脚本处理;
远程批量命令
需要在远程执行一个个命令来管理远程服务器;
远程执行命令的模块有command、shell、scripts、以及raw模块;
command模块
command模块为ansible默认模块,不指定-m参数时,使用的就是command模块;
comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 “”, “|”, and “&”操作都不可以,当然,也就不支持管道;
示例:显示远程路径:
ansible myservers
10.6.143.38 | success | rc=0 &&
/home/rduser
10.6.143.53 | success | rc=0 &&
/home/rduser
10.6.143.37 | success | rc=0 &&
/home/rduser
ansible myservers&&-a 'pwd'10.6.143.38 | success | rc=0 &&/home/rduser10.6.143.53 | success | rc=0 &&/home/rduser10.6.143.37 | success | rc=0 &&/home/rduser
缺点:不支持管道,就没法批量执行命令;
使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用;
但是我们自己定义在.bashrc/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
对shell模块的使用可以分成两块:
1) 如果待执行的语句少,可以直接写在一句话中:
ansible myservers
-a ". .bash_ps -fe |grep sa_q" -m shell
ansible myservers&&-a ". .bash_ps -fe |grep sa_q" -m shell
2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;
scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
ansible myservers
-m script -a "/opt/app/target.sh"
ansible myservers&&-m script -a "/opt/app/target.sh"
这里是命令模块的官方文档:
批量执行playbooks
远程批量命令执行的另外一种方式是用playbooks;
这里是playbooks的官方文档:
这里有ansible的playbooks示例:
在python中使用ansbile API
以上执行ansible模块的方式都是在命令行中直接调用,如果对返回结果需要进一步处理,可以在程序中通过API调用的方式来使用ansible模块:
比如,以上在命令行中调用scripts的模块的方式在API中调用:
import ansible.runner
results = ansible.runner.Runner(
pattern='myservers', forks=5,
module_name='script', module_args='/opt/app/target.sh',
import ansible.runnerresults = ansible.runner.Runner(pattern='myservers', forks=5,module_name='script', module_args='/opt/app/target.sh',).run()
这里是官方给出的一个详细示例,直接运行一次,将result全部打印出来,会有直观的了解:
#!/usr/bin/python
import ansible.runner
import sys
# construct the ansible runner and execute on all hosts
results = ansible.runner.Runner(
pattern='*', forks=10,
module_name='command', module_args='/usr/bin/uptime',
if results is None:
print "No hosts found"
sys.exit(1)
print "UP ***********"
for (hostname, result) in results['contacted'].items():
if not 'failed' in result:
print "%s &&& %s" % (hostname, result['stdout'])
print "FAILED *******"
for (hostname, result) in results['contacted'].items():
if 'failed' in result:
print "%s &&& %s" % (hostname, result['msg'])
print "DOWN *********"
for (hostname, result) in results['dark'].items():
print "%s &&& %s" % (hostname, result)
12345678910111213141516171819202122232425262728
#!/usr/bin/python&import ansible.runnerimport sys&# construct the ansible runner and execute on all hostsresults = ansible.runner.Runner(pattern='*', forks=10,module_name='command', module_args='/usr/bin/uptime',).run()&if results is None:&& print "No hosts found"&& sys.exit(1)&print "UP ***********"for (hostname, result) in results['contacted'].items():if not 'failed' in result:print "%s &&& %s" % (hostname, result['stdout'])&print "FAILED *******"for (hostname, result) in results['contacted'].items():if 'failed' in result:print "%s &&& %s" % (hostname, result['msg'])&print "DOWN *********"for (hostname, result) in results['dark'].items():print "%s &&& %s" % (hostname, result)
API设计详见:
可能感兴趣的话题
ansible在windows客户端上执行java命令总是报heap错误,lz是否遇到过
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线Python执行Linux系统命令的4种方法
转载 & & 投稿:junjie
这篇文章主要介绍了Python执行Linux系统命令的4种方法,即在Python脚本中调用Shell命令,需要的朋友可以参考下
(1) os.system
仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息
system(command) -& exit_status
Execute the command (a string) in a subshell.
如果再命令行下执行,结果直接打印出来
&&& os.system('ls')
.CHM&& bash&&&&& document&&& media&&&&& py-django&& video
11.wmv&&&&&&&&&&& books&&&& downloads&& Pictures& python
all-&&&&& Desktop&& Examples&&& project&&& tools
(2) os.popen
该方法不但执行命令还返回执行后的信息对象
popen(command [, mode='r' [, bufsize]]) -& pipe
Open a pipe to/from a command returning a file object.
&&&tmp = os.popen('ls *.py').readlines()
['dump_db_pickle.py ',
'dump_db_pickle_recs.py ',
'dump_db_shelve.py ',
'initdata.py ',
'__init__.py ',
'make_db_pickle.py ',
'make_db_pickle_recs.py ',
'make_db_shelve.py ',
'peopleinteract_query.py ',
'reader.py ',
'testargv.py ',
'teststreams.py ',
'update_db_pickle.py ',
'writer.py ']
好处在于:将返回的结果赋于一变量,便于程序的处理。
(3)& 使用模块 subprocess
&&& import subprocess
&&& subprocess.call(["cmd", "arg1", "arg2"],shell=True)
获取返回和输出:
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
&&& print line,
retval = p.wait()
(4)& 使用模块 commands
&&& import commands
&&& dir(commands)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', 'getoutput', 'getstatus','getstatusoutput', 'mk2arg', 'mkarg']
&&& commands.getoutput("date")
'Wed Jun 10 19:39:57 CST 2009'
&&& commands.getstatusoutput("date")
(0, 'Wed Jun 10 19:40:41 CST 2009')
注意: 当执行命令的参数或者返回中包含了中文文字,那么建议使用subprocess,如果使用os.popen则会出现下面的错误:
Traceback (most recent call last):
& File "./test1.py", line 56, inmain()
& File "./test1.py", line 45, in main
&&& fax.sendFax()
& File "./mailfax/Fax.py", line 13, in sendFax
&&& os.popen(cmd)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-52: ordinal not inrange(128)
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 python web为什么不火 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信