0

我正在ft820.rc使用 bash 版本 bash 3.0 启动 ftam 服务器(在 CentOS 5 上),并且从脚本启动它时遇到问题,即在我执行的脚本中

ssh -nq root@$ip /etc/init.d/ft820.rc start

并且脚本不会在此行之后继续,尽管当我在定义的机器上执行时$ip

/etc/init.d/ft820.rc start

我会在服务启动后立即返回提示。

这是开始的代码ft820.rc

  SPOOLPATH=/usr/spool/vertel
  BINPATH=/usr/bin/osi/ft820
  CONFIGFILE=${SPOOLPATH}/ffs.cfg

  # Set DBUSERID to any value at all. Just need to make sure it is non-null for
  # lockclr to work properly.
  DBUSERID=
  export DBUSERID

  # if startup requested then ...
  if [ "$1" = "start" ]
  then
          mask=`umask`
          umask 0000

          # startup the lock manager
          ${BINPATH}/lockmgr -u 16

          # update attribute database
          ${BINPATH}/fua ${CONFIGFILE} > /dev/null

          # clear concurrency locks
          ${BINPATH}/finit -cy ${CONFIGFILE} >/dev/null

          # startup filestore
          ${BINPATH}/ffs ${CONFIGFILE}
          if [ $? = 0 ]
          then
                  echo Vertel FT-820 Filestore running.
          else
                  echo Error detected while starting Vertel FT-820 Filestore.
          fi

          umask $mask
4

1 回答 1

1

我在这里(应@Patryk 的要求)重新发布我在问题评论中的内容:

“在命令行中执行 ssh 时是否相同... .ssh/authorized_keys 文件? – Olivier Dulac 20 小时前“

“你说,在命令行(而不是在脚本中)你可以 ssh root@.... 并且它不需要你的密码就可以工作?(即,它可以从脚本运行?) – Olivier Dulac 20几小时前“

" 尝试不带 '-n' 甚至完全不带 -nq 的 ssh : ssh root@$ip /etc/init.d/ft820.rc start (您甚至可以添加 ssh -v ,它会显示本地(1 :) 和远程 (2:) 事件以非常冗长的方式,帮助了解它究竟卡在哪里)– Olivier Dulac 19 小时前“

"also : 在脚本中的 "ssh..." 行之前,再写一行,例如: ssh root@ip "set ; 密码; ID ; whoami”并查看它是否有效并显示正确的信息。这可能有助于确保 ssh 部分正常工作。“set”部分还将向您显示正在运行的 shell(例如:如果它包含 BASH= ,则您正在运行 bash . 否则 SHELL=... 应该给出一个很好的提示(有时不正确)关于哪个 shell 被调用) – Olivier Dulac 19 小时前“

" 请尝试不使用 '-n' (= 在后台运行并等待,而不是运行然后退出)。它不起作用,尝试将 -t -t -t (3 次) 添加到 ssh,以强制它分配一个 tty。但首先,请去掉 '-n'。——Olivier Dulac 18 小时前“

显然有效的是将-t选项添加到 ssh 命令。(你可以上去放 '-t -t -t' 以进一步强制它尝试分配 tty,视情况而定)

我猜这是因为调用的命令预计将在交互式会话中运行,因此需要一个“tty”作为标准输出

一种可能性(但只是一个疯狂的猜测):调用的 rc 脚本输出信息,但在缓冲环境中(即,当未通过终端启动时),调用脚本看不到足够的行来填充缓冲区并开始打印任何内容出(比如当你在缓冲环境中执行“grep something | something else”并在缓冲区大到足以显示任何内容之前按 ctrl+c 时:你最终认为 grep 没有找到任何行,而可能有一些已经在缓冲区中的行)。关于缓冲有很多话要说,我才刚刚开始阅读这一切。强制 ssh 分配一个 tty 使被调用的命令认为它正在输出到实时终端会话,这可能已经关闭了缓冲并允许显示结果。也许在第一种情况下,它也有效,

于 2013-01-09T10:43:59.370 回答