前言
这是陪伴我很久的一个工具,2015-2017年,从0到1,看着它长大。
现在回头来看,用ps写运维工具的我就是第一人了。
tab1 文件传送
连接资讯
格式: ip|域名地址,主机标签,凭据文件名
ip|域名地址: server地址
主机标签: 根据需要进行定义,后面会对这个栏位进行模糊匹配达到选取主机的目的。
凭据文件名: powershell中可以对windows登录凭据进行加密存储成文件。后期登录时回直接引用该文件。
凭据文件
凭据文件实际是一个对象, 其中用户名为明文存储,密码为加密文件
文件上传概述
- 需要一个本地文件夹做本地路径,本地路径下的所有文件都会执行文件上传操作
- 需要设定目的路径,即为远端的服务器的实际路径的集合。因为对于每类业务主机路径不同,且每台也有差异,以匹配的方式进行处理。
- 需要设定目的服务器,对应上文中server.ini 的主机标签。
假设已有的server集合{ttcd1,ttcd2, tcd_fz, ttcd_uat, iia, iia2}, 此时若选择输入tcd_, 将有tcd_fz, ttcd_uat被匹配 - 文件上传原理:
a. server安装ps, 并且允许连接管理(enable-psremoting,默认端口5985 ,HTTP协议),修改默认端口新增防火墙设定。
b. 在打开server会话后,使用自定义的send-files():改写copy-files ,获取文件上传的必要参数。先修改原有的文件的后缀并加上时间标记,将本地新文件对原有文件进行覆盖。
c. 完成后关闭会话。
局部代码:
##建立server组会话
function new-serversessions
{
[CmdletBinding()]
[OutputType([int])]
Param
(
[parameter(position=1)][string[]]
$filter
)
$error.clear()
$filter = $filter.split(",")
if(Test-Path $home\server.ini){
$lists =Import-Csv -Path $home"\server.ini"
foreach($f in $filter){ #filter [i] 匹配server.ini
$list = $lists |where name -Match $f
if($list.count -ne 0){ #忽略密码步骤
# try{
"服务器连接中.."
foreach($l in $list){
$str = "$home\"+$l.pwd+".pwd"
$cre = import-clixml $str
new-pssession -computername $l.ip -credential $cre -Port 7891 -Name $l.type |out-null
# }
}
#catch [exception]
# {"密码文件错误"}
}
else { #指定机器输入密码
"请输入 【" + $f+"】密码"
new-pssession -computername $f -credential administrator -port 7891|out-null
}
}
}
else{
New-Item $home"\server.ini"
notepad $home"\server.ini"
"会话建立失败"
}
$resulttextbox.text = "连线结束"
$resulttextbox.lines += $error
$error.clear()
}
#####send-files 片段
process{
$s = Get-PSSession
if($s.count -eq 0){
"Exception"
}
foreach($session in $s){
foreach($srcc in $src){
$filename = ''
foreach($destt in $dest){
$result = Invoke-Command -Session $session -ScriptBlock{param([string]$destt)Test-Path -path $destt} -ArgumentList ($destt)
if($result){
if( $srcc -replace '(.*\\)*(.*\..*)','$2' -match '\.')
{
$filepath = $destt+($srcc -replace '(.*\\)*(.*\..*)','\$2')
$newfname =$destt+'\'+($srcc -replace '(.*\\)*(.*)','$2')+(get-date).ToString(".yyyyMMdd.HHmmss")
$isnewfile = Invoke-Command -Session $session -ScriptBlock{param([string]$filepath)Test-Path -path $filepath} -ArgumentList ($filepath)
if($isnewfile){
Invoke-Command -Session $session -ScriptBlock{param([string]$filepath,[string]$newfname)copy-item $filepath $newfname -Force} -ArgumentList ($filepath,$newfname)
}
}
try{
Copy-Item -path $srcc -destination $destt -ToSession $session -Recurse -Force
}
catch [exception]{}
$str = Invoke-Command -Session $session -ScriptBlock{param([string]$filepath)get-item $filepath |select name,lastaccesstime} -ArgumentList ($filepath)
$session.computername +":$srcc -> $destt done"
# $str|select pscomputername, name, lastaccesstime |Format-Table #检查文件更新时间
}
}
}#foreach session 结束遍历
}
}
##### 上传
$sbutton.add_click({
$error.Clear()
$resulttextbox.text = "检查文件列表.. "
$list = get-item C:\ps_upload\* |select fullname
$sendfilepage.Controls.Remove($sbutton)
$resulttextbox.text = "执行中... "
#传送文件 实时回显结果&提示
send-files $list.fullname $destbox.Text $destserver.Text |out-string -stream |foreach-object{$resulttextbox.lines = $resulttextbox.lines + $_; $powershellforms.update() }
$resulttextbox.lines= $resulttextbox.lines + "执行完成~~~~~~~~ ";$powershellforms.Refresh()
$sendfilepage.Controls.add($sbutton)
})