Problems Execute Linux Commands using JSR223 PrePrcessor with Groovy Engine and pipe-symbol

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Problems Execute Linux Commands using JSR223 PrePrcessor with Groovy Engine and pipe-symbol

Markus Obermann
Hi,

i need to do some wired stuff where i have to call linux commands from jmeter - to be clear its openssl i need to run.Bevore the openssl command is executed i have to "echo" something to my system console and want that this is piped to openssl.So the command i want to execute is this (and it's working perfect on bash)
echo -en "https://my-url.com:8888" | openssl smime -sing -signer cert.crt -inkey cert.key -outform der -binary -md sha384 -out blah.p7

I have a HTTP Sampler and there is a JSR223 PreProcessor as a child with this tiny code://First i get the URL from my Sampler
import org.apache.jmeter.protocol.http.sampler.HTTPSampler;String path = sampler.getURL();
This works and will print out the URL from the Sampler.Then i do this:
log.info("echo -en $path | openssl smime -sing -signer cert.crt -inkey cert.key -outform der -binary -md sha384 -out blah.p7".execute().text)
In my Jmeter console i do see the "log.info" output which looks perfect. BUT it seems that nothing happen. I do not see the -out blah.p7 fileCould it be that jmeter cant handle the pipe-symbol?

If i do some changes to my command and do not echo my command but paste the url as -in directly to my openssl command then its working.Thus i can do this:log.info("openssl smime -in https//my-url.com:8888 -sing -signer cert.crt -inkey cert.key -outform der -binary -md sha384 -out blah.p7".execute().text)

But as im using different urls i cant make it static - i need to determine the url from sampler and paste it to my openssl command.
For sure i will find a way which will work - but maybe someone have an idea about the "pipe-symbol" - or what i'm doing wrong?
Br
Reply | Threaded
Open this post in threaded view
|

Re: Problems Execute Linux Commands using JSR223 PrePrcessor with Groovy Engine and pipe-symbol

shettyd
Hi
you should be able to do something like (not tested) - also be careful with
your paths - I believe they will be relative to JMeter's bin directory so
you might want to try with absolute paths first(for your .key and .crt
files)
String path = sampler.getURL();
String s = "openssl smime -in " + path + " -sing -signer cert.crt -inkey
cert.key -outform der -binary -md sha384 -out blah.p7";
s.execute();

regards
deepak

On Mon, Dec 2, 2019 at 8:11 AM Markus Obermann
<[hidden email]> wrote:

> Hi,
>
> i need to do some wired stuff where i have to call linux commands from
> jmeter - to be clear its openssl i need to run.Bevore the openssl command
> is executed i have to "echo" something to my system console and want that
> this is piped to openssl.So the command i want to execute is this (and it's
> working perfect on bash)
> echo -en "https://my-url.com:8888" | openssl smime -sing -signer cert.crt
> -inkey cert.key -outform der -binary -md sha384 -out blah.p7
>
> I have a HTTP Sampler and there is a JSR223 PreProcessor as a child with
> this tiny code://First i get the URL from my Sampler
> import org.apache.jmeter.protocol.http.sampler.HTTPSampler;String path =
> sampler.getURL();
> This works and will print out the URL from the Sampler.Then i do this:
> log.info("echo -en $path | openssl smime -sing -signer cert.crt -inkey
> cert.key -outform der -binary -md sha384 -out blah.p7".execute().text)
> In my Jmeter console i do see the "log.info" output which looks perfect.
> BUT it seems that nothing happen. I do not see the -out blah.p7 fileCould
> it be that jmeter cant handle the pipe-symbol?
>
> If i do some changes to my command and do not echo my command but paste
> the url as -in directly to my openssl command then its working.Thus i can
> do this:log.info("openssl smime -in https//my-url.com:8888 -sing -signer
> cert.crt -inkey cert.key -outform der -binary -md sha384 -out
> blah.p7".execute().text)
>
> But as im using different urls i cant make it static - i need to determine
> the url from sampler and paste it to my openssl command.
> For sure i will find a way which will work - but maybe someone have an
> idea about the "pipe-symbol" - or what i'm doing wrong?
> Br
>
Reply | Threaded
Open this post in threaded view
|

Re: Problems Execute Linux Commands using JSR223 PrePrcessor with Groovy Engine and pipe-symbol

glinius@live.com
In reply to this post by Markus Obermann
As you correctly mentioned, "it's working perfect on bash".

Groovy knows nothing about the pipe symbol so you need to execute  bash -c
command <https://www.gnu.org/software/bash/manual/bash.html>   and pass your
whole command as the parameter, something like:


> "/bin/bash -c \"echo -en \\\"https://my-url.com:8888\\\" | openssl smime
> -sing -signer cert.crt -inkey cert.key -outform der -binary -md sha384
> -out blah.p7\"".execute().text

Groovy neither knows your *$path* environment variable, if the environment
variable exists and is available to JVM you can read its value using
System.getEnv()
<https://docs.oracle.com/javase/tutorial/essential/environment/env.html>  
function

It might be easier to go for  OS Process Sampler
<https://jmeter.apache.org/usermanual/component_reference.html#OS_Process_Sampler>
, check out  How to Run External Commands and Programs Locally and Remotely
from JMeter
<https://www.blazemeter.com/blog/how-run-external-commands-and-programs-locally-and-remotely-jmeter/>  
article for details.

And from the performance perspective instead of calling external
applications you should rather consider creating the CSR request using i..e
BouncyCastle API <https://www.bouncycastle.org/>  
 



--
Sent from: http://www.jmeter-archive.org/JMeter-User-f512775.html

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Problems Execute Linux Commands using JSR223 PrePrcessor with Groovy Engine and pipe-symbol

Felix Schumacher

Am 04.12.19 um 11:33 schrieb [hidden email]:

> As you correctly mentioned, "it's working perfect on bash".
>
> Groovy knows nothing about the pipe symbol so you need to execute  bash -c
> command <https://www.gnu.org/software/bash/manual/bash.html>   and pass your
> whole command as the parameter, something like:
>
>
>> "/bin/bash -c \"echo -en \\\"https://my-url.com:8888\\\" | openssl smime
>> -sing -signer cert.crt -inkey cert.key -outform der -binary -md sha384
>> -out blah.p7\"".execute().text


Alternatively you could use groovy's magic to write the url to the stdin
of the openssl process by using something like

p = "openssl smime ...".execute()
p.withWriter { writer -> writer.println("https://...") }
p.text

I find it more readable.  It is probably faster, too, as it doesn't need
to instantiate a shell.

On a side node, groovy's Process instances can be used together with a
pipe symbol inside groovy like the following

p = "date".execute() | "tr a-z A-Z".execute()
p.text

> Groovy neither knows your *$path* environment variable, if the environment
> variable exists and is available to JVM you can read its value using
> System.getEnv()
> <https://docs.oracle.com/javase/tutorial/essential/environment/env.html>  
> function
>
> It might be easier to go for  OS Process Sampler
> <https://jmeter.apache.org/usermanual/component_reference.html#OS_Process_Sampler>
> , check out  How to Run External Commands and Programs Locally and Remotely
> from JMeter
> <https://www.blazemeter.com/blog/how-run-external-commands-and-programs-locally-and-remotely-jmeter/>  
> article for details.
>
> And from the performance perspective instead of calling external
> applications you should rather consider creating the CSR request using i..e
> BouncyCastle API <https://www.bouncycastle.org/>  

+1


Felix



---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]