curlshell脚本
A. 关于一个多线程shell脚本的函数调用问题
你这个是不行的 !
首先, shell 没有多线程的说法.
其实, 你这个伪多进程.
然后, 每个 & 产生一个shell子进程,每个子进程都是独立的.
再次, 子进程的变量父进程无法获取到.
所以,你最后 $d , $n 的值都不会变,都是 0 .
B. 如何通过一个变量在shell脚本一个curl命令
可以用sed编辑变量到模板文件,然后curl调用,使用——data-binary @文件名
C. CURL在shell下可以用多线程么
这是多进程吧,连多线程都算不上
php的多并发curl请求(curl_multi_系列函数),我记得没有什么限制吧,能贴一下代码上来吗?
shell下执行多个curl当然是多进程。甚至于像网络蚂蚁那样分块HTTP下载单个文件都未必是多线程,因为每个HTTP请求到头来还是单独的。
追究到底是用多进程还是多线程来做并发,无关紧要。但可以肯定的是:无论是用shell还是用php,同时启动多个/usr/bin/curl进程肯定是没问题的。
楼主应该追究的重点,我估计在于如何多个HTTP请求同时发到服务器上。由于连接服务器的时间前后有所不同,所以如果不认真处理,并发的时间一致性恐怕不好。
这个的解决方式是把连接请求一分为二,把创建连接和发送HTTP请求割裂开来操作。做法是让所有的并发端先连接到服务器,待连接全部就绪之后,再一起发送HTTP请求。
这个我查了一下,似乎不是curl能做得到的,需要写程序。
D. shell脚本如何重复执行命令
curl补上了-k,跳过https的证书验证
watch -d -n 3 "curl -k -sS --connect-timeout 2 -s 2 'https://www..com'"
E. 如何编写一个shell脚本
问题:
1、请求在线api, 获取json格式的返回结果
2、解析json里面的一个值
3、将该值存储到文件
开发准备:
1、shell
快速入门:
#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tut
for ((i=0; i<10; i++)); do
touch test_$i.txt
done
创建一个文件夹, 并在里面新建10个文件
2、curl
使用curl请求网络, 并获取返回值
curl基本用法:
$ curl www.sina.com
直接返回网页内容
$ curl -o [文件名] www.sina.com
将网页内容存储到文件中, 相当于wget命令
赋值操作:
response=$(curl www.sina.com)
echo $response
注意: =前后没有空格
jq
jq是命令行解析json的很好的工具
安装
直接到官网下载linux64版本(我是用本地下载好后传上服务器的, 之前直接在服务器用wget下载一直报错Segmentation fault, 折腾好久~)
将其到bin目录
cp jq-linux64 /usr/bin/jq
使用
然后就可以愉快的使用jq命令了:
可直接查看官网Tutorial
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5'
返回的是一个json数组列表
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
使用.直接指向json的根节点
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.[0]'
[0]为取数组的第0位的对象
jq '.[0] | {message: .commit.message, name: .commit.committer.name}'
可用过连续的.操作获取对应json对象中的属性值, 上面的命令将会生成一个{message: "....", name: "...."}的json对象.
shell文件读写
1、写
方式一:
将ll的内容写入fileName这个文件中
>是覆盖, >>是在后面追加
ll >fileName
但是在书写.sh脚本的时候, 需要增加echo
echo ll>fileName
2、读
while read LINE
do
echo $LINE
done<fileName
fileName是即将读取的文件名
F. shell脚本实现执行http的一个post或者get方法是怎么实现的吖
你好,可以通过curl和wget两个命令发送http请求:
一、get请求:
1、使用curl命令:
curl “http://www..com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
curl -i “http://www..com” 显示全部信息
curl -l “http://www..com” 只显示头部信息
curl -v “http://www..com” 显示get请求全过程解析
2、使用wget命令:
wget “http://www..com”也可以
二、post请求
1、使用curl命令(通过-d参数,把访问参数放在里面):
curl -d “param1=value1¶m2=value2” “http://www..com”
2、使用wget命令:(--post-data参数来实现)
wget --post-data ‘user=foo&password=bar’ http://www..com
以上就是Linux模拟Http的get或post请求的方法了,这样一来Linux系统也能向远程服务器发送消息了。
示例:wget --post-data="" http://mcs-inner.99bill.com/mcs-gateway/mcs/task/clear
三、curl (可直接发送格式化请求例如json)
示例:目标url:http://fsc-inner.99bill.com/acs/deposit/{srcRef}
命令:curl -H "Content-type: application/json" -X POST -d '{"srcRef":"1002"}'http://fsc-inner.99bill.com/acs/deposit/1002
G. PHP 使用curl 执行远程服务器的一个shell脚本
可以啊,curl可以,http也可以啊
首先
假如远程服务器有这些文件php脚本和shell脚本(分析数据的脚本)是在目标服务器上
a.php
data.php
data.sh
然后在a脚本里面运行shell命令,exec("cd~/php/&&php./data.php&");
这样php就会运行data.php可以在data.php里面在运行sh脚本
或者直接在a.php里面运行sh脚本
然后把计算好的数据存入数据库
这样你就可以用http或者curl去激活a.php.然后分析数据的脚本也就运行了
大概了解没?
大哥你看明白没啊 是要给远程发送shell命令不是本地执行好吧?
远程动态输入命令?貌似不太安全啊~!
可以这样。a.php?cmd=cd~/&&shdata.sh
然后a.php里面这样写
exec("{$_GET["cmd"]}");
太危险,相当不推荐
可以做好命令,然后去执行
a.php?cmd=a
然后a.php里面这样写
switch($_GET["cmd"]}){
case"a":
exec("cd~/php/&&php./data.php&");
break;
case"b":
exec("cd~/php/&&php./xxxx.php&");
break;
}
H. CURL在shell下可以用多线程么
分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用。 以下脚本功能是通过scp(也可选rsync)向上千台...
I. CURL在shell下可以用多线程么
享Linux模拟线程并发脚本使用脚本同批量定义数量服务器执行相关命令比起普通for/while循环能顺序条条执行效率高非管理批服务器非实用
脚本功能通scp(选rsync)向千台服务器传更新包脚本运行同台50scp进程向服务器传包
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk '{print $1}'` #滤服务器IP
dir='/usr/local/src' #目标路径
thead_num=50 #自定义并发数根据自身服务器性能或应用调整始千万别定义太避免管理机宕机
tmp_fifo_file="/tmp/$$.fifo" #进程ID号命名管道文件
mkfifo $tmp_fifo_file #创建临管道文件
exec 4>$tmp_fifo_file #读写式打tmp_fifo_file管道文件,文件描述符4取3-9任意描述符
rm -f $tmp_fifo_file #删除临管道文件删除
for ((i=0;i<$thead_num;i++)) #利用for循环向管道输入并发数量空行
do
echo "" #输空行
done >&4 #输重导向定义文件描述符4
for i in $ip #循环所要执行服务器
do
read -u4 #管道读取行每行所行读取完毕执行挂起直管道空闲行
{
scp -P 1000 $1 $i:$dir #所要批量执行命令都放括号内scp简单实例替换任意其命令及命令组1000服务器端端口
sleep 3 #暂停3秒给系统缓冲间达限制并发进程数量
echo "" >&4 #再写入空行使挂起循环继续执行
}& #放入台执行
done
wait #等待所台进程执行完
exec 4>&- #删除文件描述符
exit 0