当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 历史记录功能

作者:精品下载站 日期:2024-12-14 13:06:56 浏览:14 分类:玩电脑

如何使用 PowerShell 历史记录功能


您是否在命令行中忘记了某个命令,或者您希望保存历史记录,PowerShell 历史记录可以帮助您!

在本教程中,了解如何运行先前的命令、导入和导出以及清除历史记录。读完本文后,您将不再需要仅仅依靠向上和向下箭头键来检索历史记录!

先决条件

要学习本教程,请确保您使用 Windows 10 上的 Windows PowerShell 或任何受支持平台上的 PowerShell 7.x。

检索命令历史记录

如果您曾经丢失过某个命令,您可能需要保存它以便以后查找。如果是这样,PowerShell 通过保存历史记录以便快速检索来节省时间。要查看保存的历史记录,PowerShell 具有 Get-History cmdlet。

在检索任何历史记录之前,您首先需要构建一些历史记录,因为历史记录会在每个控制台会话上重新启动。为此,请复制并运行以下代码以添加历史记录条目;任何代码都可以。命令需要在 Get-History 返回任何内容之前存在!

Get-Service -ServiceName 'BITS'
Get-Service | Where-Object -Property Name -Like "Microsoft*"
Get-Service | Where-Object -FilterScript {($_.Status -eq 'Running') -and ($_.StartType -eq 'Manual')}

现在您已经运行了一些命令(如下所示),您就有了可以使用的历史记录。

[玩转系统] 如何使用 PowerShell 历史记录功能

请注意敏感命令,其中可能包含不适合窥探的信息。例如,如果您不在代码中使用安全字符串,则密码或 API 机密等敏感信息将在历史文件中以纯文本形式可见!

现在使用Clear-Host命令来整理屏幕并进一步演示历史记录功能。

Clear-Host

[玩转系统] 如何使用 PowerShell 历史记录功能

清除屏幕并不意味着所有历史记录都消失了。要查找之前清除的命令,请点击向上↑向下↓箭头快速查看控制台主机的命令历史记录。

[玩转系统] 如何使用 PowerShell 历史记录功能

当查找您之前运行的单个命令时,使用向上和向下箭头非常有用。但是如果重新运行多个命令呢?在这种情况下,要显示完整的会话历史记录,请输入 Get-History 命令,如下所示,该命令显示以前运行的命令的列表。

如下所示,Get-History 不仅返回已运行的命令,还返回命令 ID 以及该命令执行所需的时间。命令ID稍后会派上用场。

Get-History

[玩转系统] 如何使用 PowerShell 历史记录功能

存储在 MaximumHistoryCount 变量中的最大默认历史记录条目为 4096。使用以下命令更改此值以允许最多 32767 个条目:Set-Variable MaximumHistoryCount 32767

默认情况下,Get-History cmdlet 不会返回所有对象属性。要返回所有对象属性,请将历史记录输出通过管道传送到 Select-Object cmdlet。将输出通过管道传输到 Select-Object cmdlet 将返回 StartExecutionTimeEndExecutionTime 属性,并引用这些属性来确定 Duration

Get-History | Select-Object -Property *

[玩转系统] 如何使用 PowerShell 历史记录功能

运行之前执行过的命令

现在您可以检索旧命令,这有什么用呢?大多数时候,PowerShell 用户需要执行这些命令。幸运的是,您无需复制/粘贴即可完成此操作。记住以前的命令或一系列命令可能很困难。要运行上一个命令,请执行 Invoke-History cmdlet。

如果您一直在跟踪,您的历史记录中将会有以前的 Get-Service 命令。如前所述,每个历史记录条目都有一个关联的 ID

也许您需要重新运行之前运行的 Get-Service 命令之一。在这种情况下,复制并运行以下代码以重新运行第二个历史记录条目,如下面的演示所示。

Invoke-History -Id 2

您的 ID 值可能需要根据您的个人命令历史记录进行更改。

ID 参数指定值 2Invoke-History cmdlet 会立即重新运行该命令,就像您直接键入该命令一样进入控制台。

[玩转系统] 如何使用 PowerShell 历史记录功能

除了数字之外,ID 参数还接受要匹配的模式。例如,运行 Invoke-History -Id 'Get-Service' 将查找以该值开头的所有历史记录条目。

导出 PowerShell 命令历史记录

经过长时间的工作后,您可能想要保存并导出命令。如果是这样,那么你很幸运。 PowerShell 几乎可以将任何内容导出到文本文件;命令历史也不例外。使用命令历史记录时,常见格式包括 CSV 或 XML。

保存您的 PowerShell 历史记录以供将来使用,如下所示。通过管道将 Get-History 传递到 Export-CSV cmdlet 允许您将历史记录条目保存到文件中。在此示例中,PowerShell 将文件保存到C:\Temp,但您可以将命令历史记录保存到任何位置。

Get-History | Export-CSV -Path 'C:\Temp\CommandHistory.Csv'

[玩转系统] 如何使用 PowerShell 历史记录功能

要将历史记录导出为 XML:Get-History | Export-CliXml -Path ‘C:\Temp\CommandHistory.xml’

清除命令历史记录

随着时间的推移,您的历史记录可能会变得混乱,或者您可能运行了带有敏感值的命令,该值现在已保存到历史记录中。无论哪种情况,您可能都希望从命令历史记录中删除这些条目。为此,请使用 Clear-History cmdlet 清除控制台历史记录。

默认情况下,Clear-History 命令会删除所有控制台历史记录。但是,如果您不想删除所有历史记录怎么办?在这种情况下,有选择地清除具有特定条目ID、指定计数条目或仅最新条目集的历史记录。

如果您不想输入或定位特定的条目集,请将通配符模式数组传递给 CommandLine 参数以删除所有匹配的命令。

Clear-History -CommandLine *Help*, *Syntax

还有另一种类型的历史记录,它通过 PSReadLine 模块保存到磁盘。 Clear-History cmdlet 仅清除当前内存中的控制台历史记录,但您可能还想清除所有已保存的磁盘历史记录条目。

要清除除上次运行命令之外的所有历史记录,请通过运行以下命令使用 PSReadline 方法:[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()

在清除磁盘历史记录之前,您必须找到它的保存位置。为此,请复制并运行以下命令以检索历史文件磁盘位置。

$History = (Get-PSReadLineOption).HistorySavePath
$History

[玩转系统] 如何使用 PowerShell 历史记录功能

默认的 PSReadLine Windows 路径存储在 HistorySavePath 变量中,为:%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

现在在记事本中打开历史文件,类似于下图所示。每个历史记录条目都添加在最后保存的命令下方。

[玩转系统] 如何使用 PowerShell 历史记录功能

现在您已经了解了历史文件中的位置和内容,请使用 Remove-Item cmdlet 删除历史文件,如下所示。

Remove-Item -Path $History -Verbose

[玩转系统] 如何使用 PowerShell 历史记录功能

运行另一个命令后,历史文件将重新生成。

导入命令历史记录

如果您打开了新的控制台会话或之前保存了一系列复杂的命令,您可能需要将它们导入到当前历史记录中。要将这些命令导入到当前的控制台历史记录中,请利用 Add-History 命令。

要导入以前的历史记录,您首先需要一个导出的历史记录文件。在上一节中,您在 CSV 文件中保存了一系列命令,也许您需要导入这些保存的命令。要导入以前的 CSV 文件并将历史记录条目添加到当前会话,请运行以下代码,并根据需要调整 CSV 路径。

$O$OldHistory = Import-Csv -Path 'C:\Temp\CommandHistory.Csv'
 
Add-History -InputObject $OldHistory -Passthru

如下所示,PowerShell 将之前的命令导入到控制台历史记录中,并使用 PassThru 参数显示它们。

并非所有命令都会返回传入的原始对象。通过添加某些 cmdlet 上可用的 PassThru 参数,可返回原始对象。

[玩转系统] 如何使用 PowerShell 历史记录功能

考虑安全性和 PowerShell 历史

尽管 PowerShell 历史很有用,但仍有一些安全注意事项需要注意。输入敏感命令时要小心,因为这些命令会保存到纯文本命令历史文件中,并接受审查。

假装你是一名“红队队员”。您想要对目标用户进行一些侦察。您可能对他们在正常一天中通过会话运行的命令、密码和 API 密钥感兴趣。

以下是您可以通过在 Notepad++ 中重新加载文本文件来实时查看目标历史文件的示例:

[玩转系统] 如何使用 PowerShell 历史记录功能

现在您有了目标正在使用的密码。只需查看其余的会话历史记录,您很可能会看到该密码的使用地点。

不要对你所看到的感到惊慌。了解你现在所知道的,你可以做出更好的决定。

您如何安全地处理秘密?通过使用 Get-Credential cmdlet 从磁盘或键盘输入检索凭据。通过使用 ConvertTo-SecureString cmdlet 转换为安全字符串来保护这些 API 密钥和其他机密。这两个 cmdlet 都不会在历史记录中显示秘密本身。 PowerShell Secrets Management 也是一个不错的选择。

在任何环境中,打开 ScriptBlock 和 Module 日志记录都是谨慎的做法。通过这种日志记录,PowerShell 对于攻击者来说是一个糟糕的选择,因为每次运行的代码都会被存储以供以后检索。

下一步是什么?

您现在应该知道 PowerShell 历史命令是如何工作的。现在,下次您丢失重要命令或需要保存会话历史记录时,您没有任何借口!

如果您需要清除除最后一次运行命令之外的所有历史记录,请通过运行使用 PSReadline 方法

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯