如何在单个ssh-command中使用bash $(awk)?

Red*_*dro 20 ssh bash awk

我试图执行一个ssh包含`sub-code`或$(子代码)的命令(我一直使用它但我不知道它的正式名称)要先执行,但是目标服务器.

为了论证,让我们说这是我想要使用的命令.当然这可以用hostname,但这只是一个简化的例子,包含我想要使用的所有格式化魔法.

echo `uname -a | awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)

没问题.但是你如何正确地逃避这一点以便ssh在一个命令中发送它?以下是错误的,因为它让服务器回复您的本地主机名.子代码在本地执行:

ssh myServer echo `uname -a | awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)

但任何浮出水面的想法都不起作用:

$ ssh myServer echo \`uname -a | awk '{print $2}'\`
awk: cmd. line:1: {print $2}`
awk: cmd. line:1:           ^ invalid char '`' in expression
$ ssh myServer echo \$(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `('
$ ssh myServer echo \$\(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `)'
$ ssh myServer echo \$\(uname -a | awk '{print $2}'\)
awk: cmd. line:1: {print $2})
awk: cmd. line:1:           ^ syntax error
bash: -c: line 0: unexpected EOF while looking for matching `)'
bash: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

我想要一个包含使用正确的逃逸` or $() because I'd like to know if it's possible.回声的答案可能会更复杂.

use*_*001 53

试试这个

ssh myServer "uname -a | awk '{print \$2}' "
Run Code Online (Sandbox Code Playgroud)

使用双引号"将您要远程执行的命令分组.

您还需要$$2参数中转义,以便它不在本地计算,而是传递给awk远程.

编辑:

如果你想包括$( ),你再次必须逃避$符号,如下所示:

ssh myServer "echo \$(uname -a | awk '{print \$2}') "
Run Code Online (Sandbox Code Playgroud)

你也可以逃避反引号 `,像这样:

ssh myServer "echo \`uname -a | awk '{print \$2}'\` "
Run Code Online (Sandbox Code Playgroud)


Kan*_*hao 6

只是一些补充说明:

就我而言,转义$没有帮助:

ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print $6}' "
Password: 
A  feature   -name  ue_trace_mme    | off
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print \$6}' "
Password: 
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ syntax error
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print \\$6}' "
Password: 
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ syntax error
Run Code Online (Sandbox Code Playgroud)

在和数字space之间添加一个有效:$

Fri Oct  4 14:49:28 CEST 2019
ts1350:> ssh sysadm@node "grep feature features.txt| awk '{print $ 6}' "
Password: 
off
Run Code Online (Sandbox Code Playgroud)

希望这种辅助方法可以帮助像我这样的人。

感谢 @dave 在他的回答中:How to print a certain columns with awk on a Remote ssh session?


Dav*_*rra 5

管道输出命令并在本地运行awk怎么样?

ssh yourhost uname -a | awk '{ print $2 } '
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 5

最好使用heredoc withssh以避免在更复杂的命令中到处转义引号:

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF
Run Code Online (Sandbox Code Playgroud)