【问题标题】:Make shell command from child process execute in parent (to lock shell)使来自子进程的 shell 命令在父进程中执行(锁定 shell)
【发布时间】:2015-06-10 11:54:19
【问题描述】:

我有一个名为lock 的用户定义命令。执行该命令后,系统将被锁定。如果我们只给出正确的密码,那么只有命令 提示出现。现在,我想从脚本执行lock 命令 在后台运行。如果我们执行脚本lock,命令就会被执行,但它不会锁定当前终端。它只锁定后台 bash。它不在当前的 bash 中执行。如何解决这个问题?

谢谢。

【问题讨论】:

  • 你不能。后台进程无法控制前台 shell。它们是单独的过程。同理后台脚本不能在前台进程中设置变量。
  • 因此,无法从子 shell 执行父 shell 中的命令。这样对吗?谢谢...
  • 没错。它们和其他两个进程一样是完全独立的进程。
  • 我的要求是:如果我的系统达到1分钟的空闲时间,就会自动执行“lock”命令。至此检查系统的空闲时间,后台进程将运行。如果达到 1 分钟,后台进程执行锁定命令。这是我的要求。那么,有什么办法可以做到这一点。
  • 它是否 需要 锁定或是否可以终止 shell 会话?我不知道有什么方法可以直接用外壳做锁的想法。不过,像 GNU screen 和 tmux 这样的东西支持这种超时/锁定。要终止会话,您可以查看 TMOUT bash 变量。此外,无论这个“锁定”命令是什么,听起来(临时)都不是很安全。它在做什么?

标签: linux bash shell unix


【解决方案1】:

您可以使用 DEBUG 陷阱从命令提示符执行命令之前执行命令:

trap 'command' DEBUG

这将在每个命令之前执行命令。更改后台脚本以在系统锁定时创建某种标志文件。并让您的命令检查该文件是否存在。像这样:

if [[ -f lockfile ]]
then p=
    while [[ "$p" != secret ]]
    do  echo -n password: 
        read p
    done
    rm -f lockfile
fi

我并不是说它是安全的。

另一种方法:

运行两个 shell。下层 shell 循环询问密码,然后运行上层。上壳是普通壳。后台任务在想要锁定终端时杀死上层shell,将控制权返回给下层。

【讨论】:

  • 我的要求是:如果我的系统达到1分钟的空闲时间,就会自动执行“lock”命令。至此检查系统的空闲时间,后台进程将运行。如果达到 1 分钟,后台进程执行锁定命令。这是我的要求。
  • 这是一个解决方案,而不是一个要求。要求类似于“我想在一分钟后锁定终端”。您可以在后台运行 lock 命令,但它永远不会起作用。
  • 您可以按照我的建议从 DEBUG 陷阱运行 lock 命令,有条件地在标志文件上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2019-11-21
  • 2017-11-18
相关资源
最近更新 更多