加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash中的IPC(使用命名管道,不使用expect)

发布时间:2020-12-15 21:01:23 所属栏目:安全 来源:网络整理
导读:我正在编写一个bash脚本,它应该与现有的(perl)程序交互(交互式).不幸的是我无法触及现有的perl程序,也无法使用 expect. 目前,该脚本与此stackoverflow应答Is it possible to make a bash shell script interact with another command line program?的行一致
我正在编写一个bash脚本,它应该与现有的(perl)程序交互(交互式).不幸的是我无法触及现有的perl程序,也无法使用 expect.

目前,该脚本与此stackoverflow应答Is it possible to make a bash shell script interact with another command line program?的行一致

问题是(读:似乎是)perl程序并不总是发送< newline>在要求输入之前.这意味着bash的while …读取命名管道不会“获取”(读取:显示)perl程序的输出,因为它一直等待更多.至少这是我理解它的方式.

所以基本上perl程序正在等待输入但是用户不知道因为屏幕上没有任何内容.

所以我在bash脚本中做的是关于

#!/bin/bash

mkfifo $readpipe
mkfifo $writepipe

[call perl program] < $writepipe &> $readpipe &
exec {FDW}>$writepipe
exec {FDR}<$readpipe

...

while IFS= read -r L
do
    echo "$L"
done < $readpipe

这是有效的,除非perl程序正在做类似的事情

print "n";
print "Choose action:n";
print "[A]: Action A      [B]: Action Bn";
print " [C]: canceln";
print "    ? ";
print "[C] ";
local $SIG{INT}  = 'IGNORE';
$userin = <STDIN> || ''; chomp $userin;
print "n";

然后bash脚本只“看到”

Choose action:
[A]: Action A      [B]: Action B
 [C]: cancel

但不是

? [C]

这不是最有问题的案例,而是最容易描述的案例.

有没有办法确保? [C]也被打印出来了(我和猫一起玩了< $readpipe&amp ;;但那真的不起作用)? 或者是否有更好的方法(鉴于我无法修改perl程序的限制,也不能使用expect)?

解决方法

使用读-N1.

让我们尝试下面的示例:与发送提示的程序交互(不是由换行符结束),我们的系统必须发送一些命令,接收发送的命令的回显.也就是说,子进程的总输出是:

$cat example 
prompt> command1
prompt> command2

该脚本可能是:

#!/bin/bash 
#

cat example | while IFS=$'' read -N1 c; do
  case "$c" in
  ">") 
       echo "received prompt: $buf" 
        # here,sent some command
       buf=""
       ;;
  *)
      if [ "$c" == $'n' ]; then
        echo "received command: $buf"
        # here,process the command echo
        buf=""
      else
        buf="$buf$c"
      fi
      ;;
  esac
done

产生以下输出:

received prompt: prompt
received command:  command1
received prompt: prompt
received command:  command2

第二个例子更接近原始问题:

$cat例子

Choose action:
[A]: Action A      [B]: Action B
[C]: cancel
    ? [C]

脚本现在是:

#!/bin/bash 
#

while IFS=$'' read -N1 c; do
  case "$c" in
  '?') 
       echo "*** received prompt after: $buf$c ***" 
       echo '*** send C as option ***'
       buf=""
       ;;
  *)
      buf="$buf$c"
      ;;
  esac
done < example

echo "*** final buffer is: $buf ***"

结果是:

*** received prompt after: 
Choose action:[A]: Action A      [B]: Action B
[C]: cancel
    ? ***
*** send C as option ***
*** final buffer is:  [C]
 ***

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读