【问题标题】:ssh + pipe: CTRL-C should also terminate remote commandssh + 管道:CTRL-C 也应该终止远程命令
【发布时间】:2017-02-15 09:47:27
【问题描述】:

我需要远程运行命令,所以我通过 ssh 启动它。如果我使用 CTRL-C,本地 ssh 客户端和远程命令都会终止。很好。

出于某种原因,我需要将一些数据通过管道传输到远程,所以我的命令如下所示:

ssh user@remote "wc -c; sleep 10000" < test.data

数据被接收和处理。但是如果我现在按下 CTRL-C,只有本地命令(ssh 客户端)被终止。

如何解决这个问题? (要求是:向远程发送数据,使用该数据执行远程命令。整个事情应该可以用CTRL-C完全中断)

如果有帮助:遥控器的 STDIN 可以在“wc”之后关闭。不幸的是,我关闭标准输入的尝试没有成功......

【问题讨论】:

  • 你试过ssh -tssh -t -t 按照stackoverflow.com/q/331642 吗?
  • Siguza:是的,我做到了:'-t' 被忽略(因为管道而发出警告)并且 '-tt' 破坏了管道(数据发送到 stdout,wc 不接收数据)

标签: ssh pipe


【解决方案1】:

我找到了一个更像是 hack 的解决方案。所以我仍然对更好的方法感兴趣......

ssh user@remote "
  #start background subshell to cleanly stop processes after pressing
  #CTRL-C on ssh's client side...
  SHPID=\$\$;
  (
    while sleep 1
    do
      PP=\$SHPID; 
      while [[ \$PP -gt 1 ]]
      do 
        PP=\$(ps -o ppid= \$PP)
        ps -o cmd= \$PP
      done | grep -Eq '^/usr/sbin/sshd( |\$)'
      [[ \$? -ne 0 ]] && break
    done
    pkill -TERM -P \$SHPID
  ) &

  #the real command
  wc -c
  sleep 10000
"

这个想法是定期检查进程树是否存在“/usr/sbin/sshd”进程。如果它不再存在,杀死“低于”$SHPID 的所有作业

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2013-12-30
    • 2021-05-29
    • 2014-09-08
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多