Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单个ssh命令中使用bash$(awk)?_Bash_Ssh_Awk - Fatal编程技术网

如何在单个ssh命令中使用bash$(awk)?

如何在单个ssh命令中使用bash$(awk)?,bash,ssh,awk,Bash,Ssh,Awk,我试图通过ssh执行一个命令,该命令包含'sub-code'或$(sub-code)(我一直在使用它,但我不知道它的正式名称)首先在目标服务器上执行 为了便于讨论,假设这是我想要使用的命令。当然,这可以通过hostname实现,但这只是一个简单的示例,其中包含了我想要使用的所有格式化向导 echo `uname -a | awk '{print $2}'` 没问题。但是,如何正确地避免这种情况,以便在一个命令中通过ssh发送它呢?以下是错误的,因为它允许服务器回复您的本地主机名。子代码在本地执

我试图通过
ssh
执行一个命令,该命令包含'sub-code'或$(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

我想要一个包括使用正确转义的
`或$()的答案,因为我想知道这是否可能。
echo`可能更复杂。

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

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

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

test.sh

echo `uname -a | awk '{print $2}'`
指挥部:

ssh myServer 'bash -s' < test.sh
试试这个

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}'\` "
您还可以对倒勾“”进行转义,如下所示:

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

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


ssh myServer“uname-n”

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

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF
ssh-T myServer只是一些额外的注意事项:
在我的例子中,
$
的转义没有帮助:
ts1350:>sshsysadm@node“grep features.txt | awk'{print$6}”
密码:
功能名称ue_trace|mme | off
ts1350:>sshsysadm@node“grep features.txt | awk'{print\$6}”
密码:
awk:cmd.line:1:{print\}
awk:cmd.line:1:^反斜杠不是第行的最后一个字符
awk:cmd.line:1:{print\}
awk:cmd.line:1:^语法错误
ts1350:>sshsysadm@node“grep features.txt | awk'{print\\\$6}”
密码:
awk:cmd.line:1:{print\\}
awk:cmd.line:1:^反斜杠不是第行的最后一个字符
awk:cmd.line:1:{print\\}
awk:cmd.line:1:^语法错误
$
之间添加一个
空格
,该数字有效:
2019年10月4日星期五14:49:28
ts1350:>sshsysadm@node“grep features.txt | awk'{print$6}”
密码:
关
希望这第二种方式能帮助像我这样的人


感谢@dave在他的回答中:

@Redsandro,我想我知道了如何避开ssh上的
$(
和反勾号。刚刚更新了我的答案…如果你在子命令中执行,比如
res=`ls | awk'{print\\\$2}“
,我们这里需要两个转义。是的,我在远程服务器上尝试sshpass执行/proc/loadavg,并使用awk过滤结果。谢谢你的回答。转义序列成功了。谢谢你为什么
echo`command`
?为什么不
command
?@anishsane,因为他想看看如何传递回执或
$(
通过ssh连接到远程服务器@“不带引号的命令也可以正常工作:“正在执行的awk是本地awk,而不是在远程系统上。是的,来自所有3个问题的命令都运行在正确的部分(管道之后)本地。因此,唯一的解决方案是将命令保存在脚本中。谢谢,这很有效。向上投票。但是user000001在单个命令中完全符合我的要求,我接受了该命令。:“因此,唯一的解决方案是将命令保存在脚本中”:我反对“only”这个词。可能你的意思是“最简单”“。对不起,我指的是答案。我已经测试了user000001的最后一个命令,它在远程服务器上工作,所以我错了。谢谢,这在某些情况下是有效的。但是,为了实现更多的通用性,user000001的答案正是我想要的。:)