免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1152 | 回复: 2

[学习共享] 第12课:如何用ps,bash编写远程脚本 [复制链接]

论坛徽章:
0
发表于 2018-10-01 11:16 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-10-03 16:45 编辑



如何用ps,bash编写远程脚本

本帖目的:讲解通用的远程脚本编写技术,不限于powershell,bash,perl,pyton。




问:本地脚本和远程脚本有何区别?如何编写远程脚本?
答:
1 模块化。要把远程任务,分成n个独立的单元。
我们编写的本地脚本,有时候没分的这么清楚。但远程脚本,就要分成n个脚本,或n个函数。

2 每个单元让它返回$true,或false。
我们要改造本地脚本,人为让每个单元能返回$true,或false。
好让我们远程判断每个单元是否执行成功。

3 单元中的每个关键命令,都让它形成闭环。
本地脚本中的本地命令,大都是不报错即成功。
对于bash这就尴尬了,癌症无解。powershell有try+catch解决这问题。

4 每个单元让它,在远程机子上,写入log。log中带上日期时间。

5 每个单元,甚至!每个命令,必须!设定超时时间。

郭德纲说过,远程脚本,天生不老稳定的;)
本地脚本中的本地命令,大都不具备超时选项,远程运行时卡住就完了。
解决这个问题的最佳实践,是用多线程,和计时器。

把单元放入后台线程,然后主线程sleep n秒。超时就kill掉。
这是笨办法,好在简单,bash也能实现。但bash没有线程,只有进程。

powershell中,无需使用此笨办法。powershell有计时器。计时器是多线程的。
new一个计时器对象,并绑定代码后,你就可以-开始计时器-停止计时器-调整计时周期。

现在我们假定一个任务,前3次必然卡住超时,第4次必然成功。
那么我们只需在任务代码中,加上停止计时器的代码。并启动计时器即可。

则前3次运行到卡住代码,超时后被计时器重启。最后1次通过了卡住代码,运行了计时器停止代码。

这涉及到了两个线程之间传值,和控制。
而bash多进程,进程之间传值控制,不如线程之间方便。
所以说【多线程,计时器,是给命令加上超时选项的最佳实践】。

这里面还有一个细节。若你用ps的远程线程,来运行【代码单元】。可以起一个线程名,作为超时kill的标识符。
但是对于bash,就不能用进程名了。你需要一个标明进程是唯一的方法。
这种方法是有,但是又要加不少代码。在这里就不做展开详谈了。



python中也有计时器。perl我不知道,谁谈谈?

2018-10-01 帖子完毕,谢谢观看。



论坛徽章:
0
发表于 2018-11-02 11:52 |显示全部楼层
坛友也问了远程脚本问题。他在此问的 http://bbs.chinaunix.net/thread-4299233-1-1.html
由于也是远程问题,我就在此贴一并回复了。

对于此坛友,我想说的是:
有这么几个参数。

https://docs.microsoft.com/zh-cn ... d?view=powershell-6


invoke-command -ScriptBlock { $备份命令 } -Session $连接1  #传递本地代码块到远程,然后执行。
invoke-command -filepath /tmp/a.ps1 -Session $连接1  #传递本地脚本到远程。
invoke-command -ScriptBlock { /tmp/abc.ps1 } -Session $连接1  #运行保存在远程机子上的脚本。



问:powershell经过ssh,远程运行命令,比bash强在哪?
答:
=============linux远程命令 & ps远程命令 对比例子============
linux:
        ssh aaa@1.1.1.1 "以用户aaa权限执行的,命令xxx"
  
ps:
$a = 1
[scriptblock]$备份命令 =
{
        Get-Date
        $b = $using:a + 2 #引用客户机变量,需要用$using:
}

$连接1 = New-PSSession -HostName 1.1.1.1 -UserName root  #手动输入密码或用-KeyFilePath 选项
invoke-command -ScriptBlock { $备份命令 } -Session $连接1
============================================================
bash的远程命令,简单直接。就好像我左手这盘蛋炒饭,简单解饿,但是不够强。更适用于 简单远程命令场合。
你再看看我右手这盘盖饭好在哪?答:生菜垫底,萝卜雕花围边。
bash远程传递的是【字符串】,powershell传递的是【代码块】。特色是【对象垫底,大花括号围边】。

字符串传递到远程时,经常需要要转义。代码块不用。
代码块,支持多行,格式化,使代码美观。
变量名,函数名支持中文。

代码块中,支持引用客户端变量,一律加上【$using:】,即客户机上的【$a】,在服务器上叫【$using:a】
代码块中,支持引用服务器端变量,即服务器上的【$a】,在服务器还上叫【$a】
即使变量重名,两个$a也绝不会弄混。

ps用大花括号包围代码,不用单双引号,代码嵌套很容易。
而代码嵌套容易,使的ps的ssh远程,从server1(跳板机,堡垒机)经ssh进入server2,再ssh进入server3,进入33层ssh server执行命令很容易。而shell难。

远程代码天生不老稳定的,有时没反应,或卡住,或中途断了。遇到此情形,每行ps代码都可以在外面套上try-cacth,比shell更稳。

批量ssh,ps采用【多线程】,比bash用【多进程】快,时间准,省内存。

论坛徽章:
0
发表于 2018-11-02 12:05 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-11-02 13:03 编辑

invoke-command -filepath /tmp/a.ps1 -Session $连接1  #传递本地脚本到远程。
invoke-command -filepath /tmp/b.ps1 -Session $连接1  #传递本地脚本到远程。
invoke-command -filepath /tmp/c.ps1 -Session $连接1  #传递本地脚本到远程。
多个脚本,在远程运行就是这样。


由于是同一个 session,每个脚本可以共享$global变量。这和在本地一样。

另外,可以加上-asjob参数,变成后台线程。这样就可以实现并发。默认顺序执行。

比如a.ps1 在远程计算完毕后,产生n个变量。b,c,依赖a。那么a不应添加后台参数。
也就是说,a要顺序执行完后,bc才开始并发。那么给b,c添加-asjob参数即可。

结论:多脚本可以在远程共用变量。想不想并发,可以随心所欲。







您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP