在一些特殊情况下,我们不能向硬盘写入数据,但又要下载执行一个脚本,此时应如何做呢?
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
里也是能运行的。
假如你的命令是要给别人运行的,那么就给他后面这个样子的,保证在 powershell
和 cmd
中都能运行。
其实关于 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')"
参考文献
原文发布于:在内存中执行脚本-https://www.moonlightwatch.me/%E8%87%B4%E7%9F%A5%E4%BA%8E%E8%A1%8C/46.html