月度归档: 2023 年 4 月

  • 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,完美解决!

  • device is busy

    umount.nfs4: /data: device is busy

    在Linux管理umount设备时,时常会遇到”device is busy”, 如果umount一个文件系统碰到这种情况,并且你并没有在所需卸载的目录下。那么很可能有用户或进程在使用那个目录。

    # umount /mnt

    umount: /mnt: device is busy

    umount: /mnt: device is busy

    那么必须用fuser命令来查看process ID和进程的拥有者,比如:

    # fuser -mu /mnt

    /mnt: 25781c(root)

    # kill -9 25781

    # umount /mnt

    像下面这种情况,就代表rhythmbox用户在使用那个目录。然后也可以用fuser -ck /dev/sdc1来杀进程。

    # fuser -m /dev/sdc1

    /dev/sdc1: 538

    # ps auxw|grep 538

    donncha 538 0.4 2.7 219212 56792 SLl Feb11 11:25 rhythmbox

    如果所有这些努力还不奏效,杀掉该进程后,那么这个时候可能需要加-f -l参数,强制卸载

    # umount -f -l /mnt

    NOTE:

    可用下面的命令来检查SATA硬盘的坏块。

    # badblocks -v /dev/sda

    # badblocks -v /dev/sdb

    # badblocks -v /dev/mapper/vgosi-lvol1

    Checking blocks 0 to 10477568

    Checking for bad blocks (read-only test): done

    Pass completed, 0 bad blocks found.

  • Linux Crontab 定时任务

    linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。

    cron介绍

    我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

    • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
    • /etc/crontab 这个文件负责调度各种管理和维护任务。
    • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
    • 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。

    crontab的使用

    我们常用的命令如下:

    crontab [-u username]    //省略用户表表示操作当前用户的crontab
        -e      (编辑工作表)
        -l      (列出工作表里的命令)
        -r      (删除工作作)

    我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

    crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

    • * 取值范围内的所有数字
    • / 每过多少个数字
    •  从X到Z
    • 散列数字

    实例

    实例1:每1分钟执行一次myCommand

    * * * * * myCommand

    实例2:每小时的第3和第15分钟执行

    3,15 * * * * myCommand

    实例3:在上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * * myCommand

    实例4:每隔两天的上午8点到11点的第3和第15分钟执行

    3,15 8-11 */2  *  * myCommand

    实例5:每周一上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * 1 myCommand

    实例6:每晚的21:30重启smb

    30 21 * * * /etc/init.d/smb restart

    实例7:每月1、10、22日的4 : 45重启smb

    45 4 1,10,22 * * /etc/init.d/smb restart

    实例8:每周六、周日的1 : 10重启smb

    10 1 * * 6,0 /etc/init.d/smb restart

    实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

    0,30 18-23 * * * /etc/init.d/smb restart

    实例10:每星期六的晚上11 : 00 pm重启smb

    0 23 * * 6 /etc/init.d/smb restart

    实例11:每一小时重启smb

    0 */1 * * * /etc/init.d/smb restart

    实例12:晚上11点到早上7点之间,每隔一小时重启smb

    0 23-7/1 * * * /etc/init.d/smb restart
  • Docker tag 命令

    语法

    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

    实例

    将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。

    root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3
    root@runoob:~# docker images   runoob/ubuntu:v3
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    runoob/ubuntu       v3                  4e3b13c8a266        3 months ago        136.3 MB
  • DOCKER portainer-ce中文版

    源码仓库https://github.com/eysp/portainer-ce

    其中arm和ppc64le架构没有设备测试,反馈bug 到GitHub issues

    pull的已数量突破100K,我不懂编程,对此我由衷的高兴,想看预览图的点这里https://www.right.com.cn/forum/thread-4066518-1-1.html

    在这里感谢大家的支持,已更新到2.16.2,没有大版本的更新我暂时不会更新了,欢迎大家进q群交流,群号758648462(备注portainer)

    感谢群里@我不是矿神 指导js精简 | @52Fancy 提供编译脚本

    一键安装代码**

    docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce
    

    163镜像安装,portainer-ce中文,访问dockerhub网速不好的尝试

    docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hub-mirror.c.163.com/6053537/portainer-ce
    

    访问hub.docker.com网络慢,或者以上代码都无法安装成功尝试以下代码

    docker pull hub-mirror.c.163.com/6053537/portainer-ce
    docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
    

    Licensing

    Portainer is licensed under the zlib license. See LICENSE for reference.

    Portainer also contains code from open source projects. See ATTRIBUTIONS.md for a list.

  • 一键更换yum 源

    bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh)

    参考:LinuxMirrors: GNU/Linux 一键更换国内软件源脚本 (gitee.com)

  • pve CT容器虚拟机开启支持nfs

    创建时需要取消 无特权容器 选项

    取消五特权的容器选项

  • Transport endpoint is not connected

    mount了mfs后,重新挂载之后,出现如下错误:

    /usr/local/mfs/bin/mfsmount -H 192.168.103.101 /mnt/ 
    fuse: bad mount point `/mnt/’: Transport endpoint is not connected 
    see: /usr/local/mfs/bin/mfsmount -h for help

    解决方法:

    1、kill进程;

    2、umount

    3、重新mount

    ps aux | grep mfs

    umount –l /mnt/usr/local/mfs/bin/mfsmount -H 192.168.103.101 /mnt/

  • 安装Rclone进行挂载

    安装Rclone进行挂载

    curl https://rclone.org/install.sh | sudo bash

    挂载到本地

    centos需要下载fuse

    yum -y install fuse
    #新建本地文件夹,位置可以自己选
    mkdir /data/aliyunwebdav
    #挂载
    rclone mount DriveName:Folder LocalFolder --cache-dir /tmp --allow-other --vfs-cache-mode writes --allow-non-empty

    #创建挂载目录

    mkdir -p /home/onedrive

    #挂载

    #如果需要后台保持运行,使用下面的命令

    nohup rclone mount remote:path/to/files /home/onedrive &

    设置开机自启

    #将后面修改成你上面手动运行命令中,除了rclone的全部参数
    command="mount DriveName:Folder LocalFolder --cache-dir /tmp --allow-other --vfs-cache-mode writes --allow-non-empty"
    #以下是一整条命令,一起复制到SSH客户端运行
    cat > /etc/systemd/system/rclone.service <<EOF
    [Unit]
    Description=Rclone
    After=network-online.target
    
    [Service]
    Type=simple
    ExecStart=$(command -v rclone) ${command}
    Restart=on-abort
    User=root
    
    [Install]
    WantedBy=default.target
    EOF

    开始启动:

    systemctl start rclone
    

    设置开机自启:

    systemctl enable rclone
    

    其他命令:

    重启:systemctl restart rclone
    停止:systemctl stop rclone
    状态:systemctl status rclone