在一些特殊情况下,我们不能向硬盘写入数据,但又要下载执行一个脚本,此时应如何做呢?

curl配合管道符

使用 curl 配合 |,就能基本实现:不接触硬盘,从远端加载脚本并执行。

假设,在 https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh 处是一个 bash 脚本,内容如下:

echo "Hello World."

我们在本地执行:

curl https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh | bash

即可看到脚本执行的输出:Hello World.

如果,你不希望看到curl的输出,则可以给curl增加 -Ls 参数,使得curl不输出下载过程的信息。

curl -Ls https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh | bash

或者使用我曾介绍过的左尖括号配合小括号的方法:

bash <(curl -Ls https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.sh)

效果是一模一样的。

windows下执行远程Powershell脚本

基本思路

前述操作都是在Linux下的,同时也介绍下Windows中类似的操作。

首先思路是一样的,下载一个文件并直接执行。

我们会用到:

  • Net.WebClient 用于下载远程脚本
  • Invoke-Expression 用于执行脚本

假设,在 https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1 处是一个 powershell 脚本,内容如下:

echo "Hello World."

那么我们可以在本地powershell内按如下执行此脚本:

Invoke-Expression (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')

即可看到脚本执行的输出:Hello World.

有时候我们会在 cmd 中执行,那么就不能直接使用 Invoke-Expression 了。我们可以调用 powershell 执行上述命令:

powershell "Invoke-Expression (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"

就可以了。实际上,这个在 powershell 里也是能运行的。

假如你的命令是要给别人运行的,那么就给他后面这个样子的,保证在 powershellcmd 中都能运行。

其实关于 Invoke-Expression ,它可以简写为:IEX。上述命令就可以简化为:

powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"

这里不得不吐槽的是,网上文章各种抄,找资料的时候,这段命令各种少空格,显然是抄的时候不用心,自己都没执行过……

优化操作

如果你的脚本执行了什么危险操作,是会受到 powershell 默认执行策略的限制的。但是我们可以通过 -ExecutionPolicy 来设置当前会话的执行策略。

其取值可以是:

  • AllSigned
  • Bypass
  • Default
  • RemoteSigned
  • Restricted
  • Undefined
  • Unrestricted

我们可能会选择 Bypass ,这个策略是:

Nothing is blocked and there are no warnings or prompts.

就是啥都不管,随便执行,也不会有警告或者提示。

那么我们的命令就变成如下样子:

powershell -ExecutionPolicy Bypass "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"

鉴于 -ExecutionPolicy 可以简写为:-exec ,那么我们的命令即可简写为:

powershell -exec Bypass "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/moonlightwatch/gadgets/master/testscripts/hello.ps1')"

参考文献

About Execution Policies

最后编辑:2020年04月26日 ©著作权归作者所有

发表评论

正在加载 Emoji
×