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