SSH - Connect&执行:“echo $ SSH_CONNECTION | awk'{print $ 1}'”

时间:2017-01-25 18:12:34

标签: bash shell ssh terminal escaping

这是我的bash(shell?)脚本。

command="ssh root@$ip";
command2="\"ls /;bash\"";
xfce4-terminal -x sh -c "$command $command2; bash"

连接到服务器并执行

命令
 ls /

工作得很好。

但不是 ls / .. 我想执行这个命令:

 echo $SSH_CONNECTION | awk '{print $1}'

我用上面的代码替换了“ ls / ”,但是一旦连接, 它只是打印一个空行。

根据我的理解,代码在到达服务器之前就在本地执行,因为东西没有被转义。

如果我在远程服务器上手动粘贴此代码..

   echo $SSH_CONNECTION | awk '{print $1}'

它运作得很好。准确地打印出应该打印出来的内容。

所以问题是:我的代码中的反斜杠在哪里?

我知道这听起来就像是在尝试一堆反斜杠。 直到有效。

我尝试了很多方法。我甚至尝试过三倍和六倍的反斜杠以逃避事情。

更新

这还不够 它仍然只在连接时打印出一个空行。

command="ssh root@$ip";
command2="\"echo \$SSH_CONNECTION | awk '{print \$1}';bash\"";
xfce4-terminal -x sh -c "$command $command2; bash"

更新2

来自其中一个答案..

下面的代码工作正常,但它看起来“不轻”到我的眼睛或者可能只是我的想法,因为我不习惯执行和从右到左管道?

command="ssh -t root@$ip";
command2="\"awk '{ print \\\$1 }' <<< \\\$SSH_CONNECTION; exec \\\$SHELL\""
xfce4-terminal -x sh -c "$command $command2; bash"

更新3

来自答案..

command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"'; exec \$SHELL"'

似乎也工作正常。

虽然信息被提供为“exec”消耗更少的资源..我仍然在寻找没有“exec”命令的解决方案,因为“exec”命令让我想起“php”,这不是轻松的东西..所以也许只是感知

更新4:

原来“exec \ $ SHELL”不是代码的一部分。它只是替换“bash”命令以保持在ssh中登录。

尽管有人说信息的资源消耗比bash少 命令..将来要研究。

现在这似乎是最终的结果。

command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"';bash"'

从左到右配管看起来很合理..

更新5

最终代码是:

command="ssh -p 2201 -t root@$ip";
command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"';bash"'
xfce4-terminal -x sh -c "$command $command2; bash"

2 个答案:

答案 0 :(得分:1)

你必须逃脱两次:一次用于SSH,一次用于你给xfce4-terminal的shell命令。我使用xterm代替xfec4-terminal对此进行了测试,但它应该是相同的:

$ cmd1='ssh -t root@as'
$ cmd2="\"awk '{ print \\\$1 }' <<< \\\"\\\$SSH_CONNECTION\\\"; exec \\\$SHELL\""
$ xfce4-terminal -x sh -c "$cmd1 $cmd2"

我已添加-t来分配伪终端,我使用here-string而不是echo和一个管道。

我没有在子shell中生成Bash,而是使用exec $SHELL

cmd2中三重反斜杠的替代方法是单引号,但要将单引号引入单引号字符串,则必须使用笨重的'"'"'

cmd2='"awk '"'"'{ print \$1 }'"'"' <<< \"\$SSH_CONNECTION\"; exec \$SHELL"'

答案 1 :(得分:1)

您可以通过其他方式访问变量,而不是处理所有转义问题:

只需将printenv SSH_CONNECTION替换为echo $SSH_CONNECTION即可。请注意,现在没有美元符号,因此本地shell不会扩展变量