How to escape the single quote character in an ssh / remote bash command?
Use
ssh deploy@hera 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '"'"'{print $2}'"'"' | head -n 1`'
Explanation:
ssh deploy@hera 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '"'"'{print $2}'"'"' | head -n 1`' > 1 <>2<> 3 <>4<> 5 <
1) First string with beginning of command: 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '
2) Second string with only a single ' char: "'"
3) Third string with the print command: '{print $2}'
4) Fourth string with another single quote: "'"
5) Fifth string with rest of command: ' | head -n 1`'
This is not ssh
or awk
handling the quotes, it is the shell (and they are necessary to keep the shell from handling other characters specially, like $
). Nesting them is not supported (although other structures, such as $()
may nest even while containing quotes), so you'll need to escape the single quotes separately. Here are a couple of methods:
$ echo 'Don'"'"'t mess with this apostrophe!'Don't mess with this apostrophe!$ echo 'Don'\''t mess with this apostrophe!'Don't mess with this apostrophe!
There are two more options I don't see mentioned in any of the other answers. I've left the grep/grep/awk/head pipeline intact for demonstration purposes, even though (as alluded to in rici's answer) it could be reduced to something like
awk -F ' ' '/MapReduceNod[e]/ { print $2; exit }'
Using double quotes for the whole ssh command:
ssh deploy@hera "kill -9 \$(ps -ef | grep MapReduceNode | grep -v \"grep\" | awk -F ' ' '{print \$2}' | head -n 1)"
Notice that I can use single quotes in the command now, but I have to escape other things I don't want expanded yet:
\$()
(which I've used instead of backticks), double quotes\"
, andprint \$2
.A here-doc with quoted delimiter:
ssh -T deploy@hera <<'EOF' kill -9 $(ps -ef | grep MapReduceNode | grep -v 'grep' | awk -F ' ' '{print $2}' | head -n 1) EOF
The
-T
prevents ssh from complaining about not allocating a pseudo-terminal.The here-doc with quoted delimiter is extra nice because its contents don't have to be modified at all with respect to escaping things, and it can contain single quotes.