zoukankan      html  css  js  c++  java
  • 在内存中执行脚本

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

    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

    原文发布于:在内存中执行脚本-https://www.moonlightwatch.me/%E8%87%B4%E7%9F%A5%E4%BA%8E%E8%A1%8C/46.html

  • 相关阅读:
    windows版本nginx帮助文档
    angular渲染超链接bug
    ionic踩过的一些坑
    ionic项目中使用自定义图标打包出现错误-broken import
    ionic项目中使用自定义图标
    ionic3运行时gradle下载失败的解决方法
    阿里云菜鸡上云实例
    如何用手机控制pc鼠标——Java开发与学习记实
    LeetCode刷题笔记---6月
    编译原理复习题
  • 原文地址:https://www.cnblogs.com/chr-wonder/p/12789579.html
Copyright © 2011-2022 走看看