仅在使用“ bash -s <脚本”

时间:2019-01-04 20:19:28

标签: bash

=“”

调用脚本时,“读取”后出现语法错误我用它们来自动化一个小的过程。

script1使用命令启动script2

ssh -i /pathToKeyFile/keyfile.pem user@server2 'bash -s < /pathToScriptFile/script2.sh'

在script2.sh中,我有一个“大小写”问题:

#!/bin/bash

# Ask to start up JBOSS
read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS
case "$startJBOSS" in
        y|Y ) echo "Starting JBOSS and FACADE";;
        n|N ) echo "Stopping here"
        exit;;
        * ) echo "Invalid option..."
        exit;;
esac

echo "More commands here"
exit

因此,当我执行script1.sh时,它在远程服务器上可以正常运行,而starstt2可以正常运行。 但是script2无法出错

bash: line 5: syntax error near unexpected token `)'
bash: line 5: ` y|Y ) echo "Starting JBOSS and FACADE";;'

如果我直接从远程服务器执行script2.sh,它将按预期工作。

我也尝试过将两个脚本文件都放在一台服务器中。在这种情况下,启动script2.sh的命令是不同的,但是在这种情况下,两者都可以按预期工作。

我无法弄清为什么script2.sh从其他服务器中启动以及从其他服务器启动时失败。我认为script2.sh“代码”是正确的,因为它在单独运行时可以正常工作。

1 个答案:

答案 0 :(得分:3)

问题是read从stdin读取-代码来自同一位置。

因此,它从源文件中读取一行,而不是从用户那里读取一行,而使用case命令,从而使源文件的其余部分在语法上无效。


简单的答案:不要那样做。

bash -s <filename来自<filename副本无法访问的某个地方(例如SSH连接的另一端,或只能读取的文件)时,

bash才有意义由其他用户),但您的示例并非如此。因此,您可以停止使用-s参数和重定向:

ssh -i /pathToKeyFile/keyfile.pem user@server2 'bash /pathToScriptFile/script2.sh'

...或使提示成为条件...

另一种方法是使read以实际有用户在TTY上收听为条件:

if [[ -t 0 ]]; then  # test whether FD 0, stdin, is a TTY
  read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS
else
  startJBOSS=y       # no TTY, so assume yes
fi

...或使提示从/dev/tty中读取,并确保SSH将其通过。

另一种方法是显式读取/dev/tty,然后通过将适当的参数传递给ssh来使其在脚本的上下文中有效:

if read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS </dev/tty; then
  : "read $startJBOSS from user successfully" # <- will be logged if run with set -x
else
  echo "Unable to read result from user; is this being run with a TTY?" >&2
  exit 1
fi

...然后,另一方面,对SSH使用-t参数,以强制存在一个TTY(如果SSH本身可用,则为TTY;否则,为 it 也无法从带外用户那里读取信息):

ssh -t -i /pathToKeyFile/keyfile.pem user@server2 'bash -s < /pathToScriptFile/script2.sh'