这是我的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"
答案 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不会扩展变量