SSH EXEC 无法执行远程 jar cmd

SSH EXEC 无法执行远程 jar cmd

发生了什么:
我已经输入ssh root@ip nohup java -jar app.jar &要在远程服务器上运行的 jar(该 jar 是 API 服务器)。
我的本地服务器正在获取 jar 日志,而不是写入远程服务器中的 nohup,并且我的 jar 正在运行但不起作用。

预期结果:
能够 从我的本地系统SSH EXEC运行。nohup java -jar app.jar &

版本:
Ubuntu 18.04

更新:
仅当通过 putty 执行 jar cmd 时,jar 的 API URL 才会返回输出。
对于远程 ssh exec,jar 的 API URL 输出为 404

更新1:
我所需要的只是在我的远程服务器的后台运行 jar(从我的本地系统执行 cmd)。

答案1

nohup和控制台输出......

重点是将输出重定向到空设备。

ssh user@host "sh -c 'cd /working/dir; nohup command -options > /dev/null 2>&1 &'"
# invoking sh makes output redirections easyier

ssh root@ip "sh -c 'nohup /path/to/java -jar /path/to/app.jar > /dev/null 2>&1 &'"

当然,输出可以保存到文件中

nohup some_command > output.log 2>&1 &


评论后编辑

通过 ssh 自动连接然后启动程序并进行交互(如显示输出日志),expect可以解决问题。

expect在本地机器上安装

sudo apt-get install expect

创建一个小脚本,命名它startItUp.sh并使其可执行

#!/usr/bin/expect -f
spawn ssh user@host

# Its not recommended to insert a password in a script
# a good practice will be to copy key with ssh_copy_id
#expect "password: "
#send "myP@sswOrd\r"

# once ssh connection is enabled, lets expect for prompt
expect "$ "
# i got the prompt, i send a command
send "cd /go/to/needed/dir \r"

# again
expect "$ "
send "java -jar app.jar \r"

# let me interact (for example, i'll be able to ctrl+c)
interact

答案2

有趣的话题:)

首先,我认为必须使用单引号来引用远程命令。关于这一点,很好的解释是@pt314在问题的可接受答案中SSH 如何在 if 条件下工作?以下是非关键部分:

主要问题是双引号字符串被本地 shell 扩展了......

但这可能只是问题的一部分。所以在继续之前,让我们先说几句最典型的方法nohup我们可以在互联网上找到的用法:

nohup comand -options arguments >/path/to/log 2>&1 &
|     |                         |             |    # run 'nohup' in the background
|     |                         |             # redirect stderror to stdout
|     |                         # redirect stdout of 'nohup', /dev/null when don't need it
|     # the command to be executed, its stdout/err will be appended to the nohop's stdout
# run the following command detached from the current shell

根据上述内容,您似乎需要这样的命令:

ssh user@host 'nohup remote_command -optins arguments &' >/tmp/local.log

但是,这里究竟发生了什么?

的 stdout(标准输出)nohup附加到 ssh 会话,ssh命令的输出重定向到当前 shell 会话中的文件。换句话说,远程命令附加到本地 shell 会话。因此,如果我们在链上(ssh 会话或本地 shell)终止某些操作,一切都会失败。显然,在这种情况下,我们nohup根本不需要远程会话。

如果我们更进一步,我们可以得出结论,nohup在本地使用是一个好主意:

 nohup ssh user@host 'remote_command -optins arguments' >/tmp/local.log 2>&1 &

这看起来很健壮,但是远程命令的执行仍然依赖于从本地计算机发起的 ssh 会话,因此,例如,如果重新启动,一切都将再次失败。


我认为有很多方法可以更安全地实现您的目标。以下是一条建议。

1.让我们nohup使用规范方式 执行远程命令:

ssh user@host 'nohup remote_command -optins arguments >/tmp/remote.log 2>&1 &' 

2.通过ssh获取远程日志并在后台写入本地日志:

nohup ssh user@host 'tail -n+1 -F /tmp/remote.log' >/tmp/local.log 2>&1 &

3.通过以下方式监视本地日志文件:

tail -F /tmp/local.log

相关内容