作为一个有趣的挑战,有一个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
答案 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秒内重新键入它,并根据您是否正确键入它来将Correct
或Wrong
打印到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