Có phải sudo su tạo ra một thiết bị đầu cuối con?


9

Đây là những gì đã xảy ra khi tôi thực hiện sudo sutheo sauexit

$ sudo su
# exit
exit
$ 

Lệnh exit không đóng trình giả lập thiết bị đầu cuối của tôi.

Có phải là một thiết bị đầu cuối con?

Câu trả lời:


15

Khi bạn thực thi sudo suhoặc một shell mới đang được tạo.su user

Thực thi exit(hoặc Ctrl+ D) sẽ thoát khỏi trình vỏ mới tạo và sẽ đưa bạn trở lại trình bao trước đó.

  1. Điểm bắt đầu - bash shell đang chạy trên PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
    
  2. Chạy sudo sutạo ra một quy trình bash mới đang chạy trên PID 25203:

    $ 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. Thoát sudo suvà trở về điểm bắt đầu - bash shell đang chạy trên PID 25050:

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

Vì vậy, có thể được coi là một vỏ trẻ em?
Reeshabh Ranjan

1
@ReeshabhRanjan - có
Yaron

17

Cùng một thiết bị đầu cuối, vỏ khác nhau.

Các tiến trình con bạn chạy từ một shell, bao gồm các shell con, tự động sử dụng cùng một thiết bị đầu cuối. Điều này không cụ thể sudotheo bất kỳ cách nào - đây thường là cách nó hoạt động khi bạn chạy bất kỳ chương trình nào từ trình bao của bạn.

Vỏ và thiết bị đầu cuối là những thứ khác nhau. Một shell là những gì bạn sử dụng để chạy các lệnh trong một thiết bị đầu cuối . Một shell có thể hoạt động tương tác - nó đưa ra lời nhắc, bạn đưa ra lệnh, nó chạy lệnh hoặc hiển thị lỗi về lý do tại sao nó không thể và quá trình lặp lại cho đến khi bạn thoát khỏi shell. Hoặc nó có thể hoạt động không tương tác, chạy một kịch bản .

Mặc dù thiết bị đầu cuối của bạn (có lẽ!) Được mô phỏng , nhưng không phải vật lý , dù sao cũng là hệ điều hành giống Unix như Ubuntu gán các nút thiết bị cho từng thiết bị đầu cuối của bạn và bạn có thể kiểm tra thiết bị đầu cuối nào bạn đang sử dụng bằng ttylệnh. Nó thường sẽ /dev/pts/0, /dev/pts/1, /dev/pts/2, , vv , đối với một cửa sổ terminal hoặc kết nối SSH , hoặc /dev/tty1, /dev/tty2, , vv , cho virtual console . Thực sự những gì ttycần làm là cho bạn biết thiết bị đầu cuối nào, nếu có, đầu vào đang được lấy từ đâu; xem bên dưới để biết chi tiết.

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

Bạn có thể thấy rằng, mặc dù sudo sutạo ra một lớp vỏ mới như Yaron giải thích rất rõ , thiết bị đầu cuối bạn đang sử dụng không thay đổi.

Tất nhiên, có một cách khác để quan sát rằng thiết bị đầu cuối giống nhau: bạn vẫn đang viết đầu vào theo cùng một cách và ở cùng một nơi, và đọc đầu ra theo cùng một cách và ở cùng một nơi.

Một vài chi tiết kỹ thuật

Hầu hết các lệnh bạn chạy trong một vỏ - ví dụ như ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, và nhiều hơn nữa - gây ra một quá trình đứa trẻ được tạo ra. Quá trình con này có vỏ của bạn là cha mẹ của nó nhưng nó là một chương trình riêng biệt. Theo mặc định, nó được kết nối với cùng một thiết bị đầu cuối với vỏ của bạn.

Shell của bạn vẫn đang chạy, nhưng nó chờ trong nền để chương trình kết thúc (hoặc để bạn tạm dừng nó ). Khi chương trình kết thúc, shell vẫn đang chạy và nó tiếp tục hoạt động, nhắc bạn cho lệnh tiếp theo của bạn.

Đây là những ngoại lệ chính:

Mặc dù tôi thực sự không coi đây là ngoại lệ đối với các tiến trình con được kết nối với cùng một thiết bị đầu cuối với cha mẹ của chúng, lưu ý rằng một quy trình bạn chạy từ vỏ trong thiết bị đầu cuối sẽ không phải luôn lấy đầu vào từ thiết bị đầu cuối đó hoặc gửi đầu ra đến thiết bị đầu cuối đó :

ttylệnh chỉ kiểm tra đầu vào chuẩn của nó là gì, nên bạn có thể "đánh lừa" nó:

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

Hoặc, ít sai lệch hơn:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.