使用curl将新事件插入CalDAV日历

使用curl将新事件插入CalDAV日历,curl,stdin,caldav,Curl,Stdin,Caldav,如果先前的命令将事件保存为本地ics文件,我知道如何使用curl将新事件插入CalDAV日历: $command > $localfile curl -T "$localfile" $url 这非常有效,但我希望在不需要本地文件的情况下执行此操作,我希望将$command的结果通过管道传输到curl中,如下所示: $command | curl -T - $url cat<<EOC | curl -T - $url BEGIN:VCALENDAR VERSION:2.0

如果先前的命令将事件保存为本地ics文件,我知道如何使用curl将新事件插入CalDAV日历:

$command > $localfile
curl -T "$localfile" $url
这非常有效,但我希望在不需要本地文件的情况下执行此操作,我希望将$command的结果通过管道传输到curl中,如下所示:

$command | curl -T - $url
cat<<EOC | curl -T - $url 
BEGIN:VCALENDAR
VERSION:2.0

BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT

END:VCALENDAR
EOC
根据curl的手册,选项“T-”应该是必需的:它应该从stdin而不是从文件中读取。但如果我使用这个选项,我会得到这样的回答:

<?xml version="1.0" encoding="utf-8"?>
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
      <s:exception>Sabre\DAV\Exception\Conflict</s:exception>
      <s:message>PUT is not allowed on non-files.</s:message>
    </d:error>

Sabre\DAV\Exception\Conflict
不允许在非文件上放置。
我尝试了其他不同的参数,如“-data”和“-dataraw”,但还没有找到正确的组合。有人能帮我吗


实际上,我试图实现的整个命令周期如下所示:

$command | curl -T - $url
cat<<EOC | curl -T - $url 
BEGIN:VCALENDAR
VERSION:2.0

BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT

END:VCALENDAR
EOC
catEureka!:)

解决方案是使用HERE文档:

$CURL $url -T /dev/stdin <<-EOF
        BEGIN:VCALENDAR
        VERSION:2.0
        BEGIN:VEVENT
        CREATED:$CREATED
        UID:$RNDUID
        SUMMARY:$SUMMARY
        LOCATION:$LOCATION
        DTSTART:$DTSTART
        DTSTAMP:$DTSTART
        DTEND:$DTEND
        DESCRIPTION:$DESCRIPTION
        END:VEVENT
        END:VCALENDAR
EOF
我现在找到的解决方案,除了第一次尝试之外,显然是对cat的无用使用。但它看起来很像“猫”带来的东西,而这只名叫“卷毛”的老狗却不太喜欢


如果有人对此有解释,我将非常感谢。

您不需要
响应
该命令吗?因此,
echo$command | curl-T-$url
您的HTTP内容类型也可能默认为非文件类型。因此,您可能必须使用正确的内容类型指定
-H“Content Type:text/plain”
,这两个命令的处理方式似乎有很大的不同:“create_tempfile;curl-T$tempfile$url”和“create_tempfile;cat$tempfile | curl-T-$url”。虽然第一个文件工作正常,但第二个文件退出时带有“不允许在无文件上放置”。因此,我想主要的问题是:如何让NextCloud相信输入是一个文件而不是其他?请将答案标记为已接受,而不是将已解决的问题放在标题中。很高兴你找到了答案!我建议您编辑您的问题标题,以使其与问题更相关(“如何将文本管道化为CURL PUT命令”或其他内容),因为您已经对问题的起因有了更好的了解。另外,不要在标题中包含已解决的问题,只需将您自己的答案标记为正确(绿色标记将显示在您的问题旁边),我将答案标记为已接受。但我对标题不是很确定,因为我不知道这个解决方案是否也适用于将日历以外的数据管道化到curl的put命令中。我怀疑使用HERE文档是否可以处理二进制数据,比如图片。