4

我正在尝试编写一个脚本来重新启动一系列 IP 地址中的 Mac。通过 PowerShell 执行此操作是可行的,但该过程会等到每台机器重新启动,然后才会移动到下一台机器。我发现ssh进入每台机器并使用它重新启动它sudo shutdown -S shutdown -r now更快......它只是手动的。这是我到目前为止在 PowerShell 中的内容:

$serverRoot = "xxx.xxx.xxx."
$startVal = 100
$stopVal = 150

for ($i=$startVal; $i -le $stopVal; $i++)
{
    $User="username"
    $Password="password"

    $SecurePass=ConvertTo-SecureString -string $Password -AsPlainText -Force

    $Credential = New-Object System.Management.Automation.PSCredential $User, $SecurePass

    $session = New-SSHSession -ComputerName ($serverRoot + $i) -Credential $Credential  -AcceptKey
    Invoke-SSHCommand -SSHSession $session -Command "echo $Password | sudo -S shutdown -r now"   
    Remove-SSHSession -SSHSession $session -Verbose

}

有什么我可以添加的,它会立即在所有机器上启动重启过程吗?我应该使用 AppleScript 吗?

4

3 回答 3

3

Actually, the -ComputerName param for New-SSHSession can take a collection of servers, and will invoke the command in parallel for all servers by default,

$serverRoot = "xxx.xxx.xxx."
$startVal = 100
$stopVal = 150

# First start with creating a collection
$servers = @()
for ($i = $startVal; $i -le $stopVal; $i++)
{
    $servers += ($serverRoot + $i)
}

# Then, pass the $servers variable directly when creating the session
$session = New-SSHSession -ComputerName $servers -Credential $credential -AcceptKey

And voilá!

于 2015-04-23T19:45:39.463 回答
3

如果将其包装到工作流中,则可以将其踢成并行:

workflow Kill-All {
  param([string[]]$computers)

  foreach -parallel ($computer in $computers) {
      InlineScript {
         # Your powershell stuff.
      }
  }
}

Kill-All -Computers "132.134.123.1", "123.4.53.12"

或者,您可以将您的东西放入 bat 文件,并使用 powershell 调用 bat 文件。这样您就可以调用 bat 文件,而无需等待一个完成,然后再继续下一个。

正如 rae1 所回答的,最好的方法是直接调用 New-SSHSession,因为它默认支持并行化。

这是一个单行:

$sessions  = New-SSHSession -ComputerName (1..254 | %{ "xxx.xxx.xxx.$_"})

更多信息:http: //blogs.technet.com/b/heyscriptingguy/archive/2012/11/20/use-powershell-workflow-to-ping-computers-in-parallel.aspx

http://community.spiceworks.com/topic/341776-call-a-ps-script-from-another-and-don-t-wait-for-it-to-finish

于 2015-04-23T16:48:14.237 回答
0

您可以plink.exe按照以下方式使用(未经测试):

plink root@192.168.0.1-pw secret "shutdown -S shutdown -r now" &
plink root@192.168.0.2-pw secret "shutdown -S shutdown -r now" &
plink root@192.168.0.3-pw secret "shutdown -S shutdown -r now" &
plink root@192.168.0.4-pw secret "shutdown -S shutdown -r now" &

或者像这样

for %%a in (...) do plink root@%%a -pw secret "shutdown -S shutdown -r now" &
于 2015-04-23T17:29:35.673 回答