我有一个 ssh 隧道侦听本地端口,比如 8888,从远程机器打开ssh -R 8888:localhost:80 myuser@myhost。我需要在“myhost”上为“myuser”编写一个脚本来关闭这个隧道。
该脚本将由“myuser”在“myhost”上执行。它不会由 root 执行,也不会执行 sudo。
一种方法是使用 lsof 或 netstat 找到侦听 8888 的进程的 PID,然后终止该进程。然而,lsof 和 netstat 都拒绝给我 PID 而不去 sudo。使用 netstat 我只是得到-而不是没有 sudo 的“PID/程序名称”。
有没有办法找出在没有根权限的情况下侦听给定端口的进程的 PID?侦听此端口的进程在我们所在的同一用户下运行。或者有没有其他方法可以从外部关闭 ssh 隧道?
请注意,使用 ssh 转义序列重置连接不是解决方案,因为我们不在隧道中。我们的脚本需要由同一用户在同一主机上单独运行。
另请注意,仅运行killall sshd不是解决方案,因为它会杀死所有其他 ssh 连接,而不仅仅是这个连接。
这个问题不是许多类似问题的重复,因为我发现他们接受的所有答案都需要 root 权限,或者只是杀死所有 ssh 连接。
主机“myhost”正在运行 Ubuntu 12.04.5。
编辑:@Jakuje 要求的讨论摘要:
@Patrick 建议了一种使用setuid或修改的方法,/etc/sudoers以允许用户在没有完整 sudo 的情况下以 root 权限运行脚本。虽然,因为setuid我们需要编写一个二进制文件而不是脚本。但是,允许用户以 root 权限运行脚本可能存在潜在的安全风险。而且这个解决方案仍然没有涵盖用户根本没有 root 访问权限的情况,所以他不能修改/etc/sudoers. 如果@Patrick 将此写为答案,我肯定会赞成它,但我不会将其标记为已接受。
@EricRenouf 发现 …