web-dev-qa-db-ja.com

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

これは、Sudo suに続いてexitを実行したときに起こったことです。

$ Sudo su
# exit
exit
$ 

Exitコマンドは、ターミナルエミュレーターを閉じません。

子端末ですか?

9
Reeshabh Ranjan

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
    $
    
15
Yaron

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

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

シェルとターミナルは異なるものです。 A Shell は、コマンドを実行するために使用するものです terminal シェルは対話的に動作できます。プロンプトを表示したり、コマンドを実行したり、コマンドを実行したり、実行できない理由に関するエラーを表示したり、シェルを終了するまでプロセスを繰り返します。または、 スクリプト を実行して、非対話的に動作できます。

端末は(おそらく!) エミュレート ではなく 物理 ですが、それでも nixのような Ubuntuのようなオペレーティングシステムは デバイスノード 各端末に対して、 tty コマンドを使用して、使用している端末を確認できます。通常、/dev/pts/0/dev/pts/1/dev/pts/2etc。ターミナルウィンドウ または SSH接続の場合) 、または/dev/tty1/dev/tty2etc。仮想コンソール の場合。本当にttyが行うことは、 input がどの端末から取得されているかを示すことです。詳細は以下をご覧ください。

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:~$

Sudo suは新しいシェルを作成しますが Yaronが非常によく説明しているように 、使用中は変わりません。

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

いくつかの技術的な詳細

ほとんどあなたはシェルで実行するコマンド - などlscpmvrmtouchwcdudfsshsuSudoshbash、およびmanymore -- child process が作成されるため。この子プロセスには親としてシェルがありますが、別のプログラムです。 デフォルトでは、シェルと同じsame端末に接続されます。

シェルはまだ実行中ですが、プログラムが終了するのをバックグラウンドで待機します(または サスペンドする )。プログラムが終了しても、シェルはまだ実行中で動作を再開し、次のコマンドの入力を求めます。

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

私はこれを親と同じ端末に接続されている子プロセスの例外とは本当に考えていませんが、端末のシェルから実行するプロセスは常にnotその端末からの入力またはその端末への出力の送信:

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
17
Eliah Kagan