观所有的发达国家,都曾经走过短暂一段靠政府投资刺激经济发展的路子,但都很快发现了这种经济发展模式的巨大弊端,并很快改为依靠科技进步、依靠内需消费来发展经济的新模式。2020年,我们的消费率仅54%左右,不仅远远落后于发达国家的80%左右,甚至比南美、非洲、印度之类的国家还要低20个百分点以上。由此可见,提高劳动者所得在GDP中的比重,抓内需,促消费,才是新形势下中国经济稳步发展的关键。

Trunk、Hybrid、Access、Tag、Untag、Pvid

1、Trunk口,Trunk口上可以同时传送多个VLAN的包,一般用于交换机之间的链接。

2、Hybrid口,Hybrid口上可以同时传送多个VLAN的包,一般用于交换机之间的链接或交换机于服务器的链 接。

3、Access口,Access口只能属于1个VLAN,一般用于连接计算机的端口。

4、Tag和Untag,tag是指vlan的标签,即vlan的id,用于指名数据包属于那个vlan,untag指数据包不属于任何vlan,没有vlan标记。

5、PVID即 Port Vlan id,代表端口的缺省VLAN。交换机从对端设备收到的帧有可能是不带VLAN标签的数据帧,但所有以太网帧在交换机中都是以带VLAN标签的形式来被处理和转发的,因此交换机必须给端口收到的不带VLAN标签的数据帧添加上VLAN标签。为了实现此目的,必须为交换机配置端口的缺省VLAN。当该端口收到不带VLAN标签的数据帧时,交换机将给它加上该缺省VLAN的VLAN标签。通俗的讲,指的是native Vlan,即不打Vlan标记的Vlan,一般默认为Vlan 1

Port-base VLAN ID,是表示网络通信中基于端口的VLAN ID,一个端口可以属于多个VLAN,但是只能有一个PVID,收到一个不带tag头的数据包时,会打上PVID所表示的VLAN号,视同该VLAN的数据包处理。一个物理端口只能拥有一个PVID,当一个物理端口拥有了一个PVID的时候,必定会拥有和PVID相等的VID,而且在这个VID上,这个物理端口必定是Untagged Port。PVID的作用只是在交换机从外部接受到可以接受Untagged 数据帧的时候给数据帧添加TAG标记用的,在交换机内部转发数据的时候PVID不起任何作用。

二、端口的Tag和Untag

若某一端口在vlan设定中被指定为非标记端口untagged port, 所有从此端口转发出的数据包上都没有标记 (untagged)。若有标记的数据包进入交换机,则其经过非标记端口时,标记将被去除。因为目前众多设备并不支持标记数据包,其也无法识别标记数据包,因此,需要将与其连接的端口设定为非标记。

若某一端口在vlan设定中被指定为标记端口tagged port, 所有从此端口转发出的数据包上都将有标记 (tagged)。若有非标记的数据包进入交换机,则其经过标记端口时,标记将被加上。此时,其将使用在ingress 端口上的pvid设定作为增加的标记中的vlan id号。

三、端口的封装类型:ISL、802.1Q

ISL Trunk上所有的包都是tag的(Cisco专用);

802.1q 设计的时候为了兼容与不支持VLAN的交换机混合部署,特地设计成可以不tag:但是只有一个VLAN允许不tag,这样N个VLAN,(N-1)个都tag了,不tag的包一定是来自那个特殊VLAN的,所以不会乱套。(当然也可以所有VLAN都tag)

四、各端口收发数据的区别

端口类型收发描述
Access收报文判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省)
发报文将报文的VLAN信息剥离,直接发送出去
Trunk收报文收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果可以则转发,否则丢弃
发报文比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送
Hybrid收报文收到一个报文判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃
发报文判断该VLAN在本端口的属性(disp interface 即可看到该端口对哪些VLAN是untag, 哪些VLAN是tag)如果是untag则剥离VLAN信息,再发送,如果是tag则直接发送

以下案例可以帮助大家深入理解华为交换机的hybrid端口模式

[Switch-Ethernet0/1]int e0/1

[Switch-Ethernet0/1]port link-type hybrid

[Switch-Ethernet0/1]port hybrid pvid vlan 10

[Switch-Ethernet0/1]port hybrid vlan 10 20 untagged

[Switch-Ethernet0/1] int e0/2

[Switch-Ethernet0/2]port link-type hybrid

[Switch-Ethernet0/2]port hybrid pvid vlan 20

[Switch-Ethernet0/2]port hybrid vlan 10 20 untagged

此时inter e0/1和inter e0/2下的所接的PC是可以互通的,但互通时数据所走的往返vlan是不同的。

以下以inter e0/1下的所接的pc1访问inter e0/2下的所接的pc2为例进行说明

pc1所发出的数据,由inter0/1所在的pvid vlan10封装vlan10的标记后送入交换机,交换机发现inter e0/2允许vlan 10的数据通过,于是数据被转发到inter e0/2上,由于inter e0/2上vlan 10是untagged的,于是交换机此时去除数据包上vlan10的标记,以普通包的形式发给pc2,此时pc1->p2走的是vlan10

再来分析pc2给pc1回包的过程,pc2所发出的数据,由inter0/2所在的pvid vlan20封装vlan20的标记后送入交换机,交换机发现inter e0/1允许vlan 20的数据通过,于是数据被转发到inter e0/1上,由于inter e0/1上vlan 20是untagged的,于是交换机此时去除数据包上vlan20的标记,以普通包的形式发给pc1,此时pc2->pc1走的是vlan20

官方利率财经解读

利率是资金的价格,是重要的宏观经济变量,决定着资金的流向,对宏观经济均衡和资源配置有重要导向意义。

理论上,自然利率是宏观经济总供求达到均衡时的真实利率水平。

中长期看,宏观意义上的真实利率水平应与自然利率基本匹配。

实践中一般采用“黄金法则”来衡量合理的利率水平,即经通胀调整后的真实利率r应与实际经济增长率g大体相等。

若真实利率持续高于潜在增速,会导致社会融资成本高企,企业经营困难,不利于经济发展。

真实利率低于潜在经济增速,有利于债务可持续,可以给政府一些额外的政策空间。

但如果真实利率持续明显低于潜在经济增速,会扭曲金融资源配置,带来过度投资、产能过剩、通货膨胀、资产价格泡沫、资金空转等问题,难以长期持续。

我国货币政策始终坚持以我为主,以静制动,引导市场利率水平稳中有降,效果较好。

目前我国定期存款利率约为1%至2%,贷款利率约为4%至5%,真实利率略低于潜在实际经济增速,处于较为合理水平,是留有空间的最优策略。

当前我国的经济增长、物价水平、就业状况、国际收支平衡等货币政策调控目标均运行在合理区间,从实际效果上也充分验证了我国当前的利率水平总体上处于合理区间。

这段内容信息量非常大,直接给出结论:

1,国家承认,当前中国的真实利率,略低于潜在实际增速,国家层面对于经济管控,具备一定的政策空间。

2,长期以来,中国央行基本上注重的是“政策利率”,很少,或者说基本没有提及和对外讨论过“自然利率”的说法。

但是国外央行,特别是发达资本主义国家的央行,对于这个自然利率的概念非常关注,当然,国外的提法是“中性利率”。

这是一个很大的转变信号。

3,中性利率,或者说自然利率,是国家和经济体级别,最理想的经济平衡状态。

4,如果中国央行真的以自然利率为锚,进行相关的经济调控,意味着中国国家的货币政策规则一个质层面的巨大变化,甚至可以说转向。

长期以来,中国的利率实际上是宏观经济关键的有形之手,利率就是资金的价格,价格是资源配置优化的最好信号,但是国家和金融部门对实体经济参与程度,以及政策的反应和传递消化需要必然的过程和时间,就会导致一个错位期和滞后的情况存在。

当然,这也是实现“稳健”主线的必然成本。

如果国家金融的利率,是以通胀调整以后的真实利率为指向标进行调整,那么资源的扭曲配置就能得到避免。

简单一点说,就是利率市场化,这能提升社会资源配置的效率和经济活力,但是甘蔗没有两头甜,利率放开,那么对于行业和经济环境的收益管理,打击哄抬炒作行为,控制经济环境中的泡沫现象,以及扼杀投机和各种骗局的难度,就会直线上升。

青龙

先宝塔,里面装docker,再用以下命令在docker中装青龙

docker run -dit \
  --name QL \
  --hostname QL \
  --restart always \
  -p 5700:5700 \
  -v $PWD/QL/config:/ql/config \
  -v $PWD/QL/log:/ql/log \
  -v $PWD/QL/db:/ql/db \
  -v $PWD/QL/scripts:/ql/scripts \
  -v $PWD/QL/jbot:/ql/jbot \
  whyour/qinglong:latest

再在宝塔和云服务器后台放开入站规则5700端口,然后登录

获取京东cookies,

chrome浏览器访问 https://m.jd.com 然后点击 我的并用手机京东app扫描弹出来的二维码。

然后F12打开浏览器调试工具,点击 Application找到 Cookies 点击 https://home.m.jd.com,

在右边我们找到 pt_key和 pt_pin两个变量的值,将他们记录下来。

配置环境变量

在我们拿到 pt_key和 pt_pin两个变量后我们就可以开始配置青龙面板的环境变量了。

在面板的右上角我们可以看到环境变量这个选项,我们点击增加。

在弹出的窗口中输入变量,名称为 JD_COOKIE 值就是刚刚获取的 pt_key和 pt_pin两个变量,注意别搞反了(中间和后面的分号不可少),如

pt_key=AAJhuUiCADQS_fjhNxcGreONxMHJdtIQ1Tg0dCJK4n3FHHqW4sEv3Y-4dmXH1C8;pt_pin=jd_6ca591d6a;

拉取脚本库

在配置好环境变量后我们就可以开始拉取脚本了,由于脚本库会更新我们拉取脚本的命令也可以放在定时任务中。

添加库:

进入面板-右上角“定时任务”-分别填入相关信息。提供个人设置,给大家参考。其中任务名、任务定时可自定义。

名称:

拉取京东脚本

拉库命令填写下方代码:

ql repo https://gh.fakev.cn/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

或者:

ql repo https://hub.fastgit.xyz/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

PS:两者任选其一即可

国外鸡可直连Github的话填写下方代码

ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"

定时规则(每天8点30):

30 8 * * *

填写完毕后我们点击播放按钮运行一次脚本,稍等一下,让它转一会儿。然后刷新页面,就能看到库的脚本了

看到上面的内容可以说就大功告成了,京东脚本就会按照脚本设置的时间自动执行任务获取京豆和红包。

四、安装青龙面板依赖

青龙面板脚本运行必须要安装的依赖

一键依赖
docker exec -it qinglong bash
## 安装青龙依赖,如果按上面的安装青龙容器脚本,此处要把qinglong改成QL.
curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/FlechazoPh/QLDependency/main/Shell/QLOneKeyDependency.sh | sh

四、消息推送(可选)

在每次执行完我们需要一个推送来告诉我们今天获取了多少京豆,以及cookies有没有过期。我们在面板的配置文件项的第44行找到server酱并填入SendKey并保存即可。

目前Server酱使用门槛变高,改用钉钉机器人是一个比较好的选择,具体步骤可参考这篇文章:青龙面板 消息推送功能设置之钉钉机器人消息推送! – 孤岛 (feiji.work)

五、总结

这是一个非常好的服务器回血项目,即使在配置和搭建上比较复杂,但是收益还是相当可观的,配置得当你甚至在收回本金后还能赚不少钱。

其它补充内容可参考:搭建青龙面板运行京东、B站脚本 – 登山亦有道 (chenyan98.cn),目前发表原文的站点无法访问,看seo关键词估计是被请去喝茶了,。

其它参考链接

青龙面板自动领京东京豆,做农场浇水、萌宠、工厂、种豆等任务-缙哥哥 (dujin.org)

青龙面板拉取常用脚本(JD签到)目前在维护的脚本更新(2021-10-04)

https://blog.csdn.net/m0_61705773?type=blog

其它用法

多个网站签到

bilibili bili说明

快手,养牛,开卡

项目

金银手指

Fiddler脚本

写好脚本则更能够帮你抓取数据到文件、数据库,部分实现自动化,甚至远超一些同类专业产品。

常规功能
可以用来指定抓取所有的WEB通讯,也可以只抓取指定进程的通讯。

File-Capture Traffic ; Any Process 或拖动选定进程窗口

2.可以用来查看一个URL打开后,浏览器与后端的交互

3.可以查看任意一个HTTP交互,看请求和响应的原始报文,帮助你了解HTTP协议

4.可以设置丰富的过滤条件,确保聚焦

5.可以以各种形态查看数据,并提供了工具来做转换【这个比较丰富,但隐藏较深】

6.可以编写脚本,实现各个阶段的处理

可以基于类似Windows下的WScript,甚至使用一些ActiveX组件实现并发机制、通讯与数据存储。

OnBeforeRequest 在请求发生前调用,请求经过Fiddler发送给服务器之前会先调用这个函数,因此,如果想要修改请求,可以写在这个函数里
OnPeekAtResponseHeaders 在头到达后调用
OnBeforeResponse 在内容到达后,还没有处理前调用,从服务器读完响应后,且在将响应发送给客户端之前执行的。通过修改这个函数,可以修改服务器的响应头或者响应体

把网页上的JSON文件下载到本地

把以下内容放入OnBeforeResponse里面,

    if (m_Hide304s && oSession.responseCode == 304) {
        oSession["ui-hide"] = "true";
    }

    if (oSession.uriContains("https://www.tiktok.com/api/recommend/item_list/")){
        var strBodytk=oSession.GetResponseBodyAsString();
        //var spstk = oSession.PathAndQuery.slice(-58,);
        //FiddlerObject.alert(spstk)
        var timestamptk=new Date().getTime();
        var filenametk = "D:\\tiktokzl" + "\/" + timestamptk + ".json";
        //var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
        var curDatetk = new Date(); 
        var swtk : System.IO.StreamWriter; 
        if (System.IO.File.Exists(filenametk)){ 
            swtk = System.IO.File.AppendText(filenametk); 
            swtk.Write(strBodytk); 
        } 
        else{ 
            swtk = System.IO.File.CreateText(filenametk); 
            swtk.Write(strBodytk); 
        } 
        swtk.Close(); 
        swtk.Dispose(); 

    }

抓到 请求的数据  保存本地txt 文件里面

  • 将下代码  粘到OnBeforeRequest 的函数里头
  • if (oSession.fullUrl.Contains("填写需要抓取的域名")) {    var fso;    var file;    fso = new ActiveXObject("Scripting.FileSystemObject");    //文件保存路径可自定义    file = fso.OpenTextFile("填写保存TXT文件地址",8 ,true, true);    file.writeLine("Request url: " + oSession.url);    file.writeLine("Request header:" + "\n" + oSession.oRequest.headers);    file.writeLine("Request body: " + oSession.GetRequestBodyAsString());    file.writeLine("\n");    file.close();}

自动化抓取图片并提出重复的
static function FileExsitInDirectory(fso:Object, filename:String , dirpath:String )
{
var curPath = dirpath + “/” + filename ;
var objset , objFolders , FolderName, ret;

    if (fso.FileExists(curPath)) 
    {
        return  curPath;
    }
    else
    {
        var objset = fso.getFolder(dirpath);

        var objFolders = objset.SubFolders;

        var fenum = new Enumerator(objset.SubFolders); 

        for (var i = 0 ; !fenum.atEnd(); fenum.moveNext(),i++)
        { 

            var FolderName = dirpath + "/" + fenum.item().Name + "/";

            var ret = FileExsitInDirectory(fso, filename, FolderName);

            if( ret != "NULL" ) 
            {
                return ret
            }                                   
        } 
        return "NULL";  
    } 
}

static function OnBeforeResponse(oSession: Session)
{
if (m_Hide304s && oSession.responseCode == 304)
{
oSession[“ui-hide”] = “true”;
}

    //如果来自指定网站,且是jpg,则写文件 image/jpeg
    if(
        (oSession.RequestHeaders.AllValues("Host").Contains(".mm115.net") ||
        oSession.RequestHeaders.AllValues("Host").Contains(".jzsjwk.com"))

        &&
        oSession.ResponseHeaders.AllValues("Content-Type").Contains("image/jpeg") )
    {      

        var whindex = oSession.url.IndexOf ('?');           

        if (whindex <= 0)
            whindex = oSession.url.Length;

        var file_url = oSession.url.Substring (0,whindex);

        whindex = oSession.url.IndexOf ('.jpg');            

        if ((whindex > 0) && (oSession.GetResponseBodyAsString().Length > 40000))
        {
            whindex = whindex+4;            


            file_url = file_url.Substring (0,whindex).Replace ('/','_').Replace('%','B').Replace('?','7').Replace('&','-').Replace('img22.jzsjwk.com','img1.mm115.net');

            var file_path  = "d:/PRVIT/jpg/"+file_url;

            try
            {
                var fso = new ActiveXObject("Scripting.FileSystemObject"); 

                var retval = FileExsitInDirectory(fso,file_url,"d:/PRVIT/jpg/");

                FiddlerObject.log (retval);

                if ("NULL" == retval)
                {           
                    var stream = new ActiveXObject('Adodb.Stream');  
                    stream.Mode = 3;  
                    stream.Open();  


                    stream.Type = 1;  
                    //stream.Charset = 'unicode';  
                    //stream.WriteText(s);  

                    stream.Position = 0;  
                    stream.Type = 1;  
                    //stream.Position = 2;  
                    //var bs = stream.Read();  
                    //stream.Position = 0;  
                    stream.Write(oSession.responseBodyBytes);  
                    //stream.SetEOS();  

                    stream.SaveToFile(file_path,1);  

                    stream.Close(); 


                    oSession["ui-backcolor"] = "yellow";
                }
                else
                {
                    oSession["ui-strikeout"] = "true";
                    oSession["ui-backcolor"] = "green";
                }

            }
            catch(err)
            {
                FiddlerObject.log (err.message);
                oSession["ui-backcolor"] = "red";
            }


        }
        else
        {
            oSession["ui-color"] = "red";
        }

    }





}

抓取内容,并存放到数据库
var sql = “”;
try
{
var con =new ActiveXObject(“ADODB.Connection”);

            //con.Provider="Microsoft.ACE.OLEDB.18.0";



            var rs=new ActiveXObject("ADODB.Recordset");

            /**
            Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Y:/TEST/fiddler_web_service_analysis.accdb;Persist Security Info=False;
            **/

            //var access_db_path = "d:/fiddler_web_service_analysis.accdb" ;

            //con.ConnectionString="Data Source="+access_db_path;

    //ODBC DSN name ,config by windows odbc
            con.open("DSN=db_hsb_vs_ahs;") ;


            //FiddlerObject.alert(1);




            sql = "insert into  t_call_record (call_timestamp,request_send_timestamp,response_recv_timestamp,sitename,url,request,response,spend_second,content_type,content_length) values(" +
                strVar1(oSession.Timers.FiddlerBeginRequest) + "," +
                strVar1(oSession.Timers.ClientDoneRequest) + "," +
                strVar1(oSession.Timers.ServerDoneResponse) + "," +
                strVar1(oSession.RequestHeaders.AllValues("Host")) + "," +
                strVar1(oSession.url.Substring (0,whindex)) + "," +
                strVar1(oSession.RequestHeaders.ToString ()+oSession.GetRequestBodyAsString()) + "," +
                strVar1(oSession.ResponseHeaders.ToString ()+oSession.GetResponseBodyAsString()) + "," +
                etimes*1000  + "," +
                strVar1(oSession.ResponseHeaders.AllValues("Content-Type")) +"," +
                oSession.ResponseHeaders.AllValues("Content-Length")+0

                +");";

            //FiddlerObject.alert(sql);

            rs.open(sql,con);

            oSession["ui-color"] = "red";

            //rs.close();
            // rs=NULL;

            con.close();
            // con = NULL;



        }
        catch(exp)
        {

            var txt="Error description: " + exp.message + "\n\n" + sql;
            FiddlerObject.log(txt);
            oSession["ui-strikeout"] = "true";

        }

  1. 在此处【重定向urlplace】host和url的判断
  if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
	    oSession.hostname = "api.mobile.xxx.com"
		  }
  1. 在此处【设置请求的header】,测试网络爬虫时候会用,
// TSET FOR Spider: 根据网站来限定请求
if (oSession.HostnameIs("test.com")) {
    // 模拟修改请求的用户端ip,这种情况对独立的网络有效,对于公司级的网络,还是有一些问题,需要借助vpn
    oSession.oRequest["X-Forwarded-For"]="16.12.23.16";
    // 修改请求的header
    oSession.oRequest["User-Agent"] = "spider Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0";

}

2019.04.26 手机模拟添加cookie(区别于种cookie 在onBeforeResponse里)

  • 删除所有的cookie oSession.oRequest.headers.Remove("Cookie");
  • 新建cookie oSession.oRequest.headers.Add("Cookie", "username=testname;testpassword=P@ssword1");

注意: Fiddler script不能直接删除或者编辑单独的一个cookie, 你需要用replace方法或者正则表达式的方法去操作cookie的string

if (oSession.HostnameIs("******") && oSession.oRequest.headers.Exists("Cookie") ) {

    var sCookie = oSession.oRequest["Cookie"]; 
    //用replace方法或者正则表达式的方法去操作cookie的string
    //sCookie = sCookie.Replace("cookieName=", "ignoreme="); 
    sCookie = sCookie + ";tt_spver=1";

    oSession.oRequest["Cookie"] = sCookie; 
}


在此处修改response的bady内容【使用正则匹配方式】
   if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取response中的body字符串
        var strBody=oSession.GetResponseBodyAsString();
        // 用正则表达式或者replace方法去修改string
        var regx = '"stream_mode":\d*?'
        strBody=strBody.replace(regx,'"stream_mode":0');
        // 弹个对话框检查下修改后的body               
        FiddlerObject.alert(strBody);
        // 将修改后的body,重新写回Request中
        oSession.utilSetResponseBody(strBody);
    }
在此处修改json中的数据【修改接口字段的值】
    if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取Response Body中JSON字符串
        var responseStringOriginal =  oSession.GetResponseBodyAsString();
        // 转换为可编辑的JSONObject变量
        var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
        // 修改JSONObject变量,修改字段数据
        responseJSON.JSONObject["new_core"] = "True";  
        responseJSON.JSONObject["stream_mode"] = 5;
        // 重新设置Response Body
        var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
        oSession.utilSetResponseBody(responseStringDestinal);
	}
在此处修改json中的数据【增加接口字段=值】
    if(oSession.HostnameIs("host") && oSession.url.IndexOf("url_path") > -1){
        // 获取Response Body中JSON字符串
        var responseStringOriginal =  oSession.GetResponseBodyAsString();
        // 转换为可编辑的JSONObject变量
        var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
        // 修改JSONObject变量,修改字段数据
        responseJSON.JSONObject["type_arr"] = ["bullet"];
        // 重新设置Response Body
        var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
        oSession.utilSetResponseBody(responseStringDestinal);
        }
使指定URL支持CORS跨域请求有时候,你调用一个 json 接口,发现跨域了,你需要去找接口的开发人支持跨域,显然傻傻等待后端开发完毕再联调是低效率的, 这个时候就就要在后台改完之前就自己实现跨域的模拟,此时 fiddler 显然是再好不过的利器。支要持 CORS 跨域, 就是要为请求的返回头增加 Access-Control-Allow-Origin 属性,因此需要修改 OnBeforeResponse函数,在该函数的末尾添加你的 CORS 逻辑
    static function OnBeforeResponse(oSession: Session) {
        	...

        	if(oSession.uriContains("要处理的url")){
        		oSession.oResponse["Access-Control-Allow-Origin"] =  "允许的域名";
        		oSession.oResponse["Access-Control-Allow-Credentials"] = true;
        	}
    }








oSession常用的相关属性和方法
 // 修改session中的显示样式
 oSession["ui-color"] = "orange";
 // 移除http头部中的MQB-X5-Referer字段
 oSession.oRequest.headers.Remove("MQB-X5-Referer");
 // 修改http头部中的Cache-Control字段
 oSession.oRequest["Cache-Control"] = "no-cache";
 // 修改host
 oSession.host = "example.domain"; 
 // 修改Origin字段
 oSession.oRequest["Origin"] = "http://domain";
 // 删除所有的cookie
 oSession.oRequest.headers.Remove("Cookie");
 // 新建cookie
 oSession.oRequest.headers.Add("Cookie", "username=cookiename;");
 // 修改Referer字段
 oSession.oRequest["Referer"] = "https://yoururl";
 
 // 获取Request中的body字符串
 var strBody=oSession.GetRequestBodyAsString();
 // 用正则表达式或者replace方法去修改string
 strBody=strBody.replace("aaaa","bbbbbb");
 // 将修改后的body,重新写回Request中
 oSession.utilSetRequestBody(strBody);
// 判断连接中是否包含字符串str
oSession.uriContains(str)
// 给连接请求添加一个字段TEST
oSession.oRequest["TEST"]="TEST NEW Request";





可参考
https://github.com/gitjayzhen/FiddlerUseScript

Linux的ip命令-路由-网卡设备-统计

Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。Linux系统提供iproute2工具用于替代一些常用的net-tools命令,iproute2套件里提供了许多增强功能的命令,ip命令即是其中之一。

格式:

ip [options] object [command [arguments]]

主要参数
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式。如link、addr、route、rule、tunnel 。
object是要管理者获取信息的对象。如网络接口类型eth0。
command设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些对象不支持这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。
arguments是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。命令的默认参数将使用default标出。

  1. IP地址管理
    设置和删除Ip地址
    设置一个IP地址,可以使用下列ip命令:
    ip addr add 192.168.0.193/24 dev wlan0
    请注意IP地址要有一个后缀,比如/24。这种用法用于在无类域内路由选择(CIDR)中来显示所用的子网掩码。在这个例子中,子网掩码是255.255.255.0。

需要查看是否已经生效。
ip addr show wlan0
删除IP地址
ip addr del 192.168.0.193/24 dev wlan0

  1. 路由管理
    列出路由表条目
    IP命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。
    ip route show
    查看路由表
    假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):

ip route get 119.75.216.20
查看路由包
添加默认路由
ip route add default via 192.168.202.254
添加网络路由
ip route add 192.168.4.0/24 via 192.168.4.1
修改网络路由
ip route change 192.168.4.0/24 dev eth1
设置NAT路由
ip route add nat 192.168.1.100 via 192.168.1.1
1.
查看某个路由表信息
ip route show table main
ip route show table local
ip route show table all

可以使用以下方式获取到特定ip的路由信息:

bob@ubuntu-20-04:~$ ip route get to 192.168.43.2


擦除所有路由表

ip route flush

擦除路由表的缓存

ip route flush cache

  1. 网络统计
    显示网络统计数据
    使用ip命令还可以显示不同网络接口的统计数据。
    ip -s link
    网络统计数据
    当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。

ip -s -s link ls docker0

ip -s link ls docker0

  1. ARP管理
    查看ARP信息
    地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。
    ip neighbour
  2. 网络监测
    监控netlink消息
    可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
    ip monitor all
  3. 网络接口设置
    激活和停止网络接口
    你可以使用ip命令的up和down选项来激某个特定的接口,就像ifconfig的用法一样。

停止网络接口eth0

ip link set eth0 down

启动网络接口eth0

ip link set eth0 up
修改设置传输队列的长度
ip link set dev eth0 txqueuelen 100

ip link set dev eth0 txqlen 100
修改网络设置MTU(最大传输单元)的值
ip link set dev eth0 mtu 1500
修改网卡的MAC地址
ip link set dev eth0 address 00:01:4f:00:15:f1

  1. 路由策略设置
    ip rule命令中包含add、delete、show(或者list)等子命令,注意:策略路由(policy routing)不等于路由策略(rouing policy)。在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。

插入新的规则

ip rule add

删除规则

ip rule delete

显示路由表信息

ip rule list

子命令可以用如下缩写:add、a;delete、del、d

示例1: : 双网卡数据路由策略选择,让来自192.168.3.0/24的数据包走11.0.0.254这个网关,来自192.168.4.0/24的数据包走12.0.0.254这个网关

定义表
echo 10 clinet_cnc >>/etc/iproute2/rt_tables
echo 20 clinet_tel >>/etc/iproute2/rt_tables
把规则放入表中
ip rule add from 192.168.3.0/24 table clinet_cnc
ip rule add from 192.168.4.0/24 table clinet_tel
添加策略路由
ip route add default via 11.0.0.254 table clinet_cnc
ip route add default via 12.0.0.254 table clinet_tel
刷新路由表

ip route flush cache

来自51CTO博客作者计算机控制挖掘机炒菜?的原创作品

linux命令

docker ps命令用来展示所有运行中的容器

docker ps -a命令是用来展示所有的容器,包括未运行的容器

curl 是常用的命令行工具,用来请求 Web 服务器,它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具,

不带有任何参数时,curl 就是发出 GET 请求。


$ curl https://www.example.com

上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。
#curl cip.cc 查询IP地址归属地

参考:https://www.ruanyifeng.com/blog/2019/09/curl-reference.html

ps

ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。

grep

命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

 ps -ef |grep

通过上述解释,可以得知ps是一个命令,grep是一个命令,中间的|代表管道命令,表示ps命令和grep命令同时执行

示范

ps -ef |grep python 这条命令代表检查python进程是否存在

显示列字段解释
  • UID      :程序被该 UID 所拥有
  • PID      :就是这个程序的 ID 
  • PPID    :则是其上级父程序的ID
  • C          :CPU使用的资源百分比
  • STIME :系统启动时间
  • TTY     :登入者的终端机位置
  • TIME   :使用掉的CPU时间。
  • CMD   :所下达的是什么指令

nload -m

查看所有网卡实时流量情况,-m参数表示不以图表,而以统计数据显示

du -sh 查看当前目录使用情况

du -sh * 查看当前目录下子目录使用情况,可以直接把*号变目录名来查目录空间使用情况

du -sh /*  表示根目录使用情况

df -ah df列出磁盘总容量、可用容量、使用%、接入点等信息,而du只是合计磁盘的使用量。-h选项表示人性化显示格式。

tail Linux中用于查看文件尾部的内容,与head相对应。
常用来查看日志文件,通过-f实时查看文件最新内容。

尤其是对于日志文件较大的时候,通过tail指定输出的行数来查看日志。

// 输出最后10行的内容
tail test.log

// 输出最后10行的内容,同时监视文件的变化,一旦变化就显示出来
tail -f test.log

// 输出最后n行的内容,同时监视文件的变化,一旦变化就显示出来
tail -nf test.log

// 输出文件最后10行的内容
tail -n 10 filename
// 除第9行不显示外,显示第10行到末尾行
tail -n -10 filename

// 从第20行至末尾
tail +20 test.log

// 显示最后10个字符
tail -c 10 test.log

// 实时日志查看与grep过滤关键字
// -A 除显示符合t匹配内容的那一行之外,并显示该行之后的内容
// -B 除显示符合匹配内容的那一行之外,并显示该行之前的内容
// -C 除显示符合匹配内容的那一列之外,并显示该列前后的内容
tail -f test.log | grep ‘test’ -C 5
tail -f test.log | grep ‘test’ -5

使用 PuTTY 安全复制客户端将文件传输到您的 Linux 实例

PuTTY 安全复制客户端 (PSCP) 是一个命令行工具,可用于在 Windows 计算机和 Linux 实例之间传输文件。

要使用 PSCP,您需要使用在使用 PuTTYgen 转换私有密钥中生成的私有密钥。您还需要使用 Linux 实例的公有 DNS 名称或 IPv6 地址(如果实例具有该地址)。

以下示例将 Sample_file.txt 文件从 Windows 计算机上的 C:\ 驱动器传输到 Amazon Linux 实例上的 instance-user-name 主目录。要传输文件,请使用以下命令之一。

  • (公有 DNS)要使用实例的公有 DNS 名称传输文件,请输入以下命令。pscp -i C:\path\my-key-pair.ppk C:\path\Sample_file.txt instance-user-name@instance-public-dns-name:/home/instance-user-name/Sample_file.txt
  • (IPv6) 或者,如果实例具有 IPv6 地址,要使用实例的 IPv6 地址传输文件,请输入以下命令。IPv6 地址必须用方括号 ([ ]) 括起来。pscp -i C:\path\my-key-pair.ppk C:\path\Sample_file.txt instance-user-name@[instance-IPv6-address]:/home/instance-user-name/Sample_file.txt

如果您更喜欢图形用户界面 (GUI),您可以使用一种叫作“WinSCP”的开源 GUI 工具。

WinSCP 是适用于 Windows 的基于 GUI 的文件管理器,您可以通过它来使用 SFTP、SCP、FTP 和 FTPS 协议将文件上传并传输到远程计算机。WinSCP 允许您将文件从 Windows 计算机拖放到 Linux 实例,或者在两个系统之间同步整个目录结构。

但您的 Linux 实例必须已安装 scp。对于某些操作系统,您需要安装 openssh-clients 软件包。对于其他操作系统(例如经 Amazon ECS 优化的 AMI),您需要安装 scp 软件包。请参阅您的 Linux 发行版的文档。