临时解决方案:目前我正在使用 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),或者尝试找出最佳的转义字符方法(例如 和&&
)@
,以便让所有字符在一行中运行。