PHP php://input、php://output用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 244 次浏览 • 2016-12-05 10:28 • 来自相关话题

一、php://output输出流用法:  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   1、CLI模式通过php://output向终端输出内容:test.php文件:<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);输出:[root@aiezu.com ~]# php test.php
爱E族 2、Http模式通过php://output导出csv文件:  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");网页打开效果如下:



   二、php://input输入流用法:  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 1、PHP使用"php://input"接收XML数据:http test.php页面代码:<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}待提交xml.xml文件内容:<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>通过linux curl命令提交xml.xml:[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)  2、PHP使用"php://input"接收JSON数据:  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“六”节。
 3、PHP使用"php://input"接收文件内容:  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}提交测试:[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08
 三、附录:Linux curl命令详解PHP 输入、输出流合集 查看全部

一、php://output输出流用法:

  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   

1、CLI模式通过php://output向终端输出内容:

test.php文件:
<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);
输出:
[root@aiezu.com ~]# php test.php 
爱E族
 

2、Http模式通过php://output导出csv文件:

  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:
<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");
网页打开效果如下:
php_output流到处CSV文件.png

   

二、php://input输入流用法:

  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 

1、PHP使用"php://input"接收XML数据:

http test.php页面代码:
<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}
待提交xml.xml文件内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>
通过linux curl命令提交xml.xml:
[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)
  

2、PHP使用"php://input"接收JSON数据:

  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“”节。
 

3、PHP使用"php://input"接收文件内容:

  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:
<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}
提交测试:
[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08

 三、附录:

PHP命令行输入输出流STDIN/STDOUT/STDERR用法

PHPliuliangsong 发表了文章 • 0 个评论 • 269 次浏览 • 2016-12-04 21:27 • 来自相关话题

一、PHP STDIN、STDOUT、STDERR简介:  STDIN、STDOUT、STDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdin、php://stdout、php://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:原始流流打开副本描述STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息;STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息;  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  二、PHP STDIN用法:  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);运行结果:[root@aiezu.com ~]# php test.php
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com 三、PHP STDOUT用法:  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);运行结果:[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入; 四、PHP STDERR用法:  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);正常输出和错误输出分别定向到不同文件:[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;正常输出和错误输出合并定向到统一文件:[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;   四、附录:PHP 输入、输出流合集 查看全部

一、PHP STDIN、STDOUT、STDERR简介:

  STDINSTDOUTSTDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdinphp://stdoutphp://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:
原始流流打开副本描述
STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;
STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息
STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息
  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  

二、PHP STDIN用法:

  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:
<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);
运行结果:
[root@aiezu.com ~]# php test.php 
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com
 

三、PHP STDOUT用法:

  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:
<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);
运行结果:
[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入;
 

四、PHP STDERR用法:

  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:
<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);
正常输出和错误输出分别定向到不同文件:
[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;
正常输出和错误输出合并定向到统一文件:
[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;
  

 四、附录:

Linux curl命令get/post提交数据、json和文件全攻略

Linuxliuliangsong 发表了文章 • 0 个评论 • 1132 次浏览 • 2016-12-03 13:43 • 来自相关话题

  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。一、测试前准备:  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
} 二、GET请求方式:  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族

2、使用"-G"参数配合"-d"参数:[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php 
3、带特殊字符数据使用“--data-urlencode”:[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?

4、从文件中获取数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
) 三、POST基本类型请求方式(-d):  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded对、正是相当于html的如下表单:<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form> 
1、直接设置POST数据:[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?

2、从文件中获取POST数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
) 四、POST多类型表单数据请求方式(-F):  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722
相当于HTML的如下表单:<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form、-F):[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
2、使用"@"、"<"失去特殊意义的"--form-string":[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)
3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

) 五、POST上传文件(-F "@"字符的妙用):  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)


2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

) 六、POST提交JSON数据:  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)接收JSON的代码段:<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}  提示:除了Content-Type为multipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 七、附录:参考页面:Linux curl命令详解linux curl命令来路伪装(referer)和浏览器伪装(user-agent) 查看全部
  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。

一、测试前准备:

  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:
<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
 

二、GET请求方式:

  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:
[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 
2、使用"-G"参数配合"-d"参数:
[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:
curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php
 
3、带特殊字符数据使用“--data-urlencode”:
[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?
)
 
4、从文件中获取数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

三、POST基本类型请求方式(-d):

  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
对、正是相当于html的如下表单:
<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form>
 
1、直接设置POST数据:
[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?
)
 
2、从文件中获取POST数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

四、POST多类型表单数据请求方式(-F):

  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722

相当于HTML的如下表单:
<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form-F):
[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)

2、使用"@"、"<"失去特殊意义的"--form-string":
[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)

3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

)
 

五、POST上传文件(-F "@"字符的妙用):

  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:
[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)

)
 
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:
<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

)
 

六、POST提交JSON数据:

  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:
[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}'  http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
接收JSON的代码段:
<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
  提示:除了Content-Typemultipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 

七、附录:

参考页面:

一次由于磁盘空间满导致的MySQL故障

Mysqlliuliangsong 发表了文章 • 0 个评论 • 175 次浏览 • 2016-12-03 11:45 • 来自相关话题

一、故障描述:
  今天早上起来,发现收到了邮件报警,提示网站500错误。测试服务器上的网站,凡是没使用数据库的页面能正常打开、而使用到数据库的要么500错误,要么一直在加载中。
 
二、追根溯源:
1、“show processlist”:
  看到这种现象,第一个想到的可能是不良SQL语句导致的锁表,才会导致网站页面一直加载中;连接到数据库,发现“use dbname”语句不能用,也就是不能切换数据库;直接运行“show processlist”查看正在运行的SQL语句,发现有好几百条SQL语句未执行完正常退出,选了两条时间最长的:Id User Host db Command Time State Info
4507153 root localhost:35745 ad Execute 1568 query end INSERT INTO `sessions` (`id`, `modified`, `data`, `lifetime`) VALUES (?, ?, ?, ?)
4507157 root localhost:35752 ad Query 1566 Opening tables DESCRIBE `sessions`  可以看出,就是简单的插入操作和显示表结果操作,所以不使用由于SQL语句不良导致的锁表;想“DESCRIBE `sessions`”复原错误现场试试,但是由于切换不了数据库,只能暂时放弃。所以这里找不出问题所在,决定看看MySQL日志看看。

2、mysqld日志:
  打开MySQL日志(日志文件的路径在“/etc/my.cnf”中指定,默认为“/var/log/mysqld.log”),终于在日志文件底部发现了那么几行错误:161203 10:30:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:30:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs
161203 10:40:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:40:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs
161203 10:50:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:50:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs  从上面错误提示可以看出,写“sessions”表索引文件时发现磁盘空间不足;
 
3、清理磁盘空间:
  使用“df -h”命令查看当前磁盘空间的使用情况,发现我的“/storage”挂载点的磁盘空间使用率确实达到了“100%”:[root@aiezu.com ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 11G 7.7G 59% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdb1 189G 189G 0G 100% /storage  当然,如果即使使用“df -h”命令查看磁盘空间使用率不是“100%”,还得使用“df -i”命令看看磁盘的“inode”使用率,如果“inode”用完,也会导致无法创建文件:[root@aiezu.com ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 1310720 640191 670529 49% /
tmpfs 490142 1 490141 1% /dev/shm
/dev/xvdb1 26214408 1451980 24762428 6% /storage  发现磁盘空间不足后,删除到一些不重要的上传文件腾出了一半的磁盘空间:[root@aiezu.com ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 11G 7.7G 59% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdb1 189G 98G 91G 51% /storage 
三、前因后果:
  重启数据库后,发现其他网站正常了,而有一个原来加载很慢的网站,现在刷新直接报500错误了;查看此网站的错误日志,发现依然是提示“sessions”表有错误。
  再次连接到MySQL,切换到站点的数据库,执行“select * from sessions limit 1”语句,提示如下错误:mysql> use ad;
Database changed
mysql> select * from sessions limit 1;
ERROR 145 (HY000): Table './ad/sessions' is marked as crashed and should be repaired  看来是由于磁盘空间满的时候导致表文件损坏,经网上搜索,使用下面命令成功将表修复,问题全部得到解决:[root@aiezu.com ~]# myisamchk -c -r /storage/aiezu.com/mysql/ad/sessions.MYI
- recovering (with sort) MyISAM-table '/storage/aiezu.com/mysql/ad/sessions.MYI'
Data records: 8
- Fixing index 1
- Fixing index 2 
四、总结:
  这次的问题非常严重,导致了好几个站点不能正常访问,极大的影响了用户和搜索引擎对网站的信任;主要是由于未预计到用户的图片上传量,未及时扩充磁盘空间,也没有做磁盘空间监控,确实应该深刻检讨。 查看全部
一、故障描述:
  今天早上起来,发现收到了邮件报警,提示网站500错误。测试服务器上的网站,凡是没使用数据库的页面能正常打开、而使用到数据库的要么500错误,要么一直在加载中。
 
二、追根溯源:
1、“show processlist”:
  看到这种现象,第一个想到的可能是不良SQL语句导致的锁表,才会导致网站页面一直加载中;连接到数据库,发现“use dbname”语句不能用,也就是不能切换数据库;直接运行“show processlist”查看正在运行的SQL语句,发现有好几百条SQL语句未执行完正常退出,选了两条时间最长的:
Id	User	Host	db	Command	Time	State	Info
4507153 root localhost:35745 ad Execute 1568 query end INSERT INTO `sessions` (`id`, `modified`, `data`, `lifetime`) VALUES (?, ?, ?, ?)
4507157 root localhost:35752 ad Query 1566 Opening tables DESCRIBE `sessions`
  可以看出,就是简单的插入操作和显示表结果操作,所以不使用由于SQL语句不良导致的锁表;想“DESCRIBE `sessions`”复原错误现场试试,但是由于切换不了数据库,只能暂时放弃。所以这里找不出问题所在,决定看看MySQL日志看看。

2、mysqld日志:
  打开MySQL日志(日志文件的路径在“/etc/my.cnf”中指定,默认为“/var/log/mysqld.log”),终于在日志文件底部发现了那么几行错误:
161203 10:30:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:30:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs
161203 10:40:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:40:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs
161203 10:50:39 [Warning] Disk is full writing '/storage/aiezu.com/mysql/ad/sessions.MYI' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
161203 10:50:39 [Warning] Retry in 60 secs. Message reprinted in 600 secs
  从上面错误提示可以看出,写“sessions”表索引文件时发现磁盘空间不足;
 
3、清理磁盘空间:
  使用“df -h”命令查看当前磁盘空间的使用情况,发现我的“/storage”挂载点的磁盘空间使用率确实达到了“100%”:
[root@aiezu.com ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 11G 7.7G 59% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdb1 189G 189G 0G 100% /storage
  当然,如果即使使用“df -h”命令查看磁盘空间使用率不是“100%”,还得使用“df -i”命令看看磁盘的“inode”使用率,如果“inode”用完,也会导致无法创建文件:
[root@aiezu.com ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 1310720 640191 670529 49% /
tmpfs 490142 1 490141 1% /dev/shm
/dev/xvdb1 26214408 1451980 24762428 6% /storage
  发现磁盘空间不足后,删除到一些不重要的上传文件腾出了一半的磁盘空间:
[root@aiezu.com ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 11G 7.7G 59% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdb1 189G 98G 91G 51% /storage
 
三、前因后果:
  重启数据库后,发现其他网站正常了,而有一个原来加载很慢的网站,现在刷新直接报500错误了;查看此网站的错误日志,发现依然是提示“sessions”表有错误。
  再次连接到MySQL,切换到站点的数据库,执行“select * from sessions limit 1”语句,提示如下错误:
mysql> use ad;
Database changed
mysql> select * from sessions limit 1;
ERROR 145 (HY000): Table './ad/sessions' is marked as crashed and should be repaired
  看来是由于磁盘空间满的时候导致表文件损坏,经网上搜索,使用下面命令成功将表修复,问题全部得到解决:
[root@aiezu.com ~]# myisamchk -c -r /storage/aiezu.com/mysql/ad/sessions.MYI 
- recovering (with sort) MyISAM-table '/storage/aiezu.com/mysql/ad/sessions.MYI'
Data records: 8
- Fixing index 1
- Fixing index 2
 
四、总结:
  这次的问题非常严重,导致了好几个站点不能正常访问,极大的影响了用户和搜索引擎对网站的信任;主要是由于未预计到用户的图片上传量,未及时扩充磁盘空间,也没有做磁盘空间监控,确实应该深刻检讨。

linux curl命令来路伪装(referer)和浏览器伪装(user-agent)

Linuxliuliangsong 发表了文章 • 0 个评论 • 455 次浏览 • 2016-12-02 11:05 • 来自相关话题

  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:<?php
print_r($_SERVER);测试返回:[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125

二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu 
2、“-H”参数的方式:# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
2、“-H”参数方式:# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
七、附录:
参考页面:Linux curl命令详解Linux curl命令get/post提交数据、json和文件全攻略 查看全部
  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:
[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/  
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact
  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:
<?php
print_r($_SERVER);
测试返回:
[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125
)
 
二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:
# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu
 
2、“-H”参数的方式:
# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com
 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:
# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36

2、“-H”参数方式:
# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

七、附录:
参考页面:

MySQL的selinux配置

Mysqlliuliangsong 发表了文章 • 0 个评论 • 184 次浏览 • 2016-12-01 16:53 • 来自相关话题

一、selinux的概念:
  selinux是Security Enhanced Linux (安全强化 Linux)的简称,selinux涉及到主体(subject,一般指进程)、操作(operation)、对象(object,又称资源,如:文件、网络端口),selinux用于控制“主体”能以何种“操作”方式访问什么“对象”。
  selinux环境中,所有的“主体(进程)”被赋予一个“domain”标签,所有的“对象”也被赋予一个“type”类型标签,“domain”标定的“主体”能访问哪些“type”标定的“对象”,由selinux的安全策略定义。
 
二、selinux环境:
selinux有三种状态,分别是:Enforcing:强制模式,selinux正严格按照策略运行中;Permissive:宽容模式,selinux正在运行中,但是只记录日志,不执行实际限制;Disabled:禁用模式,selinux环境未被开启;
 
  我们可以使用“getenforce”命令查看selinux是否在强制模式中运行:[root@aiezu.com ~]# getenforce
Disabled  如果状态为“Disabled”,我们必须在"/etc/sysconfig/selinux"文件中,将“SELINUX=disabled”改为“SELINUX=enforcing”,并重启服务器后才能开启;
  如果状态为“Permissive”,可以直接使用“setenforce 1”命令临时改为强制状态:[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# setenforce 1
[root@aiezu.com ~]# getenforce
Enforcing  
三、mysql服务中的selinux定义:
1、mysql进程主体的domain标签:
  在selinux环境中,mysqld的“domain”标签为“mysqld_t”、mysqld在受限的“mysqld_t”域中仅能访问指定的资源;

2、selinux环境中mysql能访问的资源标签:标签名用途mysqld_db_t 这种文件类型用于标记MySQL数据库数据文件;
在RHEL/CentOS中数据文件的默认位置是“/var/lib/mysql”;
如果修改了MySQL数据文件的位置,新的位置必须使用这种类型标签;mysqld_etc_t这种文件类型用于标记MySQL的配置文件;
默认位置为:
  主配置文件:“/etc/my.cnf”;
  其他配置文件:“/etc/my.cnf.d/”目录下的文件;mysqld_exec_t 这种文件类型用于标记MySQL主进程文件;
默认为:“/usr/libexec/mysqld”或者“/usr/sbin/mysqld”;
可以通过“whereis mysqld”命令查找;mysqld_initrc_exec_t 这种文件类型用于标记MySQL的初始化脚本;
默认为:“/etc/rc.d/init.d/mysqld”;
“service mysqld start”中“mysqld”用的就是此脚本;mysqld_log_t 这种文件类型用于标记日志文件;mysqld_var_run_t 这种文件类型用于标记MySQL运行时产生的文件;
默认在“/var/run/mysqld”目录中,主要包括:
  /var/run/mysqld/mysqld.pid
  /var/run/mysqld/mysqld.sock 
3、selinux中mysq的布尔变量:变量名含义allow_user_mysql_connect 当这个变量值为“1”时允许用户连接数据库;exim_can_connect_db 当这个变量值为“1”时允许exim邮件程序访问数据库服务器;ftpd_connect_db 当这个变量值为“1”时允许ftpd进程访问数据库服务器;httpd_can_network_connect_db当这个变量值为“1”时允许httpd进程访问数据库服务器; 
四、配置演示:
  下面演示在selinux环境中,由于修改了mysql的数据存放路径,而导致的selinux权限错误、及其修正方法;在测试前,我们得先得确认我们的linux系统处于“selinux”环境,请参考第二步。
  1、首先,我们在修改mysql路径前确定mysql是能正常运行的,并停止mysql服务:[root@aiezu.com ~]# service mysql stop
Shutting down MySQL.. SUCCESS!
[root@aiezu ~]# service mysql start
Starting MySQL. SUCCESS!
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 5166 mysql 10u IPv6 22791 0t0 TCP *:mysql (LISTEN)
[root@aiezu.com ~]# service mysql stop
Shutting down MySQL.. SUCCESS!
  2、创建新的mysql数据存放路径,并使用“mysql_install_db”初始化目录;我这里只是测试,原数据库的数据不需要保留,如果需要保留,需要想将原数据库备份,修改路径完成正常运行后再恢复:[root@aiezu.com ~]# mkdir -p /storage/db
[root@aiezu.com ~]# mysql_install_db --datadir=/storage/db/
[root@aiezu.com ~]# chown -R mysql:mysql /storage/db/
  3、在mysql的配置文件"/etc/my.cnf"中,在"[mysqld]"组下,将"datadir="的值改成新的路径;修改后我的配置文件内容如下:[mysqld]
datadir=/storage/db/
socket=/storage/db/mysql.sock
pid-file=/storage/db/aiezu.com.pid

[mysqld_safe]
log-error=/var/log/mysqld.log

[client]
socket=/storage/db/mysql.sock  注意“[mysqld]”组和“[client]”组下的“socket=”后面的值要一致,否则运行mysql连接数据的时候会提示如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
   4、尝试启动MySQL,观察提示的错误(由于我们上面没有为新的mysql目录设置selinux权限,这里一定会报错的):[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/db/aiezu.com.pid).  在mysql的日志文件中能看到更详细的错误信息,可以在“my.cnf”中找到日志文件的路径,我这里的路径为“/var/log/mysqld.log”:161201 23:26:55 mysqld_safe Starting mysqld daemon with databases from /storage/db/
2016-12-01 23:26:56 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-12-01 23:26:56 0 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 0 [Note] /usr/sbin/mysqld (mysqld 5.6.34) starting as process 6215 ...
2016-12-01 23:26:56 6215 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 6215 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 6215 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-12-01 23:26:56 6215 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-12-01 23:26:56 6215 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-12-01 23:26:56 6215 [ERROR] InnoDB: The system tablespace must be writable!
...  可以看到日志文件中出现了“Permission denied”字样,这就是由于selinux权限引起的(上面我们设置了文件系统权限,所以不是文件系统权限引起的);
  5、使用chcon命令为mysql数据目录设置selinux权限,并启动mysql,发现启动成功:[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/db/
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 6590 mysql 10u IPv6 24127 0t0 TCP *:mysql (LISTEN)
[root@aiezu.com ~]# ps -eZ|grep mysqld
unconfined_u:system_r:mysqld_safe_t:s0 6437 ? 00:00:00 mysqld_safe
unconfined_u:system_r:mysqld_t:s0 6590 ? 00:00:00 mysqldchcon命令的用法请参考:http://aiezu.com/article/linux_chcon_command.html 查看全部
一、selinux的概念:
  selinux是Security Enhanced Linux (安全强化 Linux)的简称,selinux涉及到主体(subject,一般指进程)、操作(operation)、对象(object,又称资源,如:文件、网络端口),selinux用于控制“主体”能以何种“操作”方式访问什么“对象”。
  selinux环境中,所有的“主体(进程)”被赋予一个“domain”标签,所有的“对象”也被赋予一个“type”类型标签,“domain”标定的“主体”能访问哪些“type”标定的“对象”,由selinux的安全策略定义。
 
二、selinux环境:
selinux有三种状态,分别是:
  • Enforcing:强制模式,selinux正严格按照策略运行中;
  • Permissive:宽容模式,selinux正在运行中,但是只记录日志,不执行实际限制;
  • Disabled:禁用模式,selinux环境未被开启;

 
  我们可以使用“getenforce”命令查看selinux是否在强制模式中运行:
[root@aiezu.com ~]# getenforce 
Disabled
  如果状态为“Disabled”,我们必须在"/etc/sysconfig/selinux"文件中,将“SELINUX=disabled”改为“SELINUX=enforcing”,并重启服务器后才能开启;
  如果状态为“Permissive”,可以直接使用“setenforce 1”命令临时改为强制状态:
[root@aiezu.com ~]# getenforce 
Permissive
[root@aiezu.com ~]# setenforce 1
[root@aiezu.com ~]# getenforce
Enforcing
  
三、mysql服务中的selinux定义:
1、mysql进程主体的domain标签:
  在selinux环境中,mysqld的“domain”标签为“mysqld_t”、mysqld在受限的“mysqld_t”域中仅能访问指定的资源;

2、selinux环境中mysql能访问的资源标签:
标签名用途
mysqld_db_t 这种文件类型用于标记MySQL数据库数据文件;
在RHEL/CentOS中数据文件的默认位置是“/var/lib/mysql”;
如果修改了MySQL数据文件的位置,新的位置必须使用这种类型标签;
mysqld_etc_t这种文件类型用于标记MySQL的配置文件;
默认位置为:
  主配置文件:“/etc/my.cnf”;
  其他配置文件:“/etc/my.cnf.d/”目录下的文件;
mysqld_exec_t 这种文件类型用于标记MySQL主进程文件;
默认为:“/usr/libexec/mysqld”或者“/usr/sbin/mysqld”;
可以通过“whereis mysqld”命令查找;
mysqld_initrc_exec_t 这种文件类型用于标记MySQL的初始化脚本;
默认为:“/etc/rc.d/init.d/mysqld”;
“service mysqld start”中“mysqld”用的就是此脚本;
mysqld_log_t 这种文件类型用于标记日志文件;
mysqld_var_run_t 这种文件类型用于标记MySQL运行时产生的文件;
默认在“/var/run/mysqld”目录中,主要包括:
  /var/run/mysqld/mysqld.pid
  /var/run/mysqld/mysqld.sock
 
3、selinux中mysq的布尔变量:
变量名含义
allow_user_mysql_connect 当这个变量值为“1”时允许用户连接数据库;
exim_can_connect_db 当这个变量值为“1”时允许exim邮件程序访问数据库服务器;
ftpd_connect_db 当这个变量值为“1”时允许ftpd进程访问数据库服务器;
httpd_can_network_connect_db当这个变量值为“1”时允许httpd进程访问数据库服务器;
 
四、配置演示:
  下面演示在selinux环境中,由于修改了mysql的数据存放路径,而导致的selinux权限错误、及其修正方法;在测试前,我们得先得确认我们的linux系统处于“selinux”环境,请参考第二步。
  1、首先,我们在修改mysql路径前确定mysql是能正常运行的,并停止mysql服务:
[root@aiezu.com ~]# service mysql stop
Shutting down MySQL.. SUCCESS!
[root@aiezu ~]# service mysql start
Starting MySQL. SUCCESS!
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 5166 mysql 10u IPv6 22791 0t0 TCP *:mysql (LISTEN)
[root@aiezu.com ~]# service mysql stop
Shutting down MySQL.. SUCCESS!

  2、创建新的mysql数据存放路径,并使用“mysql_install_db”初始化目录;我这里只是测试,原数据库的数据不需要保留,如果需要保留,需要想将原数据库备份,修改路径完成正常运行后再恢复:
[root@aiezu.com ~]# mkdir -p /storage/db
[root@aiezu.com ~]# mysql_install_db --datadir=/storage/db/
[root@aiezu.com ~]# chown -R mysql:mysql /storage/db/

  3、在mysql的配置文件"/etc/my.cnf"中,在"[mysqld]"组下,将"datadir="的值改成新的路径;修改后我的配置文件内容如下:
[mysqld]
datadir=/storage/db/
socket=/storage/db/mysql.sock
pid-file=/storage/db/aiezu.com.pid

[mysqld_safe]
log-error=/var/log/mysqld.log

[client]
socket=/storage/db/mysql.sock
  注意“[mysqld]”组和“[client]”组下的“socket=”后面的值要一致,否则运行mysql连接数据的时候会提示如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

   4、尝试启动MySQL,观察提示的错误(由于我们上面没有为新的mysql目录设置selinux权限,这里一定会报错的):
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/db/aiezu.com.pid).
  在mysql的日志文件中能看到更详细的错误信息,可以在“my.cnf”中找到日志文件的路径,我这里的路径为“/var/log/mysqld.log”:
161201 23:26:55 mysqld_safe Starting mysqld daemon with databases from /storage/db/
2016-12-01 23:26:56 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2016-12-01 23:26:56 0 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 0 [Note] /usr/sbin/mysqld (mysqld 5.6.34) starting as process 6215 ...
2016-12-01 23:26:56 6215 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 6215 [Warning] Can't create test file /storage/db/aiezu.lower-test
2016-12-01 23:26:56 6215 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-12-01 23:26:56 6215 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-12-01 23:26:56 6215 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-12-01 23:26:56 6215 [ERROR] InnoDB: The system tablespace must be writable!
...
  可以看到日志文件中出现了“Permission denied”字样,这就是由于selinux权限引起的(上面我们设置了文件系统权限,所以不是文件系统权限引起的);
  5、使用chcon命令为mysql数据目录设置selinux权限,并启动mysql,发现启动成功:
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/db/
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
[root@aiezu.com ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 6590 mysql 10u IPv6 24127 0t0 TCP *:mysql (LISTEN)
[root@aiezu.com ~]# ps -eZ|grep mysqld
unconfined_u:system_r:mysqld_safe_t:s0 6437 ? 00:00:00 mysqld_safe
unconfined_u:system_r:mysqld_t:s0 6590 ? 00:00:00 mysqld
chcon命令的用法请参考:http://aiezu.com/article/linux_chcon_command.html

Linux chcon命令参数详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 193 次浏览 • 2016-11-30 23:24 • 来自相关话题

  chcon命令用于修改文件的SELinux安全上下文;通俗的讲,chcon使用来修改文件的SELinuxccecel策略的;chcon命令由“coreutils”安装包提供。
 
一、chcon命令语法:chcon [选项]... 环境 文件...
chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
chcon [选项]... --reference=参考文件 文件... 
二、chcon命令参数:参数名描述-u 用户
--user=用户设置指定用户的目标安全环境; -r 角色
--role=角色设置指定角色的目标安全环境;-t 类型
--type=类型设置指定类型的目标安全环境;-l 范围
--range=范围设置指定范围的目标安全环境;-v
--verbose处理的所有文件时显示诊断信息;-R
--recursive递归处理目录/文件和子目录/文件;-h
--no-dereference影响符号连接而非引用的文件;--reference=file使用指定参考文件file的安全环境,而非指定值;-H 如果一个命令行参数是一个目录的符号链接,则遍历它;-L遍历每一个符号连接指向的目录;-P不遍历任何符号链接(默认);--help显示此帮助信息并退出;--version显示版本信息并退出; 
三、chcon用法演示:
1、mysql:让selinux允许mysqld做为数据目录访问“/storage/mysql”:[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql 
2、ftp:将共享目录开放给匿名用户:[root@aiezu.com ~]# chcon -R -t public_content_t /storage/ftp/

#允许匿名用户上传文件:
[root@aiezu.com ~]# chcon -R -t public_content_rw_t /storage/ftp
[root@aiezu.com ~]# setsebool -P allow_ftpd_anon_write=1 
3、为网站目录开放httpd访问权限:chcon -R -t httpd_sys_content_t /storage/web 查看全部
  chcon命令用于修改文件的SELinux安全上下文;通俗的讲,chcon使用来修改文件的SELinuxccecel策略的;chcon命令由“coreutils”安装包提供。
 
一、chcon命令语法:
chcon [选项]... 环境 文件...
chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
chcon [选项]... --reference=参考文件 文件...
 
二、chcon命令参数:
参数名描述
-u 用户
--user=用户
设置指定用户的目标安全环境;
 -r 角色
--role=角色
设置指定角色的目标安全环境;
-t 类型
--type=类型
设置指定类型的目标安全环境;
-l 范围
--range=范围
设置指定范围的目标安全环境;
-v
--verbose
处理的所有文件时显示诊断信息;
-R
--recursive
递归处理目录/文件和子目录/文件;
-h
--no-dereference
影响符号连接而非引用的文件;
--reference=file使用指定参考文件file的安全环境,而非指定值;
-H 如果一个命令行参数是一个目录的符号链接,则遍历它;
-L遍历每一个符号连接指向的目录;
-P不遍历任何符号链接(默认);
--help显示此帮助信息并退出;
--version显示版本信息并退出;
 
三、chcon用法演示:
1、mysql:让selinux允许mysqld做为数据目录访问“/storage/mysql”:
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
 
2、ftp:将共享目录开放给匿名用户:
[root@aiezu.com ~]# chcon -R -t public_content_t /storage/ftp/

#允许匿名用户上传文件:
[root@aiezu.com ~]# chcon -R -t public_content_rw_t /storage/ftp
[root@aiezu.com ~]# setsebool -P allow_ftpd_anon_write=1
 
3、为网站目录开放httpd访问权限:
chcon -R -t httpd_sys_content_t /storage/web

Starting MySQL. ERROR! The server quit without updating PID file

Linuxliuliangsong 发表了文章 • 0 个评论 • 186 次浏览 • 2016-11-30 17:59 • 来自相关话题

  今天安装好MySQL数据库后,在启动数据库时提示下面错误:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid). 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html 查看全部
  今天安装好MySQL数据库后,在启动数据库时提示下面错误:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
 
解决思路:
  遇到问题,在错误信息显示得不够完善的情况下,我们第一个应该想到的是看日志;mysql的日志在哪里呢?看“/etc/my.cnf”配置文件中的“log-error=”项,如“log-error=/var/log/mysqld.log”则日志文件在“/var/log/mysqld.log”。

  在日志文件中,我们看到了类似下列信息:
2016-11-30 22:53:29 2908 [Note] Plugin 'FEDERATED' is disabled.
^G/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)
2016-11-30 22:53:29 2908 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
2016-11-30 22:53:29 2908 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
2016-11-30 22:53:29 2908 [ERROR] InnoDB: The system tablespace must be writable!
...
日志中出现了类似“Permission denied”、“Can't determine file permissions”等信息,可以确定是“mysqld”访问文件权限的问题。导致此问题可能的原因有:磁盘空间问题、文件夹权限、setlinux权限的问题,下面是我的解决方法。
 
1、检查磁盘空间:
  使用“df -h”命令查看空间使用情况,尤其是空间占用达到90%以上的:
[root@aiezu.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 13G 3.8G 9.2G 30% /
devtmpfs 362M 0 362M 0% /dev
tmpfs 371M 0 371M 0% /dev/shm
tmpfs 371M 9.6M 362M 3% /run
tmpfs 371M 0 371M 0% /sys/fs/cgroup
/dev/sda1 497M 102M 396M 21% /boot
  使用“df -i”命令查看“Inode”的使用情况,如果“Inode”不足,也会无法创建文件:
[root@aiezu.com ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 13598720 41755 13556965 1% /
devtmpfs 92526 334 92192 1% /dev
tmpfs 94889 1 94888 1% /dev/shm
tmpfs 94889 359 94530 1% /run
tmpfs 94889 13 94876 1% /sys/fs/cgroup
/dev/sda1 512000 329 511671 1% /boot
 
2、文件系统权限:
  mysql的数据目录需要对“mysql”用户有读写执行:
[root@aiezu.com ~]# chown -R mysql.mysql /storage/mysql/
[root@aiezu.com ~]# ll /storage/mysql/
总用量 110600
-rw-rw----. 1 mysql mysql 12582912 11月 30 17:49 ibdata1
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:49 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 11月 30 17:48 ib_logfile1
drwx------. 2 mysql mysql 4096 11月 30 17:49 mysql
drwx------. 2 mysql mysql 4096 11月 30 17:49 performance_schema
drwx------. 2 mysql mysql 6 11月 30 17:48 test
 
3、selinux权限问题:
  如果希望判断是不是由于“selinux”导致的,可以使用“setenforce 0”命令暂时关闭“selinux”,再启动mysql服务试试:
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# getenforce
Enforcing
[root@aiezu.com ~]# setenforce 0
[root@aiezu.com ~]# getenforce
Permissive
[root@aiezu.com ~]# service mysql start
Starting MySQL... SUCCESS!
  确定是由“selinux”引起后,由于“setenforce 0”只能暂时关闭“selinux”,重启后又会打开,有两种方式解决:
  1. 在“/etc/sysconfig/selinux”(CentOS7以下版本)或“/etc/selinux/config”(CentOS7及以上版本)文件中将“SELINUX=enforcing”改成“SELINUX=disabled”,永久关闭“selinux”;
  2. 使用“chcon”命令配置“selinux”,使“selinux”对mysql相关目录开放权限;
[root@aiezu.com ~]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/storage/mysql/aiezu.com.pid).
[root@aiezu.com ~]# chcon -R -t mysqld_db_t /storage/mysql
[root@aiezu.com ~]# service mysql start
Starting MySQL. SUCCESS!
关于MySQL的SeLinux更多信息,请参考:http://aiezu.com/article/mysql_selinux_config.html

CentOS/RHEL下安装epel 支持

Linuxliuliangsong 发表了文章 • 0 个评论 • 132 次浏览 • 2016-11-30 15:17 • 来自相关话题

  epel是Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包;支持的系统包括但不限于:RHEL(Red Hat Enterprise Linux)、CentOS、SL(Scientific Linux )、OEL(Oracle Enterprise Linux);
  epel是yum的一个软件源仓库,能对centos/rehl的yum基础源进行扩充;安装了epel软件源后,很多不能使用yum安装的软件能通过yum安装;下面介绍epel安装方法:
 
一、yum方式安装:[root@aiezu.com ~]# yum list|grep epel-release
epel-release.noarch 7-8 epel如果使用“yum list|grep epel-release”命令能看到epel包、则可以使用yum方式安装:[root@aiezu.com ~]# yum -y install epel-release
二、手动安装:
  手动安装方式是下载epel rpm包后手动安装,我们可以根据自己系统的版本和cpu构架,从阿里云的镜像站“http://mirrors.aliyun.com/epel/”上下载epel安装包后安装:
查看系统版本和CPU构架:[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@aiezu.com ~]# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.1 (Source)安装:[root@aiezu.com ~]# wget http://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
[root@aiezu.com ~]# rpm -ivh epel-release-7-8.noarch.rpm 
三、检查安装:
1、如果成功安装,将在“/etc/yum.repos.d/”生成一个“epel.repo”文件:[root@aiezu.com ~]# ls -1 /etc/yum.repos.d/
CentOS-Base.repo
CentOS-Debuginfo.repo
CentOS-Sources.repo
CentOS-Vault.repo
CentOS-fasttrack.repo
epel-testing.repo
epel.repo2、通过“yum repolist”检查:[root@aiezu.com ~]# yum repolist|grep epel
* epel: mirror01.idc.hinet.net
*epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,849 
四、附录:
epel下载地址:阿里云下载:http://mirrors.aliyun.com/epel/fedoraproject.org:http://dl.fedoraproject.org/pub/epel/ 查看全部
  epel是Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包;支持的系统包括但不限于:RHEL(Red Hat Enterprise Linux)、CentOS、SL(Scientific Linux )、OEL(Oracle Enterprise Linux);
  epel是yum的一个软件源仓库,能对centos/rehl的yum基础源进行扩充;安装了epel软件源后,很多不能使用yum安装的软件能通过yum安装;下面介绍epel安装方法:
 
一、yum方式安装:
[root@aiezu.com ~]# yum list|grep epel-release
epel-release.noarch 7-8 epel
如果使用“yum list|grep epel-release”命令能看到epel包、则可以使用yum方式安装:
[root@aiezu.com ~]# yum -y install epel-release

二、手动安装:
  手动安装方式是下载epel rpm包后手动安装,我们可以根据自己系统的版本和cpu构架,从阿里云的镜像站“http://mirrors.aliyun.com/epel/”上下载epel安装包后安装:
查看系统版本和CPU构架:
[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@aiezu.com ~]# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.1 (Source)
安装:
[root@aiezu.com ~]# wget http://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
[root@aiezu.com ~]# rpm -ivh epel-release-7-8.noarch.rpm
 
三、检查安装:
1、如果成功安装,将在“/etc/yum.repos.d/”生成一个“epel.repo”文件:
[root@aiezu.com ~]# ls -1 /etc/yum.repos.d/
CentOS-Base.repo
CentOS-Debuginfo.repo
CentOS-Sources.repo
CentOS-Vault.repo
CentOS-fasttrack.repo
epel-testing.repo
epel.repo
2、通过“yum repolist”检查:
[root@aiezu.com ~]# yum repolist|grep epel
* epel: mirror01.idc.hinet.net
*epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,849
 
四、附录:
epel下载地址:

rtmpdump参数详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 212 次浏览 • 2016-11-29 21:38 • 来自相关话题

  rtmpdump是用来处理RTMP流媒体的工具包,支持rtmp://、rtmpt://、rtmpe://、rtmpte://、rtmps://等协议,有Windows、Linux等版本;
 
一、rtmpdump用法:rtmpdump -r url [-n hostname] [-c port] [-l protocol] [-S host:port] [-a app] [-t tcUrl] [-p pageUrl] [-s swfUrl] [-f flashVer] [-u auth] [-C conndata] [-y playpath] [-Y] [-v] [-d subscription] [-e] [-k skip] [-A start] [-B stop] [-b buffer] [-m timeout] [-T key] [-w swfHash] [-x swfSize] [-W swfUrl] [-X swfAge] [-o output] [-#] [-q] [-V] [-z] 
二、参数详解:参数组参数描述网


数这些选项定义如何连接到RTMP流媒体服务器:--rtmp url
-r urlRTMP流内容的URL;--host hostname
-n hostname覆盖RTMP流内容URL的主机地址;--port port
-c port覆盖RTMP流内容URL的端口号;--protocol num
-l num覆盖RTMP流内容URL的协议;支持一下值:
  0 = rtmp
  1 = rtmpt
  2 = rtmpe
  3 = rtmpte
  4 = rtmps
  5 = rtmpts--socks host:port
-S host:port使用指定SOCKS4代理服务器;连


数这些选项定义RTMP内容连接请求包。如果没有提供正确的值,媒体服务器将拒绝连接尝试:--app app
-a app连接到RTMP服务器的应用名称,会覆盖RTMP URL中的app;
有时rtmpdump URL无法正确自动解析app名称,这时必须使用该选项;--tcUrl url
-t url目标流的URL;默认为自定根据参数拼接为:
  rtmp[e]://host[:port]/app/playpath;
 --pageUrl url
-p url媒体嵌入网页的URL;
默认情况下没有被发送的价值;--swfUrl url
-s url该媒体swf播放器的URL;
默认情况下没有被发送的价值;--flashVer ver
-f verswf播放器使用的Flash版本;
默认是"LNX 10,0,32,18"; --auth string
-u string将要添加到连接的身份验证字符串;
使用此选项将添加一个布尔值,然后将指定的字符串;
此选项仅用于特定服务,已过时,请使用“--conn”选项来代替; --conn type:data
-C type:data在连接参数添加任意AMF数据;
类型必须为:
  B:布尔值,使用0、1分别表示FLASE、TRUE;
  N:数字;
  S:字符串; 
  O:对象,使用1、0分别作为对象的开始、结束标记;对象的子数据、在数据类型前加“N”、并指定值的名称,如:“NB:myFlag:1”;完整对象例子:
    -C O:1 -C NS:name:爱E族 -C NS:site:aiezu.com -C O:0
  Z:“null”;

这选项可以多次使用,构造任意AMF序列。例如:
  -C B:1 -C S:authMe -C O:1 -C NN:code:1.23 -C NS:flag:ok -C O:0会









 这些选项在连接请求成功后生效:--playpath path
-y path覆盖RTMP URL解析的playpath(播放路径);
rtmpdump有时不能正确解析playpath,通过该选项明确指定;--playlist
-Y在play命令之前发送set_playlist命令;
否则播放列表将会值包含playpath;--live
-v指定媒体是一个直播流;
直播流没有resuming或seeking的可能;--subscribe stream
-d stream订阅的实时流名称,默认playpath;--resume
-e恢复一个不完整的rtmp流下载;--skip num
-k num恢复时寻找最后一个关键帧跳过的关键帧数;
如果经常尝试恢复失败,这可能有用,默认0;--start num
-A num流起始点秒数,实时流无效;--stop num
-B num该流停止点秒数;--buffer num
-b num设置缓冲时间数毫秒;
默认为36000000;--timeout num
-m numnum秒后没有收到任何数据会话超时,默认值120;安


数这些选项处理额外的身份验证,来自服务器的要求:--token key
-T key输入安全令牌响应,如果服务器需要使用安全令牌验证;--swfhash hex
-w hexswf文件的SHA256 hash 数值. 如果服务器使用swf验证,该选项会被用到, 看下面“--swfVfy”选项;该哈希值是32字节,并且必须以十六进制表示;始终与“--swfsize” 选项一起使用;--swfsize num
-x num解压后SWF文件大小,服务器swf验证时可能需要此选项;看下面“--swfVfy”选项;始终与“--swfhash”选项一起使用;--swfVfy url
-W urlswf播放器的URL,此选项将替换所以三个“--swfUrl”、“--swfhash”和“--swfsize选项”;使用此选项时,swf播放器将从指定URL检索,并自动计算哈希和大小;此外信息缓存在一个swfinfo文件在用户主目录,所以它在每次rtmpdump运行时,并不需要检索和重新计算;swfinfo记录URL,生成时间,修改SWF文件时间,它的大小,它的哈希,默认情况下,缓冲信息用于30天,然后重新检测;--swfAge days
-X days指定使用缓存的swf信息天数,然后重新检查,使用0为经常检查,如果检查显示swf具有相同的修改时间戳,它不会被再次检索;其
他--flv output
-o output指定输出文件名;
如果名字是“-”或被省略,流写入到stdout;--hashes
-#显示流百分比进度条;--quiet
-q制止所以命令的输出;--verbose
-V详细输出;--debug
-zdebug输出级,最详细可输出所有分组数据;--help
-h查看帮助; 
三、退出状态:0:程序执行完成;1:不可恢复的错误;2:不完全转移,可能会得到进一步恢复;
 
四、参考:
rtmpdump官网:http://rtmpdump.mplayerhq.hu/(官网上有各个版本下载链接) 查看全部
  rtmpdump是用来处理RTMP流媒体的工具包,支持rtmp://、rtmpt://、rtmpe://、rtmpte://、rtmps://等协议,有Windows、Linux等版本;
 
一、rtmpdump用法:
rtmpdump -r url  [-n hostname]  [-c port]  [-l protocol] [-S host:port] [-a app] [-t tcUrl] [-p pageUrl] [-s swfUrl] [-f flashVer] [-u auth] [-C conndata] [-y playpath] [-Y] [-v] [-d subscription] [-e] [-k skip] [-A start] [-B stop]  [-b buffer]  [-m timeout]  [-T key]  [-w swfHash]  [-x swfSize]  [-W swfUrl] [-X swfAge] [-o output] [-#] [-q] [-V] [-z]
 
二、参数详解:
参数组参数描述



这些选项定义如何连接到RTMP流媒体服务器:
--rtmp url
-r url
RTMP流内容的URL;
--host hostname
-n hostname
覆盖RTMP流内容URL的主机地址;
--port port
-c port
覆盖RTMP流内容URL的端口号;
--protocol num
-l num
覆盖RTMP流内容URL的协议;支持一下值:
  0 = rtmp
  1 = rtmpt
  2 = rtmpe
  3 = rtmpte
  4 = rtmps
  5 = rtmpts
--socks host:port
-S host:port
使用指定SOCKS4代理服务器;



这些选项定义RTMP内容连接请求包。如果没有提供正确的值,媒体服务器将拒绝连接尝试:
--app app
-a app
连接到RTMP服务器的应用名称,会覆盖RTMP URL中的app;
有时rtmpdump URL无法正确自动解析app名称,这时必须使用该选项;
--tcUrl url
-t url
目标流的URL;默认为自定根据参数拼接为:
  rtmp[e]://host[:port]/app/playpath;
 
--pageUrl url
-p url
媒体嵌入网页的URL;
默认情况下没有被发送的价值;
--swfUrl url
-s url
该媒体swf播放器的URL;
默认情况下没有被发送的价值;
--flashVer ver
-f ver
swf播放器使用的Flash版本;
默认是"LNX 10,0,32,18";
 --auth string
-u string
将要添加到连接的身份验证字符串;
使用此选项将添加一个布尔值,然后将指定的字符串;
此选项仅用于特定服务,已过时,请使用“--conn”选项来代替;
 --conn type:data
-C type:data
在连接参数添加任意AMF数据;
类型必须为:
  B:布尔值,使用0、1分别表示FLASE、TRUE;
  N:数字;
  S:字符串; 
  O:对象,使用1、0分别作为对象的开始、结束标记;对象的子数据、在数据类型前加“N”、并指定值的名称,如:“NB:myFlag:1”;完整对象例子:
    -C O:1 -C NS:name:爱E族 -C NS:site:aiezu.com -C O:0
  Z:“null”;

这选项可以多次使用,构造任意AMF序列。例如:
  -C B:1 -C S:authMe -C O:1 -C NN:code:1.23 -C NS:flag:ok -C O:0










 
这些选项在连接请求成功后生效:
--playpath path
-y path
覆盖RTMP URL解析的playpath(播放路径);
rtmpdump有时不能正确解析playpath,通过该选项明确指定;
--playlist
-Y
在play命令之前发送set_playlist命令;
否则播放列表将会值包含playpath;
--live
-v
指定媒体是一个直播流;
直播流没有resuming或seeking的可能;
--subscribe stream
-d stream
订阅的实时流名称,默认playpath;
--resume
-e
恢复一个不完整的rtmp流下载;
--skip num
-k num
恢复时寻找最后一个关键帧跳过的关键帧数;
如果经常尝试恢复失败,这可能有用,默认0;
--start num
-A num
流起始点秒数,实时流无效;
--stop num
-B num
该流停止点秒数;
--buffer num
-b num
设置缓冲时间数毫秒;
默认为36000000;
--timeout num
-m num
num秒后没有收到任何数据会话超时,默认值120;



这些选项处理额外的身份验证,来自服务器的要求:
--token key
-T key
输入安全令牌响应,如果服务器需要使用安全令牌验证;
--swfhash hex
-w hex
swf文件的SHA256 hash 数值. 如果服务器使用swf验证,该选项会被用到, 看下面“--swfVfy”选项;该哈希值是32字节,并且必须以十六进制表示;始终与“--swfsize” 选项一起使用;
--swfsize num
-x num
解压后SWF文件大小,服务器swf验证时可能需要此选项;看下面“--swfVfy”选项;始终与“--swfhash”选项一起使用;
--swfVfy url
-W url
swf播放器的URL,此选项将替换所以三个“--swfUrl”、“--swfhash”和“--swfsize选项”;使用此选项时,swf播放器将从指定URL检索,并自动计算哈希和大小;此外信息缓存在一个swfinfo文件在用户主目录,所以它在每次rtmpdump运行时,并不需要检索和重新计算;swfinfo记录URL,生成时间,修改SWF文件时间,它的大小,它的哈希,默认情况下,缓冲信息用于30天,然后重新检测;
--swfAge days
-X days
指定使用缓存的swf信息天数,然后重新检查,使用0为经常检查,如果检查显示swf具有相同的修改时间戳,它不会被再次检索;

--flv output
-o output
指定输出文件名;
如果名字是“-”或被省略,流写入到stdout;
--hashes
-#
显示流百分比进度条;
--quiet
-q
制止所以命令的输出;
--verbose
-V
详细输出;
--debug
-z
debug输出级,最详细可输出所有分组数据;
--help
-h
查看帮助;
 
三、退出状态:
  • 0:程序执行完成;
  • 1:不可恢复的错误;
  • 2:不完全转移,可能会得到进一步恢复;

 
四、参考:
rtmpdump官网:http://rtmpdump.mplayerhq.hu/(官网上有各个版本下载链接)