我今晚刚刚开始搞乱tcl,我已经遇到了第一道障碍。这是我的代码:
package require http
package require tls
::http::register https 443 ::tls::socket
set url https://127.0.0.1:8834/session
set body [http::formatQuery username admin password myPassword]
set login [http::geturl $url -query $body]
set authToken [http::data $login]
http::cleanup $token
这就是authToken在代码运行后的看法:
% puts $authToken
{"token":"d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440"}
我只需要存储d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440。我无法弄清楚如何做到这一点。
我尝试使用其他软件包,但我无法使用它:
package require rest
package require tls
::http::register https 443 ::tls::socket
set nessus(login) {
url https://127.0.0.1:8834/session
method POST
req_args {username: password:}
}
rest::create_interface nessus
set token [nessus::login -username admin -password myPassword]
以下是运行此代码的输出:
% puts $token
token ba9c5b4256ef701bf7d8ae151c01261cb8a3267f1b8c2787
这可能比http代码更容易格式化,我假设。
在Python中,我能够通过从json中拉出'token'来检索只是那个令牌密钥,但我不知道如何在tcl中完成它。
答案 0 :(得分:3)
您获得的响应是json对象的形式,有一个键和一个值。您可以使用json
包将其转换为Tcl dict
结构:
package require json
::json::json2dict [http::data $login]
# -> token d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440
rest
包自动检测xml和json,并在交付之前显然将收到的对象转换为dict
。
您可以通过普通字典访问获取值:
dict get $token token
# -> ba9c5b4256ef701bf7d8ae151c01261cb8a3267f1b8c2787
# or
dict get [::json::json2dict [http::data $login]] token
# -> d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440
也可以使用lindex
命令,但从长远来看,使用字典访问可能会更好。
答案 1 :(得分:1)
您可以尝试以下代码:
package require rest
package require tls
::http::register https 443 ::tls::socket
set nessus(login) {
url https://127.0.0.1:8834/session
method POST
req_args {username: password:}
}
rest::create_interface nessus
set token [lindex [nessus::login -username admin -password myPassword] 1]