Ruby 执行多行命令字符串
Ruby execute a multiline cmd string
我构建了一个 curl 命令
cmd = %Q(curl --tlsv1.2 -b #{config['cookies']} -c #{config['cookies']} --
connect-timeout 60 -X POST
-H 'Content-Type: application/xml'
-H 'Accept: application/xml'
-d '#{xml_content}'
--location #{uri})
puts cmd
打印字符串后输出结果如下
curl --tlsv1.2 -b /tmp/cookie.txt -c /tmp/cookie.txt --connect-timeout 60 -X POST
-H 'Content-Type: application/xml'
-H 'Accept: application/xml'
-d '<?xml version="1.0" encoding="UTF-8" ?>
<ns:login xmlns:ns="http://www.actility.com/smp/ws/admin">
<login>hello</login><password>wPa4GwYbRTCw0Uy!</password></ns:login>'
--location https://myapi.application.com
如何在 ruby 中执行它 w/o 将 cmd 字符串修改为单个 cmd?
您已经构建了一个包含命令的字符串,因此您需要将其传递给 Ruby 的 shell 执行方法之一。
我建议
result = %x(#{cmd})
这里有一个更详细的答案,您可能会觉得有用:
我认为你应该在你的 cmd 中添加 "\n" de "\" 之前,它应该被转义如下:
[1] pry(main)> cmd = %Q(curl -i
[1] pry(main)* -H 'Authorization: Basic dXNlcjpwYXNzd29yZA=='
[1] pry(main)* -XGET 'http://httpbin.org/basic-auth/user/password')
=> "curl -i\n" + "-H 'Authorization: Basic dXNlcjpwYXNzd29yZA=='\n" + "-XGET 'http://httpbin.org/basic-auth/user/password'"
[2] pry(main)> exec(cmd)
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
sh: line 1: -H: command not found
sh: line 2: -XGET: command not found
你应该这样写:
[1] pry(main)> cmd = %Q(curl -i \
[1] pry(main)* -H 'Authorization: Basic dXNlcjpwYXNzd29yZA==' \
[1] pry(main)* -XGET 'http://httpbin.org/basic-auth/user/password')
=> "curl -i \\n" + "-H 'Authorization: Basic dXNlcjpwYXNzd29yZA==' \\n" + "-XGET 'http://httpbin.org/basic-auth/user/password'"
[2] pry(main)> exec(cmd)
HTTP/1.1 200 OK
Connection: keep-alive
Server: meinheld/0.6.1
Date: Mon, 05 Jun 2017 09:46:24 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000503063201904
Content-Length: 47
Via: 1.1 vegur
{
"authenticated": true,
"user": "user"
}
我构建了一个 curl 命令
cmd = %Q(curl --tlsv1.2 -b #{config['cookies']} -c #{config['cookies']} --
connect-timeout 60 -X POST
-H 'Content-Type: application/xml'
-H 'Accept: application/xml'
-d '#{xml_content}'
--location #{uri})
puts cmd
打印字符串后输出结果如下
curl --tlsv1.2 -b /tmp/cookie.txt -c /tmp/cookie.txt --connect-timeout 60 -X POST
-H 'Content-Type: application/xml'
-H 'Accept: application/xml'
-d '<?xml version="1.0" encoding="UTF-8" ?>
<ns:login xmlns:ns="http://www.actility.com/smp/ws/admin">
<login>hello</login><password>wPa4GwYbRTCw0Uy!</password></ns:login>'
--location https://myapi.application.com
如何在 ruby 中执行它 w/o 将 cmd 字符串修改为单个 cmd?
您已经构建了一个包含命令的字符串,因此您需要将其传递给 Ruby 的 shell 执行方法之一。 我建议
result = %x(#{cmd})
这里有一个更详细的答案,您可能会觉得有用:
我认为你应该在你的 cmd 中添加 "\n" de "\" 之前,它应该被转义如下:
[1] pry(main)> cmd = %Q(curl -i
[1] pry(main)* -H 'Authorization: Basic dXNlcjpwYXNzd29yZA=='
[1] pry(main)* -XGET 'http://httpbin.org/basic-auth/user/password')
=> "curl -i\n" + "-H 'Authorization: Basic dXNlcjpwYXNzd29yZA=='\n" + "-XGET 'http://httpbin.org/basic-auth/user/password'"
[2] pry(main)> exec(cmd)
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
sh: line 1: -H: command not found
sh: line 2: -XGET: command not found
你应该这样写:
[1] pry(main)> cmd = %Q(curl -i \
[1] pry(main)* -H 'Authorization: Basic dXNlcjpwYXNzd29yZA==' \
[1] pry(main)* -XGET 'http://httpbin.org/basic-auth/user/password')
=> "curl -i \\n" + "-H 'Authorization: Basic dXNlcjpwYXNzd29yZA==' \\n" + "-XGET 'http://httpbin.org/basic-auth/user/password'"
[2] pry(main)> exec(cmd)
HTTP/1.1 200 OK
Connection: keep-alive
Server: meinheld/0.6.1
Date: Mon, 05 Jun 2017 09:46:24 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000503063201904
Content-Length: 47
Via: 1.1 vegur
{
"authenticated": true,
"user": "user"
}