通过 SSH 启动守护进程

通过 SSH 启动守护进程

临时解决方案:目前我正在使用 systemd 服务来处理这个问题,使用invoke来响应密码。

我在通过 SSH 执行以下命令时遇到了问题:

ssh -t user@host "sshuttle -D --dns -r user@host:port -x 192.168.1.0/24 0/0"

工作(无守护进程):

ssh -user1@host1 ssh user2@host2 'sudo sshuttle --dns -r user3@host3:port -x 192.168.1.0/24 0/0'

不起作用(使用守护进程和睡眠):

ssh -user1@host1 ssh user2@host2 'sudo sshuttle -D --dns -r user3@host3:port -x 192.168.1.0/24 0/0 && curl ifconfig.co && sleep 3'

我已确定该问题完全是由于 -D(守护进程)参数造成的。

  • 此代码在本地运行时(在远程服务器上)有效
  • 该问题不是由于超级用户权限造成的。
  • 我尝试了许多组合(包括手动调用 bash -c 和 bash -s。)
  • 我已经远程部署了一个 bash 脚本,并通过 SSH 执行了该脚本来启动隧道。
  • 我尝试删除 -D 参数并使用 nohup 和 & (一起和单独使用)。
  • 我已将“/etc/systemd/logind.conf”修改为“KillUserProcesses=no”

所有尝试都成功返回/退出代码,但是没有启动隧道。如果我删除守护进程参数,它就可以正常工作,但我需要它在后台运行。

关于如何通过 SSH 执行 sshuttle 守护进程,您有什么想法吗?

答案1

您是否尝试过ssh使用该-t标志运行?可能sshuttle需要一个tty才能运行。该-t标志强制在连接上使用伪终端。

如果这不起作用,另一个选择可能是尝试在screen. 中运行该过程,例如:

ssh user1@host  'screen -dmS myscreen mycommand.sh'  

这为进程提供了一个写入输出的位置。由于 sshuttle 命令中有很多元字符,您可能需要将它们放在远程系统上的某个启动脚本中(例如 mycommand.sh),或者尝试找出最佳的转义字符方法(例如 和&&@,以便让所有字符在一行中运行。

相关内容