分类: 技术

  • nginx生成ssl证书

    1、创建证书存放路径  

    [root@nginx ~]# mkdir /home/nginx/ssl
    [root@nginx ~]# cd /home/nginx/ssl

    2、  生成根证书的私钥

    [root@nginx ~]# openssl genrsa 1024 > /home/nginx/ssl/server.key
    genrsa:产生rsa密钥命令 1024: 密钥的长度位数,默认为512

    3、  生成证书签署请求,(创建服务器证书的申请文件server.csr)

    复制代码
    [root@nginx nginx]# openssl req -new -key /home/nginx/ssl/server.key > /home/nginx/ssl/server.csr
    
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN    #国家名称
    State or Province Name (full name) []:BJ  #州或省名称
    Locality Name (eg, city) [Default City]:BJ    #城市
    Organization Name (eg, company) [Default Company Ltd]:xiaoguaishou  #组织名称(例如,公司)
    Organizational Unit Name (eg, section) []:OP      #组织单位名称(例如,部门)
    Common Name (eg, your name or your server's hostname) []:127.0.0.1      #通用名称(例如,您的名称或服务器主机名)
    Email Address []:xiaoguaishou@qq.com    #电子邮件地址
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:test@123    #密码
    An optional company name []:xiaoguaishou    #可选公司名称
    复制代码

    4、  创建服务器证书(有效期十年)

    [root@nginx nginx]# openssl req -x509 -days 3650 -key /home/nginx/ssl/server.key -in /home/nginx/ssl/server.csr > /home/nginx/ssl/server.crt

    5、查看生成的证书

    [root@nginx ssl]# ls
    server.crt server.csr server.key      #共生成3个文件

    6、nginx配置证书

    复制代码
    [root@nginx ]# vim /home/nginx/conf/nginx.conf
    
    server {
    listen 443 ssl;
    server_name localhost;
    
    ssl_certificate /home/nginx/ssl/server.crt;    #证书路径
    ssl_certificate_key /home/nginx/ssl/server.key;  #证书路径
    
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    location / {
    root html;
    index index.html index.htm;
    }
    }
    复制代码

    7、重启nginx

    [root@nginx nginx]# systemctl restart nginx.service

    8、访问,测试 

    浏览器:https://192.168.61.142

  • Docker Registry web-ui 部署

    • Registry web-ui 获取

    docker pull hyper/docker-registry-web
    
    • 编辑配置文件 vim RegistryWebUi/config.yml

    registry:
      # Docker registry url
      url: http://ip:端口/v2
      # Docker registry fqdn
      name: localhost:端口
      # To allow image delete, should be false
      readonly: false
      auth:
        # Disable authentication
        enabled: false ##如果不需要分用户权限设置,推荐选择false
    
    • Registry web-ui 运行

    docker run -d -p 10082:8080  --name registry-web --link myRegistry -v $(pwd)/RegistryWebUi/:/conf/:ro hyper/docker-registry-web:latest
    
    * --link myRegistry  这边的myRegistry是我之前搭建的docker仓库容器的名字
    * 之前搭建docker仓库的命令是:
    ocker run -p 31000:5000 --restart=always -itd  --privileged=true -v /hardDisk_sdd/registry:/var/lib/registry  --name myRegistry -v /etc/localtime:/etc/localtime  registry:latest
    
    • Registry 设置

    sudo docker exec -it myRegistry /bin/sh
    cd /etc/docker/registry
    vi config.yml
    加入
      delete:                                                                                                                                                                          
        # To allow image delete                                                                                                                                                        
        enabled: true 
    

    version: 0.1                                                                                                                                                                       
    log:                                                                                                                                                                               
      level: info                                                                                                                                                                      
      formatter: text                                                                                                                                                                  
      fields:                                                                                                                                                                          
        service: registry                                                                                                                                                              
        environment: OfficeProduction                                                                                                                                                  
    storage:                                                                                                                                                                           
      cache:                                                                                                                                                                           
        blobdescriptor: inmemory                                                                                                                                                       
      filesystem:                                                                                                                                                                      
        rootdirectory: /var/lib/registry                                                                                                                                               
      delete:                                                                                                                                                                          
        # To allow image delete                                                                                                                                                        
        enabled: true                                                                                                                                                                  
    http:                                                                                                                                                                              
      addr: :31000                                                                                                                                                                     
      headers:                                                                                                                                                                         
        X-Content-Type-Options: [nosniff]                                                                                                                                              
    health:                                                                                                                                                                            
      storagedriver:                                                                                                                                                                   
        enabled: true                                                                                                                                                                  
        interval: 10s                                                                                                                                                                  
        threshold: 3 
    
    • 重启 myRegistry

    sudo docker restart myRegistry
    
  • Docker registry API

    查询catalog

    sudo curl -k -XGET https://www.registry.com/v2/_catalog
    

    查询tags

    sudo curl -k -XGET https://www.registry.com/v2/<image>/tags/list
    

    删除镜像

    # 查询镜像是否存在,以及tags
    sudo curl -k -XGET https://user:passwd@www.registry.com/v2/debian/tags/list
    # 获取digest参数
    sudo curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -XGET -k https://user:passwd@www.registry.com/v2/debian/manifests/jessie 2>&1 | grep Docker-Content-Digest | awk '{print $3}'
    # 根据digest进行删除
    sudo curl -X DELETE -k https://user:passwd@www.registry.com/v2/debian/manifests/sha256:a4a28eee3eb9698fef895484b2dbf1a2179e0f7b23408f5ebfc39b30bab031b4
    # 数据清理
    sudo docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml
    sudo docker exec registry rm -rf /data/docker/registry/v2/respositories/debian

  • PHP-Composer包开发、发布流程

    Composer对与分发自己的PHP软件包,方便别人引用来说是很好的一种方式。平时开发中经常会用到Composer来引入三方的优质软件包,例如 Laravel、easywechat等等,如果我们有一些好的想法如果分发出去呢?下面我们就一步步来告诉大家如何实现自己的第一个Composer包。

    初始化项目

    首先创建composer.json文件用于声明包基本信息。

    {
    "name": "jake/dev-package", # 包名,格式为 vendor/package-name vendor用于避免冲突
    "description": "软件包描述",
    "autoload": { # 自动载入规范
    "psr-4": {
    "Jake\Package\": "src"
    }
    }
    }

    配置好之后就可以在src目录编写项目逻辑,这里我们声明了自动载入符合psr-4规范。

    本地引用软件包

    在为上传到仓库之前,我们可以使用本地路径来引入

    {
        "name": "jake/application",
    
        ...
    
        "repositories": {
          "dev-package": {
            "type": "path",
            "url": "relative/or/absolute/path/to/my/dev-package",
            "options": {
              "symlink": true
            }
          }
        }
    }

    配置中的“type”: “path” 表示引入的是一个本地仓库,url定义了包的路径,路径可以使用相对路径或绝对路径。

    虽然设置了type和url后就可以开发了,但是composer会复制包的代码到vendor目录,而且每次包发生变更都要执行composer update

    为了避免更新执行update操作,可以通过设置”symlink”: true参数让composer创建一个软链接到包所在目录

    最后一步操作就是使用composer require命令来引入软件包。

    composer require jake/dev-package @dev

    发布到公网

    1、 发布到外网首先需要把代码提交到vcs服务器,并且设置为可公开访问。

    2、 然后注册 packagist 帐号用于发布,用邮箱即可注册。

    3、 登录packagist后可通过 submit 页面发布composer包,发布时需要填写可公开访问的vcs地址。如下图

    点击Check跟着向导走即可完成发布。

    提示
    包名中的vendor不可与他人发布的重复。


    使用

    composer require "kyfjake/lumen-swoole:version"

    版本号规则

    1. dev-branch-name表示使用某一个分支版本,对应vcs中的分支
    2. vxx.xx.xx 表示使用xx.xx.xx版本,对应git中的标签 vxx.xx.xx


    版本号匹配规则见: 官方文档 或 composer包版本命名及限定规则

  • tmux 终端分屏工具

    tmux 的安装

    Linux 系统中通常使用 yum 来安装 tmux :

    yum install tmux

    Mac OS 通常使用 brew 来安装 tmux :

    brew install tmux 

    你可以看到使用 tmux 的门槛就是这么低。

    tmux 中的几个名词

    在开始使用 tmux 之前我们需要先了解关于 tmux 的几个名词:

    session, window , pane 在这里我们就把他们分别叫做会话,窗口,窗格 。

    关于session 很多人都叫会话,个人感觉叫任务更贴切,更形象。

    通常我们在终端中操作一个任务的时候,一旦终端关闭,任务也就结束了,被强制关闭了,在 tmux 中 使用 session 就可以解决这个问题,我们可以把当前操作的任务隐藏起来,在视觉上让它消失,任务继续执行着,当我们想返回任务做一些操作的时候,它可以很方便的回来,我们通常把上面的操作就做 session 操作,我们可以把 session 给隐藏起来,我们也可以把 session 给真的关掉。

    在 tmux 中有一个窗口的概念,我们可以这样要去理解窗口:当前呈现在我们面前的这一个工作区域就是一个窗口(当前的终端界面),窗口可以被不断切割,切割成一个个小块,这一个个小块我们叫做窗格(pane),这就是窗口和窗格的概念,我们把它想象成一块大蛋糕可以切成很多小块蛋糕,窗口可以被分割成很多小的窗格。

    总结: 一个 session 通常指一个任务里面可以有很多窗口,一个窗口又可以有很多的窗格。

    可能很抽象,通过下面的实践操作,相信你会加深对 tmux 的理解。

    tmux 的前缀键

    tmux 中的很多操作都是通过快捷键来实现的,通过快捷键我们可以更加高效的完成任务,这也是很多人喜欢 tmux 的一个主要原因。

    如果想使用 tmux 中的快捷键,我们必须使用 tmux 的前缀按键 ctrl + b , 在 tmux

    中所有的快捷键都需要通过前缀按键去唤起的。

    在 tmux 当中默认的前缀按键是 ctrl + b , 这个前缀按键不是很友好,ctrl 和 b 的距离真的是太长了,操作起来不是很舒心,当然这个前缀按键是可以通过 tmux 的配置文件 .tmux.conf 进行修改的,文末会提到 .tmux.conf 的一点简单配置。

    tmux 的 session 常用操作

    session 是 tmux 中一个很重要的概念,它很好用,也很简单,下面我们来实践一下如何操作 session .

    新建 session

    新建一个 session ,在终端输入一个 tmux 命令即可:

    tmux

    上面的命令会创建一个 session ,默认是通过数字编号来命令的,有时候我们需要明确的知道我们的 session 的名字,方便我们快速进入该 session ,我们可以使用如下的命令:

    tmux new -s  <session-name> 

    例如新建一个名称是 zempty 的session : tmux new -s zempty

    离开 session

    有时候我们需要离开终端,操作其他的任务,需要离开该任务,但是又想该任务继续在后台执行,这时候我们需要在 tmux 的任何一个窗格中输入如下命令:

    tmux detach

    也可以使用快捷键 ctrl + b d ,这里解释一下该快捷键, tmux 离开 session 的快捷键是 d ,但是在 tmux 当中任何快捷键都需要搭配 tmux 的前缀按键 ctrl + b 来唤醒,所以改快捷键的操作是先按 ctrl +b ,紧接着按下按键 d ,这样我们便顺利的离开当前 session 了。

    查看 session 列表

    有时候我们可能同时操作了好几个 session, 我们可以通过如下的命令来查看我们目前操作了几个session:

    tmux  ls  

    也可以通过快捷键操作 ctrl + b s 列出所有的 session。

    进入 session

    离开 session 之后,有时候我们还需要对某个 session 进行操作,这时候可以通过如下的操作:

    tmux attach -t  <session-name>

    例如我的 session 名称是 zempty , 就可以通过 tmux attach -t zempty 顺利进入 session, 也可以通过 tmux a -t zempty ,该命令中的 a 是 attach 的简写形式

    关闭 session

    如果需要关闭 session, 可以通过执行如下的命令即可:

    tmux kill-session -t <session-name>

    例如关闭zempty 这个session : tmux kill-session -t zempty

    也可以使用快捷键 ctrl + d 来关闭当前的 session。

    切换 session

    执行命令,可以从当前的 session 快速切换到另一个 session:

    tmux switch -t <session-name>

    重命名 session

     tmux rename-session -t <old-session-name> <new-session-name>

    例如: tmux rename-session -t zempty handsome 该命令会把 zempty 这个 session 重新命名为 handsome.

    也可以通过快捷键 ctrl +b $ 来重命名当前的session 。

    session 总结

    session 在 tmux 操作当中非常重要,希望你可以熟练的使用以上操作:

    新建 session -> 离开 session -> 查看 session 列表 -> 进入 session -> 关闭 session -> 不同 session 之间的切换 -> 重命名 session 。

    tmux 的窗格常用操作

    我一直认为使用 tmux 中的窗格是一件很酷的事情,很多人喜欢 tmux 也是因为窗格功能的存在。

    什么是窗格(pane)呢?

    前文也提到过,这里在详细描述一下:当前我们的工作区域,一块工作屏幕我们叫做窗口,窗口是可以被分割的,当前的工作区域被分割的一块块区域就是窗格。

    每一个窗格我们可以用来干不同的事情,窗格同窗格之间是相互独立的,可以想象我们使用 vim 来搭配 tmux 的窗格功能是不是很酷呢?

    切割窗格

    切割窗格的命令是:

    tmux split-window 

    该命令会把当前工作区域分成上下两个小窗格

    tmux split-window -h

    该命令会把当前工作区域分成左右两个窗格

    切割窗格的快捷键 ctrl + b % 可以快速的左右切割,ctrl + b “ 可以快速的上下进行切割。

    不同窗格间移动光标

    tmux select-pane  -U

    把当前光标移动到上方的窗格

    tmux select-pane -D

    把当前的光标移动的下方的窗格

    tmux select-pane -L

    把当前的光标移动到左边的窗格

    tmux select-pane -R

    把当前的光标移动到右边的窗格

    移动窗格光标的快捷键:

    ctrl +b <arrow key>例如 ctrl +b ⬆ 会把光标移动到上方的窗格。

    ctrl +b ;光标切换到上一个窗格

    ctrl +b o 光标切换到下一个窗格

    交换窗格的位置

    tmux swap-pane -U

    当前窗格向上移动

    tmux swap-pane -D

    当前窗格向下移动

    关闭当前的窗格

    关闭窗格通常使用快捷键 ctrl + b x

    放大窗格

    快捷键 ctrl + b z ,将会放大当前操作的窗格,继续触发该快捷键将会还原当前的窗格。

    窗格显示时间

    快捷键 ctrl +b t 将会把在当前的窗格当中显示时钟,非常酷炫的一个功能,点击 enter (回车键将会复原)。

    窗格总结

    关于窗格的操作我们经常操作的就是分割,移动光标,放大窗格,关闭窗格,可以熟练以上提到的操作,关于移动光标的快捷键操作,下文在 .tmux.conf 中也会处理成快捷键进行操作。

    tmux 的窗口常用操作

    创建窗口

    有时候一个窗口不够用,这样我们就需要重新创建一个窗口:

    tmux new-window -n <window-name>

    例如: tmux new-window -n zempty 就是重新创建一个名字是 zempty 的window

    创建窗口的快捷键ctrl + b c, 可以通过快捷键快速的创建一个窗口出来。

    切换窗口

    tmux select-window -t <window-name>

    在已经有多个窗口的条件下,可以通过上名的命令快速进入指定的窗口当中,例如:tmux select-window -t zempty 会快速跳到 zempty 这个窗口当中。

    关于切换窗口的快捷键 :

    ctrl + b w 显示窗口列表可以通过 j ,k 上下进行选择窗口,然后回车进入指定的窗口。

    ctrl + b n 快速切换到下一个窗口。

    ctrl +b p 快速切换到上一个窗口。

    重命名窗口

    tmux rename-window <new-window-name>

    例如 tmux rename-window zempty 把当前窗口名为 zempty

    窗口命名快捷键:

    ctrl + b , 该快捷键可以重新命名窗口

    关闭窗口

    tmux kill-window -t <window-name>

    例如: tmux kill-window -t zempty 删除名称为zempty 的窗口。

    关闭窗口的快捷键:

    ctrl + b & 可以关闭当前的的窗口

    窗口的总结

    窗口的日常使用多是通过快捷键去操作,熟练掌握上面提到操作窗口的快捷键即可。

    tmux 的配置文件 .tmux.conf

    tmux 中的很多操作都是通过快捷键去实现的 ,在 tmux 中我们可以通过 ctrl + b ? 来查找 tmux 的帮助文档,可以查询一些功能键的快捷键信息 ,在帮助文档中按下键盘上的 ESC 或者 q 键就可以退出帮助文档。

    在 tmux中有一个配置文件 .tmux.conf ,在其中可以配置一些方便自己的 tmux 快捷键信息等,该文件 .tmux.conf 默认放在 ~(家目录) 目录下面,如果没有可以在 ~ 目录下面创建一个 .tmux.conf 文件即可。

    在tmux 中默认的前缀键是 ctrl + b ,这个前缀键对我是十分不友好的,我通常会通过配置文件改成 ctrl + x, 因为我的手很容易触到 x 按键。

    下面列出一份简单的 .tmux.conf 的配置文件,算是做为一个入门配置,如下所示

    #below reset tmux prefix command key
    set -g prefix C-x
    unbind C-b
    bind C-x send-prefix
    #set swap pane key
    bind-key k select-pane -U
    bind-key j select-pane -D
    bind-key h select-pane -L
    bind-key l select-pane -R

    该配置文件把 ctrl + b 改成了 ctrl + x , 还有多个窗格之间切换光标可以通过 ctrl + x k 切换到上一个窗格, ctrl + x j 切换到下一个窗格, ctrl +x h 切换到左边的窗格,ctrl + x l 切换到右边的窗格。

    配置文件总结

    关于 tmux 的配置文件的配置可以根据个人的习惯进行配置,配置的具体细节可以查询 google 或者 github。

  • 英文日期缩写

    月份缩写:

    January 一月 Jan.

    February 二月 Feb.

    March 三月 Mar.

    April 四月 Apr.

    May 五月 May

    June 六月 Jun.

    July 七月 Jul.

    August 八月 Aug.

    September 九月 Sept.

    October 十月 Oct.

    November 十一月 Nov.

    December 十二月 Dec.

    日期的缩写表示法

    1st,2nd,3rd,4th,5th,6th,7th,8th,9th,10th,11th,12th,13th,14th,15th,16th,17th,18th,19th,20th,21st,22nd,23rd,24th,25th,26th,27th,28th,29th,30th。

    星期的缩写:

    Monday,星期一,Mon.

    Tuesday,星期二,Tue.

    Wednesday,星期三,Wed.

    Thursday,星期四,Thurs/Thur.

    Friday,星期五,Fri.

    Saturday,星期六,Sat.

    Sunday,星期日,Sun.

  • MySQL 入门:Case 语句很好用

    MySQL CASE 函数

    ❮ MySQL 函数

    实例

    遍历条件并在满足第一个条件时返回一个值:

    SELECT OrderID, Quantity,
    CASE
        WHEN Quantity > 30 THEN “The quantity is greater than 30”
        WHEN Quantity = 30 THEN “The quantity is 30”
        ELSE “The quantity is under 30”
    END
    FROM OrderDetails;

    亲自试一试 »


    定义和用法

    CASE 语句遍历条件并在满足第一个条件时返回一个值(如 IF-THEN-ELSE 语句)。 因此,一旦条件为真,它将停止读取并返回结果。

    如果没有条件为真,它将返回 ELSE 子句中的值。

    如果没有ELSE部分且没有条件为真,则返回NULL。

    语法

    CASE
        WHEN condition1 THEN result1
        WHEN condition2 THEN result2
        WHEN conditionN THEN resultN
        ELSE result
    END;

    参数值

    参数 描述
    condition1, condition2, …conditionN 必需。条件。 它们的评估顺序与列出的顺序相同
    result1, result2, …resultN 必需。条件为真时返回的值

    技术细节

    适用于: From MySQL 4.0

    更多实例

    以下 SQL 将按城市对客户进行排序。 但是,如果 City 为 NULL,则按 Country 排序:

    实例

    SELECT CustomerName, City, Country
    FROM Customers
    ORDER BY
    (CASE
        WHEN City IS NULL THEN Country
        ELSE City
    END);

    亲自试一试 »

  • nginx 开启文件浏览功能

    1、开启全站所有目录浏览功能

    vi  /usr/local/nginx/conf/nginx.conf  #编辑配置文件,在http {下面添加以下内容:

    autoindex on;   #开启nginx目录浏览功能

    autoindex_exact_size off;  #文件大小从KB开始显示

    autoindex_localtime on;  #显示文件修改时间为服务器本地时间

    charset utf-8,gbk; #防止中文乱码 
  • CURL 发送POST请求

    CURL 发送POST请求

    curl -H “Content-Type: application/json” -X POST -d ‘{“user_id”: “123”, “coin”:100, “success”:1, “msg”:”OK!” }’ “http://192.168.0.1:8001/test

    参数 内容
    -H 请求头
    -d POST内容
    -X 请求协议

    简介
    curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

    -A

    -A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]

    $ curl -A ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36’ https://google.com

    上面命令将User-Agent改成 Chrome 浏览器。

    $ curl -A ” https://google.com

    上面命令会移除User-Agent标头。

    也可以通过-H参数直接指定标头,更改User-Agent

    $ curl -H ‘User-Agent: php/1.0’ https://google.com

    -b

    -b参数用来向服务器发送 Cookie。

    $ curl -b ‘foo=bar’ https://google.com

    上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。

    $ curl -b ‘foo1=bar;foo2=bar2’ https://google.com

    上面命令发送两个 Cookie。

    $ curl -b cookies.txt https://www.google.com

    上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

    -c

    -c参数将服务器设置的 Cookie 写入一个文件。

    $ curl -c cookies.txt https://www.google.com

    上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt

    -d

    -d参数用于发送 POST 请求的数据体。

    $ curl -d’login=emma&password=123′-X POST https://google.com/login # 或者 $ curl -d ‘login=emma’ -d ‘password=123’ -X POST https://google.com/login

    使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST

    -d参数可以读取本地文本文件的数据,向服务器发送。

    $ curl -d ‘@data.txt’ https://google.com/login

    上面命令读取data.txt文件的内容,作为数据体向服务器发送。

    –data-urlencode

    --data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

    $ curl –data-urlencode ‘comment=hello world’ https://google.com/login

    上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

    -e

    -e参数用来设置 HTTP 的标头Referer,表示请求的来源。

    curl -e ‘https://google.com?q=example’ https://www.example.com

    上面命令将Referer标头设为https://google.com?q=example

    -H参数可以通过直接添加标头Referer,达到同样效果。

    curl -H ‘Referer: https://google.com?q=example’ https://www.example.com

    -F

    -F参数用来向服务器上传二进制文件。

    $ curl -F ‘file=@photo.png’ https://google.com/profile

    上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。

    -F参数可以指定 MIME 类型。

    $ curl -F ‘file=@photo.png;type=image/png’ https://google.com/profile

    上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream

    -F参数也可以指定文件名。

    $ curl -F ‘file=@photo.png;filename=me.png’ https://google.com/profile

    上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png

    -G

    -G参数用来构造 URL 的查询字符串。

    $ curl -G -d ‘q=kitties’ -d ‘count=20’ https://google.com/search

    上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略--G,会发出一个 POST 请求。

    如果数据需要 URL 编码,可以结合--data--urlencode参数。

    $ curl -G –data-urlencode ‘comment=hello world’ https://www.example.com

    -H

    -H参数添加 HTTP 请求的标头。

    $ curl -H ‘Accept-Language: en-US’ https://google.com

    上面命令添加 HTTP 标头Accept-Language: en-US

    $ curl -H ‘Accept-Language: en-US’ -H ‘Secret-Message: xyzzy’ https://google.com

    上面命令添加两个 HTTP 标头。

    $ curl -d ‘{“login”: “emma”, “pass”: “123”}’ -H ‘Content-Type: application/json’ https://google.com/login

    上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

    -i

    -i参数打印出服务器回应的 HTTP 标头。

    $ curl -i https://www.example.com

    上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

    -I

    -I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。

    $ curl -I https://www.example.com

    上面命令输出服务器对 HEAD 请求的回应。

    --head参数等同于-I

    $ curl –head https://www.example.com

    -k

    -k参数指定跳过 SSL 检测。

    $ curl -k https://www.example.com

    上面命令不会检查服务器的 SSL 证书是否正确。

    -L

    -L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。

    $ curl -L -d ‘tweet=hi’ https://api.twitter.com/tweet

    –limit-rate

    --limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。

    $ curl –limit-rate 200k https://google.com

    上面命令将带宽限制在每秒 200K 字节。

    -o

    -o参数将服务器的回应保存成文件,等同于wget命令。

    $ curl -o example.html https://www.example.com

    上面命令将www.example.com保存成example.html

    -O

    -O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

    $ curl -O https://www.example.com/foo/bar.html

    上面命令将服务器回应保存成文件,文件名为bar.html

    -s

    -s参数将不输出错误和进度信息。

    $ curl -s https://www.example.com

    上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。

    如果想让 curl 不产生任何输出,可以使用下面的命令。

    $ curl -s -o /dev/null https://google.com

    -S

    -S参数指定只输出错误信息,通常与-s一起使用。

    $ curl -s -o /dev/null https://google.com

    上面命令没有任何输出,除非发生错误。

    -u

    -u参数用来设置服务器认证的用户名和密码。

    $ curl -u ‘bob:12345’ https://google.com/login

    上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1

    curl 能够识别 URL 里面的用户名和密码。

    $ curl https://bob:12345@google.com/login

    上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。

    $ curl -u ‘bob’ https://google.com/login

    上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

    -v

    -v参数输出通信的整个过程,用于调试。

    $ curl -v https://www.example.com

    --trace参数也可以用于调试,还会输出原始的二进制数据。

    $ curl –trace – https://www.example.com

    -x

    -x参数指定 HTTP 请求的代理。

    $ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com

    上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。

    如果没有指定代理协议,默认为 HTTP。

    $ curl -x james:cats@myproxy.com:8080 https://www.example.com

    上面命令中,请求的代理使用 HTTP 协议。

    -X

    -X参数指定 HTTP 请求的方法。

    $ curl -X POST https://www.example.com

    上面命令对https://www.example.com发出 POST 请求。

  • pve修改ip地址

    一、在局域网的电脑浏览器输入PVE的IP地址登录后台,从左边的菜单找到“PVE”—“_Shell”菜单,进入网页版的ssh界面下;或者在主机的控制台下输入root密码后登录到ssh下;

    二、输入以下命令回车:

    vi /etc/network/interfaces

    通过键盘上下左右移动到address这行的IP地址,按一次i进入修改状态,修改为新的IP地址,如果需要网关则修改gateway这行,修改完成确认无误后按一次ESC键输入:wq!回车保存退出。

    三、输入以下命令回车:

    vi /etc/issue

    通过键盘上下左右移动到 https:// 这行的IP地址,按一次i进入修改状态,修改为新的IP地址,端口8006不要改,修改完成确认无误后按一次ESC键输入:wq!回车保存退出。

    四、输入以下命令回车:

    vi /etc/hosts

    通过键盘上下左右移动到第2行的IP地址,按一次i进入修改状态,修改为新的IP地址,修改完成确认无误后按一次ESC键输入:wq!回车保存退出。

    img

    五、重启PVE,完美解决!