如何从 WSL 调用 PowerShell 脚本?

How to call PowerShell script from WSL?

在我的 Windows 目录中

C:\Users\jholmes\pichak\analytics

我有 运行1.ps1 代码。 我运行wsl.exe,现在我的密码是

   /mnt/c/WINDOWS/system32

如何指向第一个路径并执行脚本?

有两种方法可以解决这个问题:

  1. 您可以将您的工作目录更改为您的 shell 脚本的目录并正常执行它。为此,请按照下列步骤操作:
  • 安装相关驱动器cd /mnt/c/
  • 根据脚本路径更改目录。
  1. 这种方法更像是我为了方便而使用的 hack。我在 Windows 存储中创建了一个文件夹,其中存储了所有 Ubuntu WSL 相关文件。说,D:\Ubuntu。为避免每次打开WSL都改变工作目录,可以修改shell配置文件(bashrc、zshrc等),在最后加载相关目录。
  • 即,如果您使用 zsh 或相关配置文件,则在 ~/.zshrc 文件末尾添加 cd /mnt/d/Ubuntu/

当从 PowerShell 运行ning wsl(或 wsl.exe)时,它应该从您所在的同一目录开始PowerShell,只有它的 Linux 版本。例如,如果您在 C:\Users\jholmes\pichak\analytics 中使用 PowerShell,并且 运行 wsl,您 应该 最终进入 /mnt/c/Users/jholmes/pichak/analytics

如果没有,那么您的启动文件中可能已经有其他答案推荐的内容。您应该从 .bashrc.zshrc.profile.bash_profile 或您可能已编辑的任何其他启动文件中删除任何 cd 命令。

wsl 命令提供了一些方便的参数来指定起始目录:

  • wsl ~ 将从您的 Linux 用户的主目录开始(例如 /home/jholmes
  • wsl --cd c:\ 将从 /mnt/c 开始(或者任何等效的 Linux 目录与传入的 Windows 版本相同)。
  • wsl --cd \wsl$\<distroname>\etc 将从您的 /etc 目录(或您传入的任何 WSL 路径)开始。请注意,您需要指定您的分发名称(从 wsl -l -v 获得)。

假设您在 /home/jholmes,并且您想要执行 PowerShell 脚本 C:\Users\jholmes\pichak\analytics\run1.ps1。你首先需要将Windows路径翻译成Linux版本:

/mnt/c/Users/jholmes/pichak/analytics/run1.ps

然后您可以 运行 通过:

powershell.exe /mnt/c/Users/jholmes/pichak/analytics/run1.ps

也可以设置一个带有“shebang”行的 PowerShell 脚本来直接执行它。如果将以下内容添加为 run1.ps1 的第一行:

#!/usr/bin/env -S powershell.exe -ExecutionPolicy Bypass

然后通过 chmod +x /mnt/c/Users/jholmes/pichak/analytics/run1.ps 将其设置为可执行,然后它就变成了某种“命令”(从技术上讲,是“可执行脚本”),您只需键入命令行脚本:

/mnt/c/Users/jholmes/pichak/analytics/run1.ps

cd /mnt/c/Users/jholmes/pichak/analytics
./run1.ps

在 WSL2 中,使用 -File 选项对我有用:

powershell.exe -File path/to/script.ps1

这里有证据表明,通过WSL2,我们的软件可以对Powershell脚本进行加密和保护: See this picture:

并且它可以检测并杀死使用 fanotify 的进程,因为我们认为它可以被攻击者用来隐藏关键文件更改(它还可以找到并杀死 dtrace/strace/stap/bpftrace/debuggers 和打开 [=17= 的进程], /dev/mem, /proc/kcore, 和受保护进程' /proc/pid/mem 等): This picture shows the encrypted PowerShell script now can detect and kill possible attackers' processes