23

我正在尝试执行一个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 的答案可能会更复杂。

4

6 回答 6

65

试试这个

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}'\` "
于 2013-02-05T13:05:50.283 回答
7

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

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF
于 2018-06-14T08:33:12.990 回答
5

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

ssh yourhost uname -a | awk '{ print $2 } '
于 2013-02-05T12:28:18.680 回答
4

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

测试.sh

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

和命令:

ssh myServer 'bash -s' < test.sh

更新

不带引号的命令也可以正常工作:

ssh myServer uname -a | awk '{print $2}'
于 2013-02-05T12:33:00.070 回答
3

只是一些额外的说明:

就我而言,逃逸$无济于事:

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 在他的回答中:如何在远程 ssh 会话中使用 awk 打印特定列?

于 2019-10-04T13:10:24.907 回答
2

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

ssh myServer "uname -n"

于 2013-05-14T20:27:59.033 回答