【问题标题】:bash script starting service over sshbash 脚本通过 ssh 启动服务
【发布时间】:2016-11-26 16:47:42
【问题描述】:

我正在尝试在我刚刚从命令行调用的 bash 脚本中通过 ssh 启动服务。我可以执行以下命令:(我有 ssh 密钥,所以我不需要输入密码)

ssh -t -t user@server 'sudo /sbin/service test stop' -- 工作正常,停止服务

ssh -t -t user@server 'sudo /sbin/service test status' -- 工作正常,状态是服务

ssh -t -t user@server 'sudo /sbin/service test start' -- 不启动服务???

这是在 centos 6.7 上运行的自定义 init.d 脚本

有人有什么想法吗?

或者看看我可能遗漏了什么?

谢谢!

编辑:这是 init.d 脚本:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          test
# Required-Start:    networking
# Required-Stop:     networking
# Default-Start:     3 4 5
# Default-Stop:      0 1 6
# Short-Description:
### END INIT INFO
#

###source function library
source /etc/init.d/functions

APPNAME="test"
APPDIR="/tmp"
CONFIGDIR="/tmp/config"
LOCKFILE=/var/lock/subsys/$APPNAME
PIDFILE="/var/run/$APPNAME.pid"

###Declare variables for test
CONFIG="test.config"

start() {
    echo -n "Starting $APPNAME: "
    source "${CONFIGDIR}/source.txt"
    daemon --pidfile="$PIDFILE" "/tmp/${APPNAME} ${CONFIGDIR}/${CONFIG} >> /tmp/console.log 2>&1 &"
    RETVAL=$?
    [ $RETVAL -eq 0 ] && {
            touch $LOCKFILE
            pidof $APPNAME > $PIDFILE
    }
    return $RETVAL
}

stop() {
    echo -n $"Stopping $APPNAME:"
    killproc -p "$PIDFILE" $APPNAME
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $LOCKFILE $PIDFILE
    return $RETVAL
}

case "$1" in
    start)
            start
            ;;
    stop)
            stop
            ;;
    status)
            status -p "$PIDFILE" "$APPNAME"
            ;;
    restart)
            stop
            start
            ;;
    *)
            echo "Usage $prg {start|stop|status|restart}"
            exit 1
            ;;
esac
exit $RETVAL

【问题讨论】:

  • 能否包含自定义的init.d 脚本?
  • 什么是“自定义 init.d”?
  • 您可能想将-n 传递给ssh,将stdin 重定向到/dev/null。可能是远程端正在读取它,并且卡住了。我怀疑你不想要-t
  • 如果我不使用 -t -t 我得到“sudo:抱歉,你必须有一个 tty 才能运行 sudo”我添加了 -n,同样的问题
  • @georges,我很确定 sudo 就是问题所在。如果需要,它希望 tty 提示输入密码。如果您执行 'sudo /sbin/service test start </dev/null >/dev/null 2>&1' 之类的操作怎么办?这应该强制所有文件句柄与终端分离。或使用>&- 等关闭它们...

标签: bash service ssh centos init.d


【解决方案1】:

我找到了解决方法:

ssh -t -t user@server 'sudo bash -s' < '/tmp/start_test.sh' 

然后在服务器上:

/tmp/start_test.sh

#!/bin/bash

sudo service test start >> /tmp/start.log

exit 0

【讨论】:

    【解决方案2】:

    这个我测试成功了:

    echo "sudo service test start && exit" | python -c 'import pty, sys; pty.spawn(sys.argv[1:])' ssh user@server
    

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2011-01-23
      • 2023-03-26
      • 1970-01-01
      • 2018-01-28
      • 2011-12-27
      相关资源
      最近更新 更多