trap

在 .bashenv 中使用 shopt extdebug
trap

在 .bashenv 中使用 shopt extdebug

我在 Linux 的 Windows 子系统中使用 Ubuntu。 通过此建议的方法回答我可以在启动新的非交互式 shell 时运行代码: $ cat ~/.bashenv if [[ $- != *i* ]]; then echo foo fi $ export BASH_ENV=~/.bashenv $ bash -c 'echo bar' foo bar 现在我正在寻找启用 shopt extdebug 的陷阱功能。 我尝试过这样的事情: $ cat ~/.bashenv #!/bin/bash say_foo() { echo "foo" ...

Admin

尽管设置了 -T,bash DEBUG 陷阱不会被子 shell 继承
trap

尽管设置了 -T,bash DEBUG 陷阱不会被子 shell 继承

我在用着: $ bash --version GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu) 鉴于: #!/bin/bash validate() { if [[ "$BASH_COMMAND" == whoami ]]; then echo "whoami detected!" fi } $ set -T $ trap 'validate' DEBUG $ shopt -s extdebug 然后如果我写whoami,我会得到“whoami detect...

Admin

子壳和信号传播
trap

子壳和信号传播

我对子外壳中的信号传播感到好奇。我有以下 bash 脚本: #!/bin/bash function test_trap() { echo "hello" } trap 'test_trap' SIGUSR2 (#subshell trap 'test_trap' SIGUSR2 some_command ) other commands 然后我使用 SGE 网格引擎将其提交到网格。问题是,当我取消作业时,SGE 向其发送 SIGUSR2 信号,然后在预先配置的时间后(或者如果脚本不处理该信号或已经处理该信号)发送 SIGKILL。 我的问题是,...

Admin

Xen 如何验证来宾操作系统安装的异常处理程序?
trap

Xen 如何验证来宾操作系统安装的异常处理程序?

我不明白论文的一部分Xen 和虚拟化的艺术。关于虚拟化异常处理(第 2.1.2 节)的主题,论文指出每个客户操作系统都可以注册一个表,将异常映射到异常发生时它想要执行的处理程序,然后: 通过在将异常处理程序提供给 Xen 时对其进行验证来确保安全性。唯一需要检查的是处理程序的代码段没有指定在环 0 中执行。由于没有客户操作系统可以创建这样的段,因此只需将指定的段选择器与 Xen 保留的少量静态值进行比较就足够了。 我的理解或多或少是这样的:Xen 不需要担心包含特权指令的处理程序代码,因为如果是这种情况,运行指令就会失败,因为处理程序在环 0 之外运行(...

Admin

为什么“trap”传递的是零而不是进程被杀死的信号?
trap

为什么“trap”传递的是零而不是进程被杀死的信号?

考虑以下: #!/bin/bash trap 'echo $?' INT kill -INT $$ 输出:0 在这里我期望130我的系统。当然,如果我做了 aCtrl + C那么我会得到130。 HUP对于任何其他信号(如或 )也会发生同样的情况TERM。我发现这种行为令人惊讶,因为如果您设置了trap捕获许多信号的设置,那么就无法使用调用处理程序的信号的正确错误代码退出: #!/bin/dash exit_abrupt() { exit_code=$? echo "Encountered an error, cleaning up.....

Admin

如何在 Bash 脚本中清除悬念 (ctrl-z)?
trap

如何在 Bash 脚本中清除悬念 (ctrl-z)?

我有以下脚本: suspense_cleanup () { echo "Suspense clean up..." } int_cleanup () { echo "Int clean up..." exit 0 } trap 'suspense_cleanup' SIGTSTP trap 'int_cleanup' SIGINT sleep 600 如果我运行它并按Ctrl-C, Int clean up...show 并退出。 但是如果我按Ctrl-Z,^Z字符会显示在屏幕上,然后挂起。 我怎么能够: 在 上运行一些清理代码Ctr...

Admin

捕获 SIGINT 以便进程自行终止
trap

捕获 SIGINT 以便进程自行终止

所以第 5 节来自这里对我来说很有意义,我想实施它。我有这个 bash 脚本 #!/usr/bin/env bash cp aux.sh aux.sh.bak cleanup() { cp aux.sh.bak aux.sh rm -rf aux.sh.bak } trap 'cleanup; trap - SIGINT; kill -s SIGINT "$$"' SIGINT trap cleanup EXIT echo "Hold this for now" >> aux.sh read -rp "Hit Enter...

Admin

如何在子 tmux 进程中使用 trap?
trap

如何在子 tmux 进程中使用 trap?

我希望在子 tmux 进程终止时执行一个函数。 考虑以下脚本: #!/bin/bash function foo { echo "foo exit" } trap foo SIGHUP tmux 该脚本启动 tmux。然后,从 tmux 会话内部运行: $ tmux kill-session 然后 tmux 关闭,我看到: [exited] 该foo函数没有被调用,我猜是因为父进程没有收到 SIGHUP 信号。 我希望在关闭foo时执行该函数。tmux我怎样才能实现这个目标? ...

Admin

陷阱如何影响外部程序?
trap

陷阱如何影响外部程序?

当进入子 shell 时,未被忽略的陷阱应设置为默认操作 来源:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_28 显然,对于我从 shell 调用的外部程序来说也是如此。trap "" SIGNAL致力于捕获(忽略)该信号。但trap action SIGNAL不调用action,不执行任何操作,并且信号处理似乎设置为其原始默认值。 这种行为是在哪里定义的? ...

Admin

bash 退出时 sudo 可能存在的安全风险
trap

bash 退出时 sudo 可能存在的安全风险

我最近读到关于使用 bash 的内置trap命令在 bash 退出时执行命令的文章,例如,trap "notify-send test" EXIT在 bash 终止时立即发送桌面通知。首先想到的是:攻击者会不会利用这一点?经过一番研究和反复试验,我发现了以下内容。 sudo 手册页说: 安全策略可能支持凭证缓存,以允许用户在一段时间内再次运行 sudo,而无需进行身份验证。默认情况下,sudoers 策略会在每个终端上缓存凭据 15 分钟。 我结合了这两个信息,得出了这样一个命令: ,如果用户在 15 分钟内使用 sudo ,trap 'printf "...

Admin

在前台进程中发送并捕获 SIGTTIN SIGTTOU?
trap

在前台进程中发送并捕获 SIGTTIN SIGTTOU?

根据信号的描述(参考),似乎 SIGTTIN 和 SIGTTOU 仅在进程处于后台时才会发送到该进程。如果启用了此类流量控制,则按下Ctrl-s确实会停止终端中的打印。所以问题是,是否有可能实际将 SIGTTIN/SIGTTOU 信号传递给当前位于前台的进程并捕获它? 例如,将以下代码保存在文件中,chmod +x然后运行它。然后按Ctrl-s/ Ctrl-q。您会注意到它Ctrl-s确实停止并Ctrl-q恢复打印。但文件./trap.log文件将为空。 #!/usr/bin/env zsh touch ./trap.log trap 'echo TSTP ...

Admin

通过 SSH 使用时,捕获 shell 脚本不起作用
trap

通过 SSH 使用时,捕获 shell 脚本不起作用

我正在开发client并想要运行server一个包含trap. server如果我连接到交互式 SSH 会话并在其中运行以下最小示例,则它可以正常工作: user@client:~$ ssh user@server user@server:~$ sh -c 'trap "echo exiting..." EXIT' exiting... user@server:~$ 但是,如果我不交互连接server,而是将命令添加到ssh命令中,则不再起作用: user@client:~$ ssh user@server...

Admin

Bash:是否有可能在子 shell 中捕获 SIGTERM (或其他)?
trap

Bash:是否有可能在子 shell 中捕获 SIGTERM (或其他)?

考虑多个子 shell,每个子 shell 写入自己的日志文件。考虑一个子 shell 失败,导致向SIGTERM所有子 shell 发送(使用某种机制)。收到后SIGTERM所有子 shell 都会终止。但是,SIGTERM以 - 终止的子 shell 日志文件会被保留。这就是问题。 问题:收到后如何删除子shell日志文件SIGTERM? 我试过这个: _term() { rm -f $log_file } trap _term SIGTERM 然而,据我了解,这是行不通的,因为“陷阱处理程序永远不会被子 shell 继承”。 在里面的描述tra...

Admin

如何让脚本在暂停时回显某些内容?
trap

如何让脚本在暂停时回显某些内容?

我正在使用 暂停终端脚本SIGSTOP,并且希望它打印一条消息,表明它正在暂停。 由于我无法捕获SIGSTOP,我尝试SIGUSR1在 之前发送 aSIGSTOP并捕获它,但是我放入陷阱的命令最终在脚本恢复后被执行。 如果我在和sleep之间放置,则会执行 trap 命令,但脚本会在收到 之前运行一段时间。SIGUSR1SIGSTOPSIGSTOP 有没有一种方法可以让我从外部告诉我的脚本回显“我正在暂停”,然后立即地停止? 编辑:我正在使用 bash。我的测试脚本只是: trap "echo Paused" SIGUSR1 trap "echo Res...

Admin