停止 bash 命令而不终止脚本

停止 bash 命令而不终止脚本

所以我从 shell 运行以下命令

~/for ip in $(cat ip_list);do mkdir $ip; cd $ip; for vuln in $(snmap http);do nmap --script=$vuln $ip -oN $vuln;done cd ../ ; done

并且已经正常运行了大约一天。它正确创建目录并浏览它们。

然而,其中一个脚本现在挂起......

所以我想做的是使用类似于 CTR+C 的关键命令来终止 nmap 的迭代,但不退出正在运行的脚本。这样我就不必从头开始或修改我的 ips 列表。

答案1

这个答案是针对 Bash 的。

为此,您可以使用陷阱。这是一个说明性示例。要继续循环,请使用Ctrl+ c。除了关闭终端或从另一个终端杀死它之外,没有办法停止脚本。

#!/bin/bash

trap ps SIGINT
for i in a b c d;  do
    for j in w x y z; do
        echo ----$i$j------ && ping stackexchange.com -c 10
    done
done
exit

您的脚本看起来像这样(经过我的一些改进),但请注意它尚未经过测试:

#!/bin/bash
trap '' SIGINT
for ip in $(cat ip_list); do
    mkdir $ip && cd $ip &&
    for vuln in $(snmap http);do
        nmap --script=$vuln $ip -oN $vuln
    done &&
    cd ..
done

我引入的更改&&可以防止输入可能导致错误的逻辑路径。如果可能的话,施加这样的限制会更安全。当这样说时:

mkdir $ip; cd $ip;

如果无法创建目录,则会cd导致错误。

当你这样说时:

mkdir $ip && cd $ip

如果由于某种原因尚未创建该目录,则不会cd尝试。当你把mkdir $dir从 到cd $dir到的所有命令都用cd ..链接起来时&&,逻辑就清晰了,结构也不会出错。当您使用;并创建目录失败时,您将无法进入该目录,但您可能不会无法更改为...

答案2

我知道我发帖然后回答,但我想保留这个答案,以防其他人遇到这个问题。

我所做的是从另一个外壳,我运行ps -a然后找到我的 nmap 进程并用 杀死它kill proc-id。该脚本继续进行下一次迭代。

相关内容