首页 > 解决方案 > 为什么我的 shell 脚本将代码打印为输出的一部分

问题描述

#!/bin/bash

haf()
{
 sshpass -p "$1" ssh -tt -o StrictHostKeyChecking=no "$2"@"$3" <<'SSH_EOF'

 echo "request msha actions status" | /opt/tel/vs/ns/current/bin/ns_cli > txt1
 tr -s " " < txt1 > txt2
 cut -d " " -f 2 txt2 > txt3
 var1=$(<txt3)

 if [ "$var1" = "MASTER" ]
 then
        var2=1
 elif [ "$var1" = "SLAVE" ]
 then
        var2=2
 else
        var2=3
 fi
 echo $var2 > txt4
 rm txt1 txt2 txt3
 logout
SSH_EOF
 sshpass -p "$1" scp "$2"@"$3":~/txt4 .
 var2=$(<txt4)
 sshpass -p "$1" ssh -tt -o StrictHostKeyChecking=no "$2"@"$3" <<'SSH_EOF'
 rm txt4
 logout
SSH_EOF
 rm txt4
 return $var2
}

haf "$1" "$2" "$3"
FL1=$?

输出

admin@tel:~$

/vs/ns/current/bin/ns_cli > txt1 request msha actions status" | /opt/tel
admin@tel:~$  tr -s " " < txt1 > txt2
admin@tel:~$  cut -d " " -f 2 txt2 > txt3
admin@tel:~$  var1=$(<txt3)
admin@tel:~$
admin@tel:~$  if [ "$var1" = "MASTER" ]
>  then
> var2=1
>  elif [ "$var1" = "SLAVE" ]
>  then
>         var2=2
>  else
> var2=3
>  fi
admin@tel:~$  echo $var2 > txt4
admin@tel:~$  rm txt1 txt2 txt3
admin@tel:~$  logout
Connection to 192.168.66.39 closed.
admin@tel:~$  rm txt4
admin@tel:~$  logout
Connection to 192.168.66.39 closed.
FL1=1

正确/期望的输出只有 FL1=1,没有别的。

我在 Ubuntu 14.04.1 中运行这个脚本

标签: shell

解决方案


当您将-tt参数传递给 ssh 并且传递任何显式远程命令以运行时,这会导致在远程端运行交互式 shell。

交互式 shell 打印提示,并将用户正在运行的命令回显给该用户。

所以,有两件事——任何一个都应该解决这个问题,但最好同时做两件事:

  • 停止使用-tt,除非您有特定的、令人信服的理由来使用它。

  • bash -s作为要运行的显式远程命令传递。(这也保证了远程 shell 是 bash,而不是/bin/sh,因此仅 bash 的语法将起作用)。


推荐阅读