2016-02-02 89 views
0

我想送從一個shell腳本這個POST請求:捲曲過長的POST請求?

start=&limit=&selectNone=true&importId=111&saveCount=&save=some+keywords+%C3%BCbernehmen&list=7947&list=7983&list=7940&list=7976&list=7953&list=7989&list=7948&list=7984&list=7925&list=7961&toggleAllSelect=on&7947-select=true&7947-id=7947&7983-select=true&7983-id=7983&7940-select=true&7940-id=7940&7976-select=true&7976-id=7976 

解決方案,工程:

POSTString="--form selectNone=true --form save=some+keywords%C3%BCbernehmen --form toggleAllSelect=on" 
IMPORT_ID="$(curl -s -F username=$1 -F password=$2 --form "[email protected]$3" --form importSource=$4 --form format=formatCSV $5do/ImportPersonsFile | grep 'Import-ID' | grep -Eo '[0-9]{1,10}')" echo "Import-ID: $IMPORT_ID" 

duplicates="$(curl -s -F username=$1 -F password=$2 --form "[email protected]$3" --form importSource=$4 --form format=formatCSV $5do/ImportPersonsFile | grep 'Davon Dubletten' | grep -Eo '[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}')" 
if [ "$duplicates" -ne 0 ]; then 
ids=($(curl -s -F username=$1 -F password=$2 --form "[email protected]$3" --form importSource=asds --form format=formatCSV --form importId=$IMPORT_ID --form limit=9999999 $5do/ImportPersonsEditDuplicates | grep '\-id" v' | grep -Eo '>[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}')) 

for id in "${ids[@]}" 
do 
    POSTString="--form selectNone=true --form save=Als+Dublette+%C3%BCbernehmen --form toggleAllSelect=on --form list=$id --form $id-id=$id --form $id-select=true" 
    curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null 
    curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null 
done 
else 
echo "no duplicates" 
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null 
fi 
echo "done" 

我要的是一個解決方案如下,其中字符串被組裝內的-loop,然後只有一個curl命令用於所有迭代。像這樣的東西,不幸的是沒有工作。

$POSTString="--form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on" 
    for id in "${ids[@]}" 
do 
    POSTString="$POSTString --form list=$id --form $id-id=$id --form $id-select=true" 
done 
    curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null 
    curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null 
+0

看看我的答案是否有幫助;切換到數組無論如何是正確的;基於問題的標題,我添加了有關最大值的信息。命令行長度;如果它沒有幫助,請用_what_ly_不起作用更新您的答案,並且_how失敗_。 – mklement0

回答

2

穩健地存儲在Bash中的變量參數列表:

  • 使用陣列
  • 雙引號的所有變量引用,無論是在數組賦值和引用時陣列本身隨後
POSTString=(--form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on) 

for id in "${ids[@]}"; do 
    POSTString+=("${POSTString[@]}" --form list="$id" --form "$id-id=$id" --form "$id-select=true") 
done 

curl -s -F username="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsEditDuplicates" > /dev/null 
curl -s -F username="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsFinalise" > /dev/null 

如果我超過最大值的確是個問題。命令行長度,正如問題的標題所示(在Linux上最不可能,更可能在OS X上,甚至更可能在Cygwin上),您將看到一條錯誤消息,如Argument list too long[1]

要解決的限制,使用curl-K--config)選項,該選項指示curl從指定文件中讀取其參數,或者,如果-是選項參數,從標準帽子的提示Daniel Stenberg

查看man curl的具體細節;一個潛在的缺陷是包含嵌入空格的選項參數必須明確引用。


[1] getconf ARG_MAX會告訴你的上限系統的最大的。命令行長度;實際限制較低,取決於您的環境的大小。
此外,某些Linux系統對數量的參數還有長度的單個參數的限制。

+1

不要在命令行中輸入密碼,因爲命令行是公共的:'ps -ef' – ceving

+1

如果它確實是他命中的最大命令行限制,則可以使用curl的-K選項解決它,並讓它讀取stdin上的參數並通過巨大的參數來捲曲...... –