在 AppleScript 或 PowerShell 中通过网络重启多台 Mac 的脚本?
Script to reboot multiple Macs over a network in AppleScript or PowerShell?
我正在尝试编写一个脚本来重启 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 吗?
如果将其包装到工作流中,则可以将其并行处理:
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.$_"})
您可以按照以下方式使用 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" &
实际上,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
瞧瞧!
我正在尝试编写一个脚本来重启 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 吗?
如果将其包装到工作流中,则可以将其并行处理:
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.$_"})
您可以按照以下方式使用 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" &
实际上,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
瞧瞧!