sudo suは子端末を作成しますか?


回答:


15

実行すると、sudo suまたは新しいシェルが作成されます。su user

実行exit(またはCtrl+ D)すると、新しく作成されたシェルが終了し、以前のシェルに戻ります。

  1. 開始点-bashシェルはPID 25050で実行されています。

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. 実行sudo suすると、PID 25203で実行される新しいbashプロセスが作成されます。

    $ sudo su
    # ps
      PID TTY          TIME CMD
    25201 pts/17   00:00:00 sudo
    25202 pts/17   00:00:00 su
    25203 pts/17   00:00:00 bash
    25213 pts/17   00:00:00 ps
    # exit
  3. 終了sudo suして開始点に戻る-bashシェルはPID 25050で実行されています。

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $

それを子シェルとして扱うことはできますか?
Reeshabh Ranjan 2017

1
@ReeshabhRanjan-はい
Yaron

17

同じ端末、異なるシェル。

子シェルを含むシェルから実行する子プロセスは、同じターミナルを自動的に使用します。これは特定のsudo方法に固有のものではありません。これは通常、シェルからプログラムを実行するときに機能する方法です。

シェルとターミナルは別物です。シェルは、あなたがコマンドを実行するために使用するものであるターミナル。シェルはインタラクティブに操作できます。プロンプトが表示され、コマンドを入力し、コマンドを実行するか、それができない理由に関するエラーが表示され、シェルを終了するまでプロセスが繰り返されます。または、スクリプトを実行し非対話的に動作することもできます

端末は(おそらく!)エミュレートされ物理的ではありませんが、UbuntuのようなUnixライクなオペレーティングシステムは各端末にデバイスノードを割り当て、ttyコマンドを使用してどの端末を使用しているかを確認できます。これは通常になります/dev/pts/0/dev/pts/1/dev/pts/2などのために、ターミナルウィンドウまたはSSH接続、または/dev/tty1/dev/tty2などのために、仮想コンソール。実際に何をするのかttyは、もしあれば、どの端末から入力が取得されているかを通知することです。詳細については、以下を参照してください。

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$

Yaronが非常によく説明しているようにsudo su新しいシェル作成しても、使用している端末は変更されないことがわかります。

もちろん、端末が同じであることを確認する別の方法があります。同じ方法で同じ場所に入力を書き込み、同じ方法で同じ場所で出力を読み取ります。

いくつかの技術的な詳細

ほとんどのコマンドは、あなたは、シェルで実行-などlscpmvrmtouchwcdudfsshsusudoshbash、と多くのより多くの-原因と子プロセスが作成されます。この子プロセスには、親としてシェルがありますが、別のプログラムです。デフォルトでは、シェルと同じ端末に接続されます。

シェルはまだ実行中ですが、プログラムが終了するまで(またはプログラムが中断されるまで)バックグラウンドで待機します。プログラムが終了すると、シェルはまだ実行中であり、操作を再開して、次のコマンドの入力を求めます。

主な例外は次のとおりです。

私はこれを、親と同じターミナルに接続されている子プロセスの例外とは特に見なしませんが、ターミナルのシェルから実行するプロセスは、常にそのターミナルから入力を受け取ったり、そのターミナルに出力を送信したりするわけではありません

ttyコマンドはその標準入力がどの端末かをチェックするだけなので、次のように「だます」ことができます。

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0

または、それほど欺瞞的ではありません:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.