如何从 WSL 调用 PowerShell 脚本?
How to call PowerShell script from WSL?
在我的 Windows 目录中
C:\Users\jholmes\pichak\analytics
我有 运行1.ps1 代码。
我运行wsl.exe,现在我的密码是
/mnt/c/WINDOWS/system32
如何指向第一个路径并执行脚本?
有两种方法可以解决这个问题:
- 您可以将您的工作目录更改为您的 shell 脚本的目录并正常执行它。为此,请按照下列步骤操作:
- 安装相关驱动器
cd /mnt/c/
。
- 根据脚本路径更改目录。
- 这种方法更像是我为了方便而使用的 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
在我的 Windows 目录中
C:\Users\jholmes\pichak\analytics
我有 运行1.ps1 代码。 我运行wsl.exe,现在我的密码是
/mnt/c/WINDOWS/system32
如何指向第一个路径并执行脚本?
有两种方法可以解决这个问题:
- 您可以将您的工作目录更改为您的 shell 脚本的目录并正常执行它。为此,请按照下列步骤操作:
- 安装相关驱动器
cd /mnt/c/
。 - 根据脚本路径更改目录。
- 这种方法更像是我为了方便而使用的 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