【问题标题】:Get the PID of a process started with sudo via ssh通过 ssh 获取以 sudo 启动的进程的 PID
【发布时间】:2016-01-20 15:38:08
【问题描述】:

我需要通过 SSH 和 sudo 远程启动的进程的进程 ID(此处为 sleep 20)。

date 被插入以说明 SSH 连接的持续时间。当然,如果没有连接,我的远程机器上也没有进程。

$ date; ssh pc1 "sleep 20 & echo \$!"; date                            # works
Mi 20. Jan 16:18:29 CET 2016
11540
Mi 20. Jan 16:18:50 CET 2016
$ date; ssh pc1 "echo password | sudo -S sleep 20"; date               # works
Mi 20. Jan 16:20:44 CET 2016
[sudo] password for lab: Mi 20. Jan 16:21:04 CET 2016
$ date; ssh pc1 "echo password | sudo -S sleep 20 & echo \$!"; date    # does not
Mi 20. Jan 16:21:55 CET 2016
11916
Mi 20. Jan 16:21:56 CET 2016

在第二台机器上,最后一个完整的命令可以正常工作:

$ date; ssh pc2 "echo password | sudo -S sleep 20 & echo \$!"; date
Mi 20. Jan 16:23:40 CET 2016
6035
[sudo] password for lab: Mi 20. Jan 16:24:01 CET 2016

有什么建议为什么两台机器会有这种不同的行为?

信息:我知道清除密码的风险,但它是隔离测试网络中的共享帐户。

【问题讨论】:

  • “不起作用”是什么意思?
  • 我投票结束这个问题,因为它更适合Unix & Linux Stack Exchange。
  • 这意味着我的进程没有在远程机器上运行。它要么因关闭连接而被杀死,反之亦然。
  • 唉,这个问题与为 StackOverflow 定义的编程无关。它可能更适合unix.stackexchange.comServerFault.com(专业的服务器或网络相关的基础设施管理)。考虑使用问题底部的标记链接,并要求版主将其移至正确的站点。 (请不要在多个网站上发布相同的问题。)
  • 我将其标记为移动。对我来说,这是 Shell/Bash 编程。

标签: linux bash shell ssh sudo


【解决方案1】:

这样的?

$ remote_pid=$(ssh mauro@planck 'sleep 20 > /dev/null 2>&1 & echo $!')
$ echo $remote_pid
13878

或者...

$ remote_pid=$(ssh mauro@planck 'echo secret | sudo -S sleep 20 > /tmp/log 2>&1  & echo $!')

【讨论】:

  • 执行sudo的用户密码输入在哪里?
  • 除了输出管道到文件之外,它与我的完全相同,也不起作用。在日志文件中只有 sudo 的密码提示(来自 stderr)。
  • $!必须被转义,它是从远程shell而不是本地shell解释的。​​
【解决方案2】:

这看起来像是一个不完整的进程依赖关系的问题。再加上几毫秒,连接(和进程)始终保持建立。

$ date; ssh pc1 "echo password | sudo -S sleep 20 & echo \$! && sleep 0.01"; date
Do 21. Jan 14:50:39 CET 2016
[sudo] password for lab: 6841
Do 21. Jan 14:51:00 CET 2016

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2012-10-23
    • 2011-05-10
    • 2013-02-07
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多