BoxCore

Start


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 站点地图

  • 搜索

Linux网络命令之ssh

发表于 2017-10-10 | | 阅读次数

一、基础

1
2
3
4
5
6
7
8
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]

主要参数说明:

-l 指定登入用户
-p 设置端口号
-f 后台运行,并推荐加上 -n 参数
-n 将标准输入重定向到 /dev/null,防止读取标准输入
-N 不执行远程命令,只做端口转发
-q 安静模式,忽略一切对话和错误提示
-T 禁用伪终端配置

二、常用案例

2.1 远程执行bash命令

ssh -l www-online 192.168.110.34 “cat /proc/cpuinfo”

不过一般执行后,可以写这样的语句来判断执行有无异常

ssh 调用远程命令后不能自动退出解决方法
可以将标准输出与标准错误输出重定向到/dev/null,这样就不会一直处于等待状态。

ssh -l www-online 192.168.110.34 “/home/www-online/uptimelog.sh > /dev/null 2>&1 &”

实际上,想ssh退出,我们可以在ssh执行完成后kill掉ssh这个进程来实现。
首先,创建一个sh执行ssh的命令,这里需要用到ssh的 -f 与 -n 参数,因为我们需要ssh也以后台方式运行,这样才可以获取到进程号进行kill操作。
创建ssh_uptimelog.sh,脚本如下

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
ssh -f -n -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &" # 后台运行ssh
pid=$(ps aux | grep "ssh -f -n -l www-online 192.168.110.34 /home/www-online/uptimelog.sh" | awk '{print $2}' | sort -n | head -n 1) # 获取进程号
echo "ssh command is running, pid:${pid}"
sleep 3 && kill ${pid} && echo "ssh command is complete" # 延迟3秒后执行kill命令,关闭ssh进程,延迟时间可以根据调用的命令不同调整
exit 0

三、SSH配置修改

1
2
// 常用配置
PermitRootLogin yes # 是否开启root登陆

3.1 加速ssh登陆

ssh默认开启GSSAPIAuthentication登陆验证,将其设置为no就可以了,配置文件在/etc/ssh/ssh_config,修改重启sshd即可

说明如:

GSSAPI:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。
其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。
GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。

3.2 开启ssh免密码登陆

设置内容:
vi /etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

1
2
3
4
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
service sshd restart

重启sshd后尝试使用无密码登陆服务器。

可能遇到问题:selinux未关闭,依然需要输入密码。处理方法,配置关闭selinux:
vi /etc/selinux/config
修改以下内容:
将SELINUX=enforcing修改为SELINUX=disabled

Linux网络命令之端口扫描nmap

发表于 2017-10-10 | | 阅读次数

Nmap是一款用于网络发现和安全审计的安全工具,常用于端口扫描。

一、Nmap介绍

  1. 扫描类型

    -sT  TCP 连接扫描,会在目标主机中记录大量的链接请求和错误信息
    -sS  SYN扫描,只完成三次握手前两次,很少有系统记入日志,默认使用,需要root(admin)权限
    -sP  Ping扫描,默认使用,只有能Ping得通才会继续扫描
    -P0  扫描之前不需要Ping,用于绕过防火墙禁Ping功能
    -sA  高级的扫描方式,用来穿过防火墙的规则集
    -sV  探测端口号版本 
    -sU  UDP扫描,扫描主机开启的UDP的服务,速度慢,结果不可靠 
    -sX -sN   秘密的FIN数据包扫描,圣诞树(Xmas Tree)和空模式,针对Unix和Linux主机,系统要求遵循TCP RFC文档

  2. 扫描参数

    -v  显示扫描过程,推荐使用
    -h  帮助文档
    -p  指定端口号,如[1-65535],[22,135,1433,3306,]等格式
    -O  启动远程操作系统监测,存在误报
    -A  全面系统监测,使用脚本检测,扫描等
    -T4  针对TCP端口禁止动态扫描延迟超过10ms
    -iL  批量扫描,读取主机列表,如[-iL C:\ip.txt]

二、扫描案例

2.1. 扫描C段(局域网)存活主机

nmap -sP www.XXX.com/24

nmap -sP 192.168.1.*  (注释:“*”为通配符)

2.2. 扫描指定IP开放端口号

nmap -sS -p- -v 192.168.1.100

-p-为全端口扫描,和[1-65535]一样,建议使用

不使用默认Nmap认为危险的100个端口号

2.3. 扫描指定IP所开端口及服务版本

nmap -sV -v 192.168.1.100

2.4. 探测主机操作系统

nmap -O www.XXX.com

扫描准确度以百分比显示,未必准确

2.5. 穿透防火墙扫描

nmap -P0  www.XXX.com

2.6. 全面探测,-A包含OS 探测,版本探测,脚本扫描,traceroute

nmap -A www.XXX.com

2.7. 使用脚本扫描,

nmap --script="脚本名称" www.XXX.com

如在局域网上扫找 Conficker 蠕虫病毒

nmap -PN -T4 -p139,445 -n -v --script=smb-check-vulns --script-args safe=1 192.168.0.1-254

脚本放在Nmap安装目录script下,官网可查各个脚本功能

Linux之文件和目录操作

发表于 2017-10-09 | | 阅读次数

dirname $0,取得当前执行的脚本文件的父目录

cd dirname $0,进入这个目录(切换当前工作目录)

pwd,显示当前工作目录(cd执行后的)

由此,我们获得了当前正在执行的脚本的存放路径。

bash循环读入文件的每一行并处理

cat afile | while read oneline
do
echo $oneline
done
这只是个简单例子,把文件afile的每一行读入,然后显示出来。

也可以这样(如果行中有空格或者tab则无法使用此方法,不好意思啊,呵呵):
for i in cat afile
do
echo $i
done

逐行处理文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ 通过read命令完成
cat data.dat | while read line
do
echo "File:${line}"
done
while read line
do
echo "File:${line}"
done < data.dat
$ 使用awk命令完成
cat data.dat | awk '{print $0}'
cat data.dat | awk 'for(i=2;i<NF;i++) {printf $i} printf "\n"}'
$ 使用for var in file 命令完成
for line in $(cat data.dat)
do
echo "File:${line}"
done
for line in `cat data.dat`
do
echo "File:${line}"
done

补充:

如果输入文本每行中没有空格,则line在输入文本中按换行符分隔符循环取值.

如果输入文本中包括空格或制表符,则不是换行读取,line在输入文本中按空格分隔符或制表符或换行符特环取值.

可以通过把IFS设置为换行符来达到逐行读取的功能.

Linux网络命令之netstat

发表于 2017-10-09 | | 阅读次数

netstat是linux下网络情况命令,同样的window下也是一样,下面说说他的基础使用和常用情景。

一、命令帮助

  • -ntlp : 列出所有端口

二、常见案例

2.1 查看端口是否被占用

例如查询8080端口是否被占用,并可以查看pid/程序名

netstat -apn | grep 8080

一般找到端口使用的PID后可以执行如下进行关闭:

1
2
ps -ef | grep PID # 查看详细信息
kill -9 PID # 终止该进程

附录window下使用:

1
2
3
4
5
6
7
8
9
1、查询端口占用情况
cmd > netstat -ano
2、查询8080端口是否被占用
cmd > netstat -ano|findstr 8080
3、查询哪个程序占用了端口
cmd > tasklist|findstr PID
进程号通过2查询可以得到
4、终止该占用进程
cmd > ntsd -c q -p PID

2.2 mac下网络查看

  • netstat -an | grep 3306

通过list open file命令可以查看到当前打开文件,在linux中所有事物都是以文件形式存在,包括网络连接及硬件设备。

lsof -i:80

-i参数表示网络链接,:80指明端口号,该命令会同时列出PID,方便kill

查看所有进程监听的端口

sudo lsof -i -P | grep -i “listen”

MySQL时间处理

发表于 2017-09-21 | | 阅读次数

mysql关于时间的函数有date_format,datediff等,这里整理一波。

  • DATE_FORMAT()
  • DATEDIFF()
  • TIMESTAMPDIFF()
  • NOW():输出当前时间,格式 Y-m-d H:i:s
  • CURDATE(): 当前日期,格式 Y-m-d
  • date_sub():
  • FROM_UNIXTIME(): select from_UNIXTIME(1505985895, '%Y-%m-%d');
  • to_days():
  • period_diff() : period_diff(date_format(now() , '%Y%m') , date_format('2017-08-01', '%Y%m'));
  • str_to_date(): str_to_date("2010-11-23 14:39:51",'%Y-%m-%d %H:%i:%s')

提醒:

  1. to_days() 不用于阳历出现(1582)前的值,原因是当日历改变时,遗失的日期不会被考虑在内。因此对于1582 年之前的日期(或许在其它地区为下一年 ), 该函数的结果实不可靠的。
  2. MySQL”日期和时间类型”中的规则是将日期中的二位数年份值转化为四位。因此对于’1997-10-07’和’97-10-07’将被视为同样的日期

GIT使用手册

发表于 2017-09-08 | | 阅读次数

一、基本命令

1.1 版本回退

1
2
3
4
5
git reset --hard # 回退到当前版本(放弃所有修改)
git checkout {file_name} # 放弃某个文件的修改
git reset {UUID} # 回退到某一版本但保存自该版本起的修改
git reset --hard {UUID} # 回退到某一版本并且放弃所有的修改
git reset --hard origin/master # 回退到和远程版本一样, origin代表你远程仓库的名字,master代表分支名

1.2 git submodule使用

这其实是 git 的子模块功能,作用是为了在项目中引入另一个项目的部分或全部内容,但是这两个项目是分开开发或管理的,这样直接使用 git submodule 就可以不必要将另一个项目复制一份直接引用即可。

常用 git submodule命令

1
2
3
4
5
6
7
8
9
10
11
12
13
git submodule add repourl # 添加 git 子模块
git submodule init # 初次clone带有子模块的仓库如果想查看子模块的内容
git submodule update # 或者 git submodule update --init --recursive
vi .gitmodules # 更新子模块地址
git submodule sync # 然后提交更改即可
git rm --cached {submodule_path} # submodule_path即子模块在仓库下的路径(这之前需要删除删除 .gitsubmodule中对应submodule的条目 和 删除 .Git/config 中对应submodule的条目)
git commit -m 'xxx'
git push

具体的关于 git submodule 的说明以及使用,请点击这里

1.3 分支合并

分支合并分为两种情况,一种是本地分支合并,一种是远程分支合并到本地分支

1
2
git merge 分支名称 # 本地分支合并
git pull origin master # 远程分支合并到本地分支

1.4 代码提交

1.4.1 如何从众多提交中保留只需要的提交

如果说在众多提交中,已某个提交为基准,只保留上游众多提交中的某个或者某几个,可以使用 cherry-pick命令,具体是:

git cherry-pick

如果没有冲突,则回显示如下:

1
2
3
Finished one cherry-pick.
# On branch dev
# Your branch is ahead of 'origin/dev' by 3 commits.

如果存在冲突,则需要解决冲突然后继续,关于如何冲突,请查看如何处理代码冲突小节

1.4.2 修改最后一次提交

更多参考:http://git.mydoc.io/?t=83152

1.4.5 改写历史,去除大文件

1
2
3
git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

并告知所有组员,push 代码前需要 pull rebase,而不是 merge,否则会从该组员的本地仓库再次引入到远程库中

1.4.6 恢复已经被删除文件

git checkout commit_id -- path_to_file
可以试一下使用git ls-files -d | xargs -i git checkout {} 不过新的版本开始不支持了!

1.4.7 批量永久删除git中文件

1
2
3
4
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all
git push origin master --force --all # 强制覆盖推送

二、配置

http(s)方式自动记住密码

1
2
3
git config --global credential.helper cache # 记住密码十五分钟
git config credential.helper 'cache --timeout=3600' # 这里记住的是一个小时,如需其他时间,请修改3600为你想修改的时间,单位是秒
git config --global credential.helper store # 设置长期记住密码 或者,比如http://yourname:password@git.oschina.net/name/project.git //注意,码云平台同时支持个性地址与邮箱,当使用邮箱时,请对@符号使用%40替换

如果你原本使用的 ssh 地址想更换成 http(s) 地址,可以执行以下命令:

1
2
git remote rm origin # 删除原本的ssh仓库地址 origin 代表你原本ssh地址的仓库的别名
git remote add origin http://git.oschina.net/username/project.git # 新增http地址的仓库

CRLF换行输入问题

git 出现warning crlf will be replaced by…
里面的文本文件所使用的换行符,在不同的系统平台上是不一样的。UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是 0x0D(CR),后来的 OS X 在更换内核后与 UNIX 保持一致了。但 DOS/Windows 一直使用 0x0D0A(CRLF) 作为换行符。
跨平台协作开发是常有的,不统一的换行符确实对跨平台的文件交换带来了麻烦。最大的问题是,在不同平台上,换行符发生改变时,Git 会认为整个文件被修改,这就造成我们没法 diff,不能正确反映本次的修改。

还好 Git 在设计时就考虑了这一点,其提供2个选项进行操作

autocrlf配置

git config –global core.autocrlf {true|false|input}

参数说明:

  • true: 提交时转换为LF,检出时转换为CRLF
  • input: 提交时转换为LF,检出时不转换
  • false: 提交检出均不转换

在 Windows 上,系统默认配置一般为 true。如果文件编码是 UTF8 并且包含中文字符,那最好还是把 autocrlf 设置为 false。否则,就会遇到我所遇到的问题,Git 尝试将 CRLF 转化为 LF 时失败,导致无法 add 。

如果把 autocrlf 设置为 false 时,那另一个配置项 safecrlf 最好设置为 ture。该选项用于检查文件是否包含混合换行符,其有三个可选项.

safecrlf配置

git config –global core.safecrlf {true|false|warn }

  • true: 拒绝提交包含混合换行符的文件
  • false: 允许提交包含混合换行符的文件
  • warn: 提交包含混合换行符的文件时给出警告

综合方案

mac下,如果有mac和windows开发用户,可以这样设置:

1
2
git config --global core.autocrlf false
git config --global core.safecrlf warn 或false

虽然代码能被提交,但是项目中的文件可能会包含两种格式的换行符。而且会有如上提到的问题,文件被视为整个被修改,无法 diff,之所以使用版本控制工具,最重要的原因之一就是其 diff 功能。

最好默认选择LF,或者强制转成LF,没办法,用windows的码农且不会配置LF的太多太多。。。

三、迁移git

3.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## Git global setup
git config --global user.name "xxx"
git config --global user.email "xx@xx.com"
## Create a new repository
git clone git@gitlab.com:xxx/xxx.git
cd your_dir
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
## Existing folder
cd existing_folder
git init
git remote add origin git@gitlab.com:xxx/xxx.git
git add .
git commit -m "Initial commit"
git push -u origin master
## Existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@gitlab.com:xxx/xxx.git
git push -u origin --all
git push -u origin --tags

mpv播放器安装和使用

发表于 2017-09-04 | | 阅读次数

mpv是一个跨平台开源播放器。

一、安装

二、使用

三、配置

3.1 默认快捷方式

  • 左/右方向键 : 快进/后退5秒钟。shift+左右方向键可以以1秒为进度调节;
  • 上/下方向键 : 快进/后退1分钟。shift+左右方向键可以以5秒为进度调节;
  • [ 和 ] : 载入上一个/下一个字幕。受到一些限制,可能不会总是好使。;
  • { 和 } : 半倍/双倍速度播放;
  • BACKSPACE : 重制正常播放速度;
  • < 和 > : 播放列表后一个/前一个;
  • ENTER : 播放列表后一个。(Ps:播放列表只有选中播放多个视频时才有的功能,单独播放一个视频没有)
  • p / SPACE : 暂停。再按一下继续播放;
  • . : 按下一次会暂停,再次按下会进入到下一帧画面,视频依然是暂停状态。(考据党的最爱);
  • , : 按下一次会暂停,再次按下会进入到上一帧画面,视频依然是暂停状态。;
  • q : 停止播放并立即退出;
  • Q : 也是停止播放并立即退出。但是可以记录上次视频播放位置;
  • **/ 和 * ** : 增大/减小音量;
  • 9 和 0 : 增大/减小音量;
  • m : 静音;

还有其他常用的很多,码字很辛苦,这里不一一列出,具体参考下官方文档吧!

3.2 自定义配置

aria2远程下载利器

发表于 2017-08-31 | 分类于 开发工具 | | 阅读次数

安装aria2路程很颠簸,最好不用全部依赖包都编译,太耗时间了。所以,就有本文了,下面是我个人vps在centos 6.8 下安装成功的范例,免费拿去吧!

一、aria2安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
# install aria2 for centos 6.8
# author: boxcore
# aria2 docs:https://github.com/aria2/aria2
# more gnu project for download : http://ftp.gnu.org/gnu/ ; ftp://gcc.gnu.org/pub/gcc/infrastructure/
#
# aria2 gui tools:
# for mac: https://github.com/yangshun1029/aria2gui/releases
#
yum install bison libssh2-devel expat-devel gmp-devel nettle-devel libuv-devel libssh2-devel zlib-devel c-ares-devel cppunit-devel gnutls-devel libgcrypt-devel libxml2-devel sqlite-devel gettext lzma-devel xz-devel gperftools gperftools-devel gperftools-libs jemalloc-devel
## install gcc 4.8
#
#
wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
ln -s /opt/rh/devtoolset-2/root/usr/bin/* /usr/local/bin/
hash -r
g++ --version
## install libuv, see https://github.com/libuv/libuv
wget https://dist.libuv.org/dist/v1.9.1/libuv-v1.9.1.tar.gz
tar vxf libuv-v1.9.1.tar.gz
cd libuv-v1.9.1
sh autogen.sh
./configure
make
make check
make install
## install jemalloc, see: http://jemalloc.net/
wget https://github.com/jemalloc/jemalloc/releases/download/5.0.1/jemalloc-5.0.1.tar.bz2
tar vxf jemalloc-5.0.1.tar.bz2
cd jemalloc-5.0.1
./configure
make
make check
make install
cd /opt
wget https://github.com/aria2/aria2/releases/download/release-1.27.1/aria2-1.27.1.tar.gz
tar xzf aria2-1.27.1.tar.gz
cd aria2-1.27.1
./configure --enable-static=yes --enable-shared=no --with-libuv --with-jemalloc --with-ca-bundle='/etc/pki/tls/certs/ca-bundle.crt' ARIA2_STATIC=yes
make && make check && make install

然后,你就可以使用aria2c命令试一下咯。。。

二、aria2使用

2.1 基本说明

基础命令说明

-c: 断点续传
-s: 使用线程数

当源地址存在诸如 &, * 等 shell 的特殊字符,请使用单引号或双引号把 URI 包含起来。

aria2c服务

1
2
3
aria2c --conf-path="/root/.aria2/aria2.conf" -D # 启动aria服务
ps -ef|grep aira2c # 查看并杀死aria2c

2.2 常见命令

1
2
3
4
5
6
aria2c -c -s 5 http://example.org/mylinux.iso
aria2c http://a/f.iso ftp://b/f.iso # Download from 2 sources
aria2c -x2 http://a/f.iso # Download using 2 connections per host
aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C' # BitTorrent Magnet URI

三、aria2前端管理工具

  • webui-aria2: https://github.com/ziahamza/webui-aria2.git
  • AriaNg: https://github.com/mayswind/AriaNg.git

四、aria2相关工具

  • https://github.com/mayswind/AriaNg, https://doub.io/wlzy-30/
  • https://doub.io/wlzy-30/
  • https://github.com/ziahamza/webui-aria2
  • https://github.com/binux/yaaw
  • https://dy.ghostry.cn/

aria2 GUI客户端:

  • aria-ng-gui : 一个 Aria2 图形界面客户端 | An Aria2 GUI for Windows & Linux & MacOS https://aria-ng.xmader.com/
  • Aria2GUI-for-Windows: window下aria2专用工具

chrome插件:

  • https://github.com/acgotaku/BaiduExporter
  • https://github.com/acgotaku/115
  • https://github.com/binux/ThunderLixianExporter

参考

  • http://skypegnu1.blog.51cto.com/8991766/1637168
  • http://moflying.com/2016/06/05/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8aria2%E5%8F%8Awebui-aria2%E4%B8%8B%E8%BD%BD%E7%99%BE%E5%BA%A6%E4%BA%91%E8%B5%84%E6%BA%90/

PHP设计模式

发表于 2017-08-27 | | 阅读次数

笔记内容来自慕课 大话PHP设计模式。

一、面向对象的高级特性

这里主要是学习 第三章、命名空间和Autoload 和 第四章、PHP面向对象 2章的内容笔记

命名空间 namespace

类自动载入

旧的方法

1
2
3
4
5
6
7
8
9
10
11
12
Test1::test();
Test2::test();
function __autoload($class){
require __DIR__ . '/' . $class . '.php';
}
spl_autoload_register('autoload2');
function autoload2(){
require __DIR__ . '/' . $class . '.php';
}

PSR-0规范内容:

  1. 命名空间必须与绝对路径一致
  2. 类名首字母必须大写
  3. 除入口文件外,其他.php必须只有一个类

开发符合psr-0规范的基础框架

  1. 全部使用命名空间
  2. 所有php文件必须自动载入,不能有include/require
  3. 单一入口

SPL库的使用(php标准库)

主要参考文档:php标准库

  1. SplStack、SplQueue、SplHeap、SplFixedArray等数据结构类
  2. ArrayIterator、AppendIterator、Countable、ArrayObject
  3. SPL提供的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$stack = new SplStack();
$stack->push("data1\n");
$stack->push("data2\n");
echo $stack->pop(); // data2
echo $stack->pop(); // data1
$queue = new SplQueue();
$queue->enqueue("data1\n");
$queue->enqueue("data2\n");
echo $queue->dequeue(); // data1
echo $queue->dequeue(); // data2
// 堆 (最小结构堆)
$heap = new SplMinHeap();
$heap->insert("data1\n");
$heap->insert("data2\n");
echo $heap->extract(); // data1
echo $heap->extract(); // data2
// 固定尺寸(长度)的数组
$array = new SplFixedArray(10);
$array[0] = 123;
$array[9] = 1234;

php链式操作

链式操作实现: $db->where()->get();

每个方法有返回值

php魔术方法的使用

  1. get/set:
  2. call/callstatic:
  3. __toString:
  4. __invoke: 将一个php对象当做一个函数执行

二、设计模式

3种基本设计模式

  1. 工厂模式:工厂方法或者类生产对象,而不是在代码中直接new
  2. 单例模式:使某个类的对象仅允许创建一个
  3. 注册模式:全局共享和交换对象

其他设计模式

适配器模式
策略模式
数据对象映射模式
观察者模式
原型模式
装饰器模式
迭代器模式
代理模式

一、工厂模式

Linux下载工具curl使用

发表于 2017-08-23 | 分类于 linux | | 阅读次数

alt

curl是一个开源的用于数据传输的命令行工具与库,它使用URL语法格式,支持众多传输协议,包括:HTTP、HTTPS、FTP、FTPS、GOPHER、TFTP、SCP、SFTP、SMB、TELNET、DICT、LDAP、LDAPS、FILE、IMAP、SMTP、POP3、RTSP和RTMP。curl库提供了很多强大的功能,你可以利用它来进行HTTP/HTTPS请求、上传/下载文件等,且支持Cookie、认证、代理、限速等。

一、CURL使用

常用的一些参数

  • -e,--referer <URL>: 指定来源的网页
  • -v: 显示http握手过程
  • -i: 显示header信息
  • -I: 只显示header信息
  • --trace,--trace-ascii <FILE> : 查看更详细的通信过程
  • -X POST --data "data=xxx",--data-urlencode "date=April 1":POST参数,使用–data-urlencode配置时会对参数进行urlencode
  • --form upload=<localfilename> --form press=OK:文件上传
  • --user-agent "[User Agent]":UA参数
  • -c <cookie file>: 保存服务器返回的COOKIE文件
  • -b <cookie file>: 使用COOKIE文件
  • -H,--header '<param>':自定义头信息,上面其他的参数都可以在这里写完整的header头信息;

1.1 URL访问

下面是curl常用的一些方法:

1
2
3
4
5
curl boxcore.xxx # 访问网页
curl -L itbilu.com # 跟踪URL重定向
curl -o [文件名] itbilu.com # 页面保存
curl -i itbilu.com # 查看头信息使用-i或--include参数,添加-i参数后,页面响应头会和页面源码(响应体)一块返回
curl -I itbilu.com # 只想查看响应头,可以使用-I或--head参数:

1.2 表单提交和文件上传

1
2
3
4
5
6
curl https://itbilu.com/?keyword=linux&page=3
curl -X POST --data 'keyword=linux' itbilu.com # -X参数指定请求方法,--data参数添加提交数据
curl -X DELETE itbilu.com/examlple.html # 其它HTTP请求方法,比如使用DELETE请求
curl -X PUT --data 'keyword=linux' itbilu.com # 使用PUT请求,并指定请求数据
curl -T ./index.html www.uploadhttp.com/receive.cgi # curl支持文件上传,上传文件时使用-T或--upload-file参数

1.3 HTTPS支持

1
2
curl https://itbilu.com
curl -E mycert.pem https:/itbilu.com # 如果使用的本地ssl证书认证的HTTPS,可以通过-E或--cert参数指定本地证书

1.4 添加请求头

1
curl -H 'Content-Type:application/json' -H 'Authorization: account pswd' itbilu.com # 指定Content-Type及Authorization请求头:

1.5 Cookie支持

Cookie是一种常用的保持服务端会话信息的方法,crul也支持使用Cookie。
可以通过–cookie参数指定发送请求时的Cookie值,也可以通过-b [文件名]来指定一个存储了Cookie值的本地文件:curl -b stored_cookies_in_file itbilu.com

Cookie值可能会被服务器所返回的值所修改,并应用于下次HTTP请求。这时,可以能过-c参数指定存储服务器返回Cookie值的存储文件:curl -b cookies.txt -c newcookies.txt itbilu.com

除以上用法外,curl还可以设置用户代理(客户端)信息、使用代理服务器、指定认证用户名/密码等。详见:curl语法及选项

二、curl语法及选项

语法

curl语法结构如下:

curl [options…]

参数选项

curl(7.29.0)所支持的选项(options)参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
在以下选项中,(H) 表示仅适用 HTTP/HTTPS ,(F) 表示仅适用于 FTP
--anyauth 选择 "any" 认证方法 (H)
-a, --append 添加要上传的文件 (F/SFTP)
--basic 使用HTTP基础认证(Basic Authentication)(H)
--cacert FILE CA 证书,用于每次请求认证 (SSL)
--capath DIR CA 证书目录 (SSL)
-E, --cert CERT[:PASSWD] 客户端证书文件及密码 (SSL)
--cert-type TYPE 证书文件类型 (DER/PEM/ENG) (SSL)
--ciphers LIST SSL 秘钥 (SSL)
--compressed 请求压缩 (使用 deflate 或 gzip)
-K, --config FILE 指定配置文件
--connect-timeout SECONDS 连接超时设置
-C, --continue-at OFFSET 断点续转
-b, --cookie STRING/FILE Cookies字符串或读取Cookies的文件位置 (H)
-c, --cookie-jar FILE 操作结束后,要写入 Cookies 的文件位置 (H)
--create-dirs 创建必要的本地目录层次结构
--crlf 在上传时将 LF 转写为 CRLF
--crlfile FILE 从指定的文件获得PEM格式CRL列表
-d, --data DATA HTTP POST 数据 (H)
--data-ascii DATA ASCII 编码 HTTP POST 数据 (H)
--data-binary DATA binary 编码 HTTP POST 数据 (H)
--data-urlencode DATA url 编码 HTTP POST 数据 (H)
--delegation STRING GSS-API 委托权限
--digest 使用数字身份验证 (H)
--disable-eprt 禁止使用 EPRT 或 LPRT (F)
--disable-epsv 禁止使用 EPSV (F)
-D, --dump-header FILE 将头信息写入指定的文件
--egd-file FILE 为随机数据设置EGD socket路径(SSL)
--engine ENGINGE 加密引擎 (SSL). "--engine list" 指定列表
-f, --fail 连接失败时不显示HTTP错误信息 (H)
-F, --form CONTENT 模拟 HTTP 表单数据提交(multipart POST) (H)
--form-string STRING 模拟 HTTP 表单数据提交 (H)
--ftp-account DATA 帐户数据提交 (F)
--ftp-alternative-to-user COMMAND 指定替换 "USER [name]" 的字符串 (F)
--ftp-create-dirs 如果不存在则创建远程目录 (F)
--ftp-method [MULTICWD/NOCWD/SINGLECWD] 控制 CWD (F)
--ftp-pasv 使用 PASV/EPSV 替换 PORT (F)
-P, --ftp-port ADR 使用指定 PORT 及地址替换 PASV (F)
--ftp-skip-pasv-ip 跳过 PASV 的IP地址 (F)
--ftp-pret 在 PASV 之前发送 PRET (drftpd) (F)
--ftp-ssl-ccc 在认证之后发送 CCC (F)
--ftp-ssl-ccc-mode ACTIVE/PASSIVE 设置 CCC 模式 (F)
--ftp-ssl-control ftp 登录时需要 SSL/TLS (F)
-G, --get 使用 HTTP GET 方法发送 -d 数据 (H)
-g, --globoff 禁用的 URL 队列 及范围使用 {} 和 []
-H, --header LINE 要发送到服务端的自定义请求头 (H)
-I, --head 仅显示响应文档头
-h, --help 显示帮助
-0, --http1.0 使用 HTTP 1.0 (H)
--ignore-content-length 忽略 HTTP Content-Length 头
-i, --include 在输出中包含协议头 (H/F)
-k, --insecure 允许连接到 SSL 站点,而不使用证书 (H)
--interface INTERFACE 指定网络接口/地址
-4, --ipv4 将域名解析为 IPv4 地址
-6, --ipv6 将域名解析为 IPv6 地址
-j, --junk-session-cookies 读取文件中但忽略会话cookie (H)
--keepalive-time SECONDS keepalive 包间隔
--key KEY 私钥文件名 (SSL/SSH)
--key-type TYPE 私钥文件类型 (DER/PEM/ENG) (SSL)
--krb LEVEL 启用指定安全级别的 Kerberos (F)
--libcurl FILE 命令的libcurl等价代码
--limit-rate RATE 限制传输速度
-l, --list-only 只列出FTP目录的名称 (F)
--local-port RANGE 强制使用的本地端口号
-L, --location 跟踪重定向 (H)
--location-trusted 类似 --location 并发送验证信息到其它主机 (H)
-M, --manual 显示全手动
--mail-from FROM 从这个地址发送邮件
--mail-rcpt TO 发送邮件到这个接收人(s)
--mail-auth AUTH 原始电子邮件的起始地址
--max-filesize BYTES 下载的最大文件大小 (H/F)
--max-redirs NUM 最大重定向数 (H)
-m, --max-time SECONDS 允许的最多传输时间
--metalink 处理指定的URL上的XML文件
--negotiate 使用 HTTP Negotiate 认证 (H)
-n, --netrc 必须从 .netrc 文件读取用户名和密码
--netrc-optional 使用 .netrc 或 URL; 将重写 -n 参数
--netrc-file FILE 设置要使用的 netrc 文件名
-N, --no-buffer 禁用输出流的缓存
--no-keepalive 禁用 connection 的 keepalive
--no-sessionid 禁止重复使用 SSL session-ID (SSL)
--noproxy 不使用代理的主机列表
--ntlm 使用 HTTP NTLM 认证 (H)
-o, --output FILE 将输出写入文件,而非 stdout
--pass PASS 传递给私钥的短语 (SSL/SSH)
--post301 在 301 重定向后不要切换为 GET 请求 (H)
--post302 在 302 重定向后不要切换为 GET 请求 (H)
--post303 在 303 重定向后不要切换为 GET 请求 (H)
-#, --progress-bar 以进度条显示传输进度
--proto PROTOCOLS 启用/禁用 指定的协议
--proto-redir PROTOCOLS 在重定向上 启用/禁用 指定的协议
-x, --proxy [PROTOCOL://]HOST[:PORT] 在指定的端口上使用代理
--proxy-anyauth 在代理上使用 "any" 认证方法 (H)
--proxy-basic 在代理上使用 Basic 认证 (H)
--proxy-digest 在代理上使用 Digest 认证 (H)
--proxy-negotiate 在代理上使用 Negotiate 认证 (H)
--proxy-ntlm 在代理上使用 NTLM 认证 (H)
-U, --proxy-user USER[:PASSWORD] 代理用户名及密码
--proxy1.0 HOST[:PORT] 在指定的端口上使用 HTTP/1.0 代理
-p, --proxytunnel 使用HTTP代理 (用于 CONNECT)
--pubkey KEY 公钥文件名 (SSH)
-Q, --quote CMD 在传输开始前向服务器发送命令 (F/SFTP)
--random-file FILE 读取随机数据的文件 (SSL)
-r, --range RANGE 仅检索范围内的字节
--raw 使用原始HTTP传输,而不使用编码 (H)
-e, --referer Referer URL (H)
-J, --remote-header-name 从远程文件读取头信息 (H)
-O, --remote-name 将输出写入远程文件
--remote-name-all 使用所有URL的远程文件名
-R, --remote-time 将远程文件的时间设置在本地输出上
-X, --request COMMAND 使用指定的请求命令
--resolve HOST:PORT:ADDRESS 将 HOST:PORT 强制解析到 ADDRESS
--retry NUM 出现问题时的重试次数
--retry-delay SECONDS 重试时的延时时长
--retry-max-time SECONDS 仅在指定时间段内重试
-S, --show-error 显示错误. 在选项 -s 中,当 curl 出现错误时将显示
-s, --silent Silent模式。不输出任务内容
--socks4 HOST[:PORT] 在指定的 host + port 上使用 SOCKS4 代理
--socks4a HOST[:PORT] 在指定的 host + port 上使用 SOCKSa 代理
--socks5 HOST[:PORT] 在指定的 host + port 上使用 SOCKS5 代理
--socks5-hostname HOST[:PORT] SOCKS5 代理,指定用户名、密码
--socks5-gssapi-service NAME 为gssapi使用SOCKS5代理服务名称
--socks5-gssapi-nec 与NEC Socks5服务器兼容
-Y, --speed-limit RATE 在指定限速时间之后停止传输
-y, --speed-time SECONDS 指定时间之后触发限速. 默认 30
--ssl 尝试 SSL/TLS (FTP, IMAP, POP3, SMTP)
--ssl-reqd 需要 SSL/TLS (FTP, IMAP, POP3, SMTP)
-2, --sslv2 使用 SSLv2 (SSL)
-3, --sslv3 使用 SSLv3 (SSL)
--ssl-allow-beast 允许的安全漏洞,提高互操作性(SSL)
--stderr FILE 重定向 stderr 的文件位置. - means stdout
--tcp-nodelay 使用 TCP_NODELAY 选项
-t, --telnet-option OPT=VAL 设置 telnet 选项
--tftp-blksize VALUE 设备 TFTP BLKSIZE 选项 (必须 >512)
-z, --time-cond TIME 基于时间条件的传输
-1, --tlsv1 使用 => TLSv1 (SSL)
--tlsv1.0 使用 TLSv1.0 (SSL)
--tlsv1.1 使用 TLSv1.1 (SSL)
--tlsv1.2 使用 TLSv1.2 (SSL)
--trace FILE 将 debug 信息写入指定的文件
--trace-ascii FILE 类似 --trace 但使用16进度输出
--trace-time 向 trace/verbose 输出添加时间戳
--tr-encoding 请求压缩传输编码 (H)
-T, --upload-file FILE 将文件传输(上传)到指定位置
--url URL 指定所使用的 URL
-B, --use-ascii 使用 ASCII/text 传输
-u, --user USER[:PASSWORD] 指定服务器认证用户名、密码
--tlsuser USER TLS 用户名
--tlspassword STRING TLS 密码
--tlsauthtype STRING TLS 认证类型 (默认 SRP)
--unix-socket FILE 通过这个 UNIX socket 域连接
-A, --user-agent STRING 要发送到服务器的 User-Agent (H)
-v, --verbose 显示详细操作信息
-V, --version 显示版本号并退出
-w, --write-out FORMAT 完成后输出什么
--xattr 将元数据存储在扩展文件属性中
-q .curlrc 如果作为第一个参数无效

三、我的实战操作

post数据

curl -d "username=xxx&password=abc&secret=true" "URL"

上传文件

通过脚本发送post请求,顺便附带文本数据,比如通过”浏览”选择本地的card.txt并上传发送post请求:
curl -F "blob=@card.txt;type=text/plain" "http://172.16.102.208:8089/wiapi/score?leaderboard_id=7778a8143f111272&score=40&app_key=8d49f16fe034b98b&_test_user=test01"

其中-F 为带文件的形式发送post请求, blob为文本框中的name元素对应的属性值。

指定hosts访问

curl -H “Host:jp.laikansha.com” “http://216.239.32.21/time.php“

参考

  • https://itbilu.com/linux/man/4yZ9qH_7X.html
1…141516…26
Zack Hwang

Zack Hwang

Go

257 日志
42 分类
76 标签
RSS
Links
  • 小白博客
  • 我的书单
© 2018 Zack Hwang
由 Hexo 强力驱动
主题 - NexT.Muse
又拍云