MATLAB Answers

0

How do I use pipes with a system() call using ssh? Parsing issue?

Asked by Kristoffer Walker on 12 Nov 2019 at 22:42
Latest activity Commented on by Kristoffer Walker on 13 Nov 2019 at 3:14
Folks,
I am having difficulty, I believe with parsing, of a string that I am using to make a system call on my Windows 10 system.
I can run the exact following command from my Windows 10 command prompt:
ssh user@domain /bin/ps -aef | /bin/grep SearchString | /bin/awk "{print $2}"
It will send the command with all the pipes correctly to the domain computer and return the result.
When I do this, it does not work:
[a, b] = system('ssh user@domain /bin/ps -afe | /bin/grep SearchString | /bin/awk "{print $2}"')
It returns a = 255 (error)
If I reduce this to
[a, b] = system('ssh user@domain /bin/ps -afe | /bin/grep SearchString')
it still fails.
If I further reduce this to
[a, b] = system('ssh user@domain /bin/ps -afe')
it works.
So I expect this has something to do with parsing the pipe symbol. Any ideas on how to address this? I tried replacing the pipe with '|' and \|, but that did not fix the issue.
Thank you,
Kris

  0 Comments

Sign in to comment.

Tags

Products


Release

R2019b

2 Answers

Answer by Kristoffer Walker on 12 Nov 2019 at 22:52
 Accepted Answer

Folks,
I figured out my issue. This works.
system('ssh user@domain "/bin/ps -afe | /bin/grep SearchString | /bin/awk ''{print $2}''"')
Be careful reading the above line. The last series of quotes contain both single and double quotes.
Kris

  0 Comments

Sign in to comment.


Answer by Walter Roberson
on 12 Nov 2019 at 23:06

[a, b] = system('ssh user@domain ''/bin/ps -afe | /bin/grep SearchString | /bin/awk "{print $2}"''')
Otherwise the | is going to be interpreted locally.
MATLAB does not exactly just submit the command to the local command shell: it does some parsing of it even on windows. If you look at the details, the processing of & for background execution is documented as taking place at parsing time, and also some details about blocking (I think it is) on windows systems are at the parsing level.
You should thus expect that an unquoted unescaped | will be able interpreted as something to be run on the local system: the unquoted unescaped | would mark the end of the ssh command

  1 Comment

Sign in to comment.