使用curl执行多个请求,使用不同的选项



我正在尝试使用curl将文件上传到sharepoint。使用以下文章中的建议,我可以通过三个步骤(即3次单独调用curl来签出文件、上传文件和签回文件)成功地做到这一点:

如何使用curl从sharepoint文档库签出文件?

我的个人请求看起来像:

# Checkout the index.html file
curl --ntlm --user ${USER} 
    --data @- 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckOutFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx << EOF
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <CheckOutFile xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <pageUrl>${FILE}</pageUrl>
      <checkoutToLocal>false</checkoutToLocal>
      <lastmodified/>
    </CheckOutFile>
  </soap:Body>
</soap:Envelope>
EOF
# upload the file
curl --ntlm -u ${USER} 
    -T HTML/2015/index.html 
    ${FOLDER}
curl --ntlm --user ${USER} 
    --data @- 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckInFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx << EOF
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CheckInFile xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <pageUrl>${FILE}</pageUrl>
      <comment>Automagic update</comment>
      <checkinType>0</checkinType>
    </CheckInFile>
  </soap:Body>
</soap:Envelope>
EOF

不幸的是,这导致cUrl向我询问密码3次(这是一个长密码!:-))。我也不喜欢.netrc文件的想法,因为将密码写入磁盘不是一个好主意。

因此,我认为我可能能够做的是将所有请求合并到一个命令行中,根据需要设置和删除头,使用bash进程替换等适当地提供请求体。

curl --ntlm --user ${USER} 
    --trace-ascii publish.log 
    --data @<(echo "$CHECKOUT") 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckOutFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx 
    -H "SOAPAction:" 
    -H "Content-Type:" 
    -T HTML/2015/index.html 
    ${FOLDER} 
    --data @<(echo "$CHECKIN") 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckInFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx

不幸的是,cUrl似乎同时处理所有选项,然后才尝试请求URL,导致一个URL的选项覆盖另一个URL,最终什么都不起作用。日志文件中的一个片段:

> 0000: PUT /xxx/xxx/_vti_bin/Lists.asmx HTTP/1.1
> 0033: Authorization: NTLM AAAAAAAAAAA=
> 0075: User-Agent: curl/7.30.0
> 008e: Host: example.com
> 00a8: Accept: */*
> 00b5: SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckOu
> 00f5: tFile
> 00fc: Content-Type: text/xml; charset=utf-8
> 0123: SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckIn
> 0163: File
> 0169: Content-Type: text/xml; charset=utf-8
> 0190: Content-Length: 0
> 01a3: Expect: 100-continue

注意重复的SOAPAction头,而我希望只应用第一个选项。

有没有办法说"现在停止处理选项,做这个URL,然后继续"?

如果只需要输入三次密码,则可以提示输入密码并在变量中读取,然后在curl命令中使用,如下所示。

echo "Password: "
read -s PASSWORD
# Checkout the index.html file
curl --ntlm --user ${USER}:${PASSWORD} 
    --data @- 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckOutFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx << EOF
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CheckOutFile xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <pageUrl>${FILE}</pageUrl>
      <checkoutToLocal>false</checkoutToLocal>
      <lastmodified/>
    </CheckOutFile>
  </soap:Body>
</soap:Envelope>
EOF
# upload the file
curl --ntlm -u ${USER}:${PASSWORD} 
    -T HTML/2015/index.html 
    ${FOLDER}
curl --ntlm --user ${USER}:${PASSWORD} 
    --data @- 
    -H "SOAPAction: http://schemas.microsoft.com/sharepoint/soap/CheckInFile" 
    -H "Content-Type: text/xml; charset=utf-8" 
    ${SHAREPOINT}/_vti_bin/Lists.asmx << EOF
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CheckInFile xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <pageUrl>${FILE}</pageUrl>
      <comment>Automagic update</comment>
      <checkinType>2</checkinType>
    </CheckInFile>
  </soap:Body>
</soap:Envelope>
EOF

最新更新