【问题标题】:Script to reboot multiple Macs over a network in AppleScript or PowerShell?在 AppleScript 或 PowerShell 中通过网络重新启动多台 Mac 的脚本?
【发布时间】:2015-04-23 16:28:29
【问题描述】:

我正在尝试编写一个脚本来重新启动一系列 IP 地址中的 Mac。通过 PowerShell 执行此操作是可行的,但该过程会等到每台机器重新启动后才会移动到下一台机器。我发现ssh'ing 进入每台机器并使用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 吗?

【问题讨论】:

    标签: macos powershell applescript powershell-core


    【解决方案1】:

    实际上,New-SSHSession-ComputerName 参数可以采用服务器集合,默认情况下会为所有服务器并行调用该命令,

    $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
    

    瞧!

    【讨论】:

      【解决方案2】:

      如果将其包装到工作流中,则可以将其作为并行处理:

      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

      【讨论】:

      • 请注意,工作流语法与“常规”PowerShell 语法略有不同,因此如果您只需要并行性,您可能希望使用 jobs 而不是工作流。
      • @AnsgarWiechers;同意。老实说,我根本不觉得工作流有用,我可能在这里遗漏了一些东西。我理论上可以想象在工作流中有用的唯一一件事是能够非常简单地安排事情并行运行,同时仍然保持一些顺序东西。
      【解决方案3】:

      您可以按照以下方式使用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" &
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-09
        • 2021-11-19
        • 2018-07-18
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-26
        相关资源
        最近更新 更多