从 tcl 脚本提交时,curl 命令失败

问题描述 投票:0回答:1

尝试从 tcl 脚本提交长卷曲命令并收到奇怪的错误。

这就是代码:

exec {curl --request GET   --url 'https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id' --header 'Authorization: Basic UGlQQ123456'}

couldn't execute ""curl --request GET --url 'https:/xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sys": no such file or directory

执行时:

exec {curl --help} 

一切都按预期进行。

curl tcl
1个回答
0
投票

我希望:

exec {curl --request GET   --url 'https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id' --header 'Authorization: Basic UGlQQ123456'}

产生错误:

couldn't execute ""curl --request GET --url 'https:/xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sys": no such file or directory

这里有两个问题。一是 Tcl 希望它执行的子进程的参数是单独的单词

exec
;这就是它的工作方式(与您的 shell 不同)。另一个是
'
对于Tcl来说绝对没有任何意义; shell 使用它来做什么,Tcl 使用
{...}
(并且它们嵌套得很好)。

拨打电话的正常方式是:

exec curl --request GET --url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id --header "Authorization: Basic UGlQQ123456"

或者,更有可能的是:

set query "cn%3Dxyzxyz"
set fields "sys_id"
set url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=${query}&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=${fields}
set auth "Basic UGlQQ123456"
exec curl --request GET --url $url --header "Authorization: $auth"

或者,更有可能,将其包装在一个过程中:

proc queryUser {user {fields sys_id}} {
    global auth
    set query "cn%3D$user"
    set url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=${query}&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=${fields}
    exec curl --request GET --url $url --header "Authorization: Basic $auth"
}

set auth UGlQQ123456
queryUser xyzxyz

虽然我可能会使用内置的

http
包编写它并保存子进程调用。


我严重怀疑:

执行时:

exec {curl --help}

一切都按预期进行。

确实有效。我希望这能起作用:

exec curl --help

或者这个:

exec {*}{curl --help}

这是可能有些东西试图“提供帮助”,但如果是这样,它应该阻止它!混合解释级别是陷入安全麻烦的好方法。

© www.soinside.com 2019 - 2024. All rights reserved.