在linux中远程执行操做咱们会用到ssh,在windows中远程操做须要依赖一个服务“WinRM”,只须要在接收远程命令的机器上配置WinRM服务便可(默认是开启的)。html
要使用远程操做以前,首先确认WinRM服务是否开启linux
若WinRM服务时关闭状态,必须使用管理员身份运行命令行工具,才能够执行如下操做windows
以上都是查看或开启本机的远程服务,若要查看被远程的主机是否开启远程操做服务,应使用“Test-WSMan”命令缓存
还差最后一步,也是很重要的一步,在被远程机器上和远程机上添加信任后才可执行远程操做,记住使用管理员权限才可生效,当执行第一条命令时,会弹出一个对话框,选择“YES”,第一题命令的做用是在本机添加运行任何机器远程操做,第二个命令重启WinRM远程服务,从新读取配置后才会生效。服务器
Set-Item wsman:\localhost\client\trustedhosts *
Restart-Service WinRM
以上准备工做算是作完了,接下来先远程链接到一台服务器,而后作一些简单的操做,与ssh相似。ssh
PS C:> Enter-PSSession -ComputerName hostname -Credential username
hostname是要链接的服务器名称,username是登陆服务器的用户名。工具
此时会弹出一个对话框,输入密码后便可登陆成功,控制台会变成如下内容,表面已经链接到了远程服务器,此时就能够操做远程服务器了。学习
[hostname]: PS C:\Users\username\Documents> #可以使用exit退出当前远程链接
使用上面的方法存在一些问题,那就是须要交互输入密码,若要将远程操做写入脚本,实现起来就会很是的困难,接下来介绍一种免交互的方法。spa
首先须要建立远程链接的认证信息命令行
$username = "\Administrator"
$password = "123456"
$pw = ConvertTo-SecureString -AsPlainText $Password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$pw
此时$cred就是链接远程服务器的认证,接下使用“Invoke-Command”命令便可实现远程操做,-ScriptBlock后面跟的就是要在远程服务器执行的命令。
Invoke-Command -ComputerName hostname -ScriptBlock{ ls c:\} -Credential $cred
若须要执行脚本,能够用下-FilePath参数,须要注意的是a.ps1(做用是建立c:\a\b目录)在本机的当前目录下,并不是是远程机器上的。
PS C:\> Invoke-Command -ComputerName hostname -FilePath .\a.ps1 -Credential $cred
Directory: C:\a
Mode LastWriteTime Length Name PSComputerName
---- ------------- ------ ---- --------------
d----- 12/11/2018 6:24 PM b hostname
Invoke-Command执行的命令中含有本地变量
PS C:\> $a = "a"
PS C:\> $b = ".txt"
PS C:\> Invoke-Command -ComputerName hostname -ScriptBlock{ param($a,$b) echo "1" > c:\a\$a$b} -ArgumentList $a,$b -Credential $Cred
上面的命令做用是:在远程主机上“c:\a”目录下将“1”覆盖到a.txt文件中。
批量操做多台服务器,(前提条件是天天服务器的用户名密码一致)
$username = "\Administrator"
$password = "123456"
$pw = ConvertTo-SecureString -AsPlainText $Password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$pw
如今远程操做其余服务器
Invoke-Command -ComputerName db1 -ScriptBlock{ ls c:\ } -Credential $cred
Invoke-Command -ComputerName db2 -ScriptBlock{ ls c:\ } -Credential $cred
Invoke-Command -ComputerName db3 -ScriptBlock{ ls c:\ } -Credential $cred
都可以执行成功,不带-Credential $cred认证参数,照样能够执行成功,我估计的缘由是Invoke-Command执行成功后,将Credential的认证信息缓存到了某个地方,这是再次执行时就去找上次使用的认证去链接,只是估计!。
Invoke-Command -ComputerName db4 -ScriptBlock{ ls c:\ }
Invoke-Command -ComputerName db5 -ScriptBlock{ ls c:\ }
将本机c:\a文件拷贝到目标主机查下c:\b,参数-Recurse是递归拷贝,针对目录拷贝使用,单个文件不须要。
$Session = new-PSSession -ComputerName hostname
Copy-Item -Path c:\a -Destination C:\b -ToSession $Session -Recurse
将目标主机上的某个文件拷贝到本地,使用的参数是 FromSession
$Session = new-PSSession -ComputerName hostname
Copy-Item -Path c:\a -Destination C:\b -FromSession $Session -Recurse
有些时候,咱们须要并行执行某些任务来提升执行的效率,在本地有Start-job命令能够实现,Invoke-Command命令一样提供了这样的功能,那就是使用-AsJob参数,能够将须要远程执行的命令放在远程机的后台执行。
Invoke-Command -ComputerName "hostname" -AsJob { sleep 100 } -Credential $Cred
这条命令就能够在远程机上后台执行一个“sleep 100”的命令。可是执行这条命令实际须要的时间要比100s长。
以上从三个方面学习了invoke-command命令,远程执行、远程拷贝文件、远程后台执行任务,学会以上3个用法常规操做就不会存在什么问题了。
参考:https://www.cnblogs.com/sparkdev/p/7200004.html