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

时间:2013-02-05 12:13:38

标签: bash ssh awk

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

为了论证,让我们说这是我想要使用的命令。当然,这可以使用hostname完成,但这只是一个包含我想要使用的所有格式设置的简化示例。

echo `uname -a | awk '{print $2}'`

没问题。但是如何通过ssh在单个命令中将其正确地转义?以下是错误的,因为它让服务器回复您的本地主机名。子代码在本地执行:

ssh myServer echo `uname -a | awk '{print $2}'`

但任何想到的逃避现象都不起作用:

$ 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

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

6 个答案:

答案 0 :(得分:51)

试试这个

ssh myServer "uname -a | awk '{print \$2}' "

使用双引号"对您将远程执行的命令进行分组。

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

编辑:

如果您想加入$( ),则必须再次转义$符号,如下所示:

ssh myServer "echo \$(uname -a | awk '{print \$2}') "

你也可以逃避反引号`,如下所示:

ssh myServer "echo \`uname -a | awk '{print \$2}'\` "

答案 1 :(得分:5)

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

ssh yourhost uname -a | awk '{ print $2 } '

答案 2 :(得分:4)

解决方法是使用该命令创建一个sh文件,然后将其传递给ssh命令:

<强> test.sh

echo `uname -a | awk '{print $2}'`

和命令:

ssh myServer 'bash -s' < test.sh

更新

没有引号的命令也可以正常工作:

ssh myServer uname -a | awk '{print $2}'

答案 3 :(得分:4)

最好将{strong> heredoc 与ssh一起使用,以避免在更复杂的命令中到处转义引号:

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF

答案 4 :(得分:2)

如果您要获取主机名,请使用:

ssh myServer "uname -n"

答案 5 :(得分:0)

只是一些补充说明:

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

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

space和数字之间添加$并起作用:

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

希望这种秘书方式可以帮助像我这样的人。

感谢@dave回答:How to print a specific column with awk on a remote ssh session?