Bash脚本可打开多个netcat实例并退出它们

佩格莱格

我正在尝试创建一个脚本,该脚本打开多个gnome终端并打开一个netcat连接。几秒钟后,我希望关闭终端。我很茫然,我相信这是不可能的,但是我想我会问。

到目前为止,这是我所拥有的,但是在运行它之后,进程ID被认为是不正确的,并且我相信这是因为gnome-terminal将进程分叉到bash上,而我没有捕获该pid。

ipaddress=$1
port=$2
processarray=()
echo "netcat command set to ip: $ipaddress and port: $port"
if [ -z "$ipaddress" ]; then
    echo "No ip address entered"
fi
if [ -z "$port" ]; then
    echo "No port entered default set to 0"
    $port=0
fi
for i in {0..9}; do
    gnome-terminal -e "bash -c \"netcat $ipaddress $port; exec bash\"" & processarray+=  ("$!")
done

sleep 10;
for i in "${processarray[@]}"; do
    kill "$i"
done
马尔特·斯科鲁帕(Malte Skoruppa)

那是因为gnome-terminal是“聪明”。启动时gnome-terminal,它将确定是否gnome-terminal已在运行另一个实例

  • 如果否,它将创建一个新gnome-terminal进程并生成一个窗口。
  • 如果是,它将仅导致现有gnome-terminal进程产生一个新窗口。

因此,所有 gnome-terminal窗口都使用单个PID作为单个进程运行。

您可以通过打开几个gnome-terminal窗口轻松地检查此情况,然后通过在xprop _NET_WM_PID某个位置发布并在其中单击来获取其PID 您会看到所有窗口的PID都是相同的。

那么脚本中会发生什么呢?

您正在捕获gnome-terminal启动实例的PID ,但是问题是,这些PID仅存在了不到一秒的时间。这些过程只会导致现有gnome-terminal过程产生一个新窗口,然后终止。

因此,如果您gnome-terminal在执行脚本时已经拥有一个活动进程(我假设是这样),那么在尝试杀死它们时,您收集的PID将不再存在。如果不这样做(例如,您从一个xterm或其他终端仿真器执行该脚本),则您收集的第一个PID确实是“正确的”。您收集的以下PID将是“不正确的”。进入终止循环后,第一次迭代将终止所有gnome-terminal窗口,随后的迭代将输出错误,因为这些PID不再存在。

那么,如何解决呢?

好吧,我可以立即想到两种方法。

  1. 如果您不坚持使用gnome-terminal,请改用其他终端模拟器,该模拟器不会以这种方式运行。xterm例如,为每个窗口生成一个单独的进程。如果您使用xterm而不是gnome-terminal在脚本中使用它,那么它应该可以工作。容易&干净。

  2. 如果您确实坚持使用gnome-terminal,杀死特定gnome-terminal窗口的方法将是杀死在特定窗口内运行的进程。终止该过程后,该窗口将关闭。但是,由于您正在使用该-e选项,因此该过程将netcat $ipaddress $port首先进行,然后再进行bash,并且很难获得PID。您目前无法像现在那样轻易地收集它们$!你可以尝试像killall netcat或者killall bash,但很明显,这也将终止所有其他netcatbash情况下,你可能不希望。您可能可以grep通过一些巧妙设计的ps调用来尝试查找要杀死的确切PID,但这很不稳定且容易出错。老实说,我只想寻求解决方案1。

关于脚本的两个小注释:

  • 第10行:应该port=0,而不是$port=0

  • 第13行:应该是processarray+=("$!"),不是processarray+= ("$!")

希望能有所帮助。

编辑:哦,我刚刚找到的--disable-factory选项gnome-terminal,这导致它不重新使用现有进程。这是您的固定脚本:

#!/bin/bash

ipaddress=$1
port=$2
processarray=()
echo "netcat command set to ip: $ipaddress and port: $port"
if [ -z "$ipaddress" ]; then
    echo "No ip address entered"
fi
if [ -z "$port" ]; then
    echo "No port entered default set to 0"
    port=0
fi
for i in {0..9}; do
    gnome-terminal --disable-factory -e "bash -c \"netcat $ipaddress $port; exec bash\"" & processarray+=("$!")
done

sleep 10;
for i in "${processarray[@]}"; do
    kill "$i"
done

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

bash脚本可以在退出时用命令预填充提示吗?

来自分类Dev

Bash脚本可自动检测php5.6或7.0并替换它们,而无需指定

来自分类Dev

在脚本中获取进程的多个实例的pid并使用它们

来自分类Dev

Bash脚本打开多个终端寡妇?

来自分类Dev

如何终止netcat,以便我的脚本可以再次循环?

来自分类Dev

AHK脚本可打开特定网页

来自分类Dev

Netcat Chat bash脚本问题

来自分类Dev

bash shell脚本可以打开较少的文本文件,然后从脚本执行较少的命令吗?

来自分类Dev

从使用$()的bash脚本退出

来自分类Dev

Google脚本可清除多个范围。

来自分类Dev

如何使函数对bash脚本可见?

来自分类Dev

Bash脚本可以在多个终端会话中并行或并行启动多个进程,还是全部集中在一个前台?

来自分类Dev

打开多个Skype实例

来自分类Dev

注销和登录后bash脚本的多个实例

来自分类Dev

通过在for循环中启动多个实例来加速bash脚本

来自分类Dev

bash-Shell脚本打开多个终端并执行不同的命令

来自分类Dev

bash-Shell脚本打开多个终端并执行不同的命令

来自分类Dev

xbindkeys脚本可打开/关闭WiFi和蓝牙设备

来自分类Dev

xbindkeys脚本可打开/关闭WiFi和蓝牙设备

来自分类Dev

AutoHotKey宏脚本可打开Outlook并创建约会

来自分类Dev

Bash脚本退出清理

来自分类Dev

bash脚本中的退出状态

来自分类Dev

Bash在脚本中退出sudo

来自分类Dev

无法正确退出bash脚本

来自分类Dev

从Bash脚本打开URL

来自分类Dev

OSX“打开” bash脚本

来自分类Dev

bash在管道中读取netcat状态,然后退出

来自分类Dev

如何退出在脚本中打开的shell?

来自分类Dev

Bash句柄退出多个进程

Related 相关文章

热门标签

归档