在bash或python中有没有办法从一个脚本获取输出并使用另一个脚本与之交互?

时间:2015-11-20 19:46:49

标签: python linux bash

作为一个有趣的挑战,有一个bash脚本可以在屏幕上回显编码输出(base64)。它每15秒就会改变一次。目标是输入解码的base64值并在15秒之前提交。由于它的bash,你可以很容易地作弊,只是改变params甚至时间延迟,但我的目标是单独保留bash脚本并使用bash或python编写另一个脚本来捕获输出并自动解码字符串。有没有人对最佳方法有意见?

有没有办法从这个bash脚本中捕获输出并让它由外部脚本处理?

以下是挑战脚本:

#!/bin/bash

V_COUNT=0

f_encode(){
        V_NUM=$(echo $RANDOM)
        V_ENC=$(echo $V_NUM | base64)
        f_question
}

f_question(){
        V_COUNT=$((V_COUNT+1))
        echo '[*] You have 15 seconds to decode this and submit: '$V_ENC
        echo ''
        read -t 15 -p 'Submit Decoded Key: ' V_DEC

        if [ "$V_DEC" = "$V_NUM" ]; then
                echo '[*] Congrats, you did it!'
                echo 'Attempts: '$V_COUNT
                exit 1
        else
                f_encode
        fi
}

f_encode

2 个答案:

答案 0 :(得分:1)

您可以使用bash 4+中的coproc关键字在执行的shell和“coprocess”之间建立双向管道。有关详细信息,请参阅链接的文档。 (对于早期版本的bash,您可能需要自己设置命名管道。只需找到mkfifo的教程并阅读它。)

为了便于说明,这里是您的挑战的一个愚蠢版本,我将保存在脚本中challenge

#!/usr/bin/env bash
num=$RANDOM
echo "$num"
read -t 15 -p "Please type the number printed above:" typed_num
[[ $num == $typed_num ]] && echo "Correct." >&2 || echo "Wrong." >&2

它会打印一个数字,并要求您在15秒内重新键入它,并根据您是否正确键入它来将CorrectWrong打印到stderr。

这是一个使用coproc的基本“解算器”:

#!/usr/bin/env bash
coproc ./challenge
read -r num <&"${COPROC[0]}"  # read number from stdout of ./challenge
echo $num >&"${COPROC[1]}"  # print number to stdin of ./challenge

运行时:

> ./solver
Correct.

你可以在这里看到基本的想法。由于您可以从stdout读取并打印到./challenge的标准输入,因此您可以自己完成剩余的工作(即自动解码)。

答案 1 :(得分:0)

您可以使用tail。

在1个文件中模拟解决方案

您希望了解您的挑战和响应功能正在做什么, 所以我把输出写入stderr(使用&gt;&amp; 2) 挑战函数实际上希望值2作为输入。 这一切都始于微笑。

function challenge {
   while read x; do
      if [ "$x" = "2" ]; then
         msg="You cracked my code"
         echo "${msg}"
         echo "${msg}" >&2
         exit 0
      fi
      sleep 1
      newchallenge=${RANDOM}
      echo "${newchallenge}" >&2
      echo "${newchallenge}"
   done
}

function respond {
   while read challenge; do
      echo ${#challenge}
      echo "Answer: ${#challenge} " >&2
   done
}

echo ";) Smile ;)" > loopback
tail -f loopback | challenge | respond >> loopback