105.1 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
105 Vỏ và Tệp lệnh Vỏ |
Mục tiêu: |
105.1 Tùy chỉnh và Sử dụng môi trường vỏ |
Bài: |
1 trên 3 |
Giới thiệu
Vỏ được cho là công cụ mạnh nhất trong hệ thống Linux và có thể được định nghĩa là giao diện giữa người dùng và hạt nhân của hệ điều hành. Vỏ sẽ diễn giải các lệnh được nhập bởi người dùng. Vì vậy, tất cả quản trị viên hệ thống phải có kỹ năng sử dụng vỏ. Chắc hẳn giờ đây chúng ta đều đã biết Bourne Again Shell (Bash) chính là vỏ thực tế cho phần lớn các bản phân phối Linux.
Một khi được khởi động, điều đầu tiên Bash — hoặc bất kỳ một vỏ nào — sẽ làm là thực thi một loạt các tệp lệnh khởi động. Các tệp lệnh này sẽ tùy chỉnh môi trường của phiên. Sẽ có cả tệp lệnh dành cho toàn hệ thống và tệp lệnh dành riêng cho người dùng. Chúng ta có thể đặt các tùy chọn cá nhân hoặc cài đặt phù hợp nhất với nhu cầu của mình trong các tệp lệnh này dưới dạng biến, bí danh và hàm.
Chuỗi tệp khởi động chính xác sẽ phụ thuộc vào một tham số rất quan trọng là loại vỏ. Hãy cùng xem xét sự đa dạng của những loại vỏ hiện có.
Các loại Vỏ: Tương tác - Không tương tác và Đăng nhập - Không đăng nhập
Để bắt đầu, chúng ta hãy cùng làm rõ các khái niệm về tương tác và đăng nhập trong ngữ cảnh về vỏ:
- Vỏ tương tác / không tương tác
-
Tên của hai loại vỏ này nói đến sự tương tác diễn ra giữa người dùng và vỏ: người dùng cung cấp đầu vào bằng cách nhập lệnh vào cửa sổ dòng lệnh bằng bàn phím, vỏ sẽ cung cấp đầu ra bằng cách in các thông báo lên trên màn hình.
- Vỏ đăng nhập / không đăng nhập
-
Tên của hai loại vỏ này đề cập đến sự kiện người dùng truy cập vào hệ thống máy tính và cung cấp các thông tin xác thực, chẳng hạn như tên người dùng và mật khẩu.
Cả hai vỏ tương tác và không tương tác đều có thể là vỏ đăng nhập hoặc không đăng nhập và bất kỳ sự kết hợp nào giữa các loại này đều có những cách sử dụng cụ thể.
Vỏ đăng nhập tương tác sẽ được thực thi khi người dùng đăng nhập vào hệ thống. Nó được sử dụng để tùy chỉnh cấu hình của người dùng theo nhu cầu của họ. Một ví dụ điển hình về loại vỏ này là một nhóm người dùng thuộc cùng một bộ phận cần một tập hợp biến cụ thể trong phiên của họ.
Vỏ không đăng nhập tương tác là bất kỳ một vỏ nào khác được người dùng mở sau khi đăng nhập vào hệ thống. Người dùng sử dụng các vỏ này trong các phiên để thực hiện các tác vụ quản trị và bảo trì như thiết lập biến, thời gian, sao chép tệp, viết tệp lệnh, v.v.
Mặt khác, vỏ không tương tác sẽ không yêu cầu bất kỳ hình thức tương tác nào từ con người. Do đó, các vỏ này không yêu cầu người dùng nhập dữ liệu đầu vào và đầu ra của chúng - nếu có - trong hầu hết các trường hợp đều sẽ được ghi vào nhật ký.
Các vỏ đăng nhập không tương tác khá là hiếm và không có giá trị sử dụng. Chúng ta gần như không sử dụng đến loại vỏ này và chúng chỉ được nhắc đến để chúng ta hiểu rõ hơn về hành vi của vỏ. Một số ví dụ ngoại lệ bao gồm việc người dùng buộc một tệp lệnh chạy từ một vỏ đăng nhập bằng /bin/bash --login <some_script>
hoặc chuyển đầu ra tiêu chuẩn (stdout) của lệnh vào đầu vào tiêu chuẩn (stdin) của một kết nối ssh:
<some_command> | ssh <some_user>@<some_server>
Vỏ không đăng nhập không tương tác sẽ không có tương tác cũng như không có phiên đăng nhập trên tư cách người dùng, vì thế nên ở đây chúng ta đang nói đến việc sử dụng các tệp lệnh tự động. Các tệp lệnh này chủ yếu được sử dụng để thực hiện các tác vụ quản trị và bảo trì lặp đi lặp lại (chẳng hạn như các tác vụ trong công việc định kỳ). Trong những trường hợp như vậy, bash
sẽ không đọc bất kỳ tệp khởi động nào.
Mở Cửa sổ Dòng lệnh
Trong môi trường máy tính, chúng ta có thể mở một ứng dụng cửa sổ dòng lệnh hoặc chuyển sang một trong các bảng điều khiển hệ thống. Do đó, một vỏ mới có thể là vỏ pts
khi được mở từ trình mô phỏng cửa sổ dòng lệnh trong GUI hoặc vỏ tty
khi chạy từ bảng điều khiển hệ thống. Trong trường hợp của vỏ pts
, chúng ta sẽ không làm việc với cửa sổ dòng lệnh mà với trình mô phỏng cửa sổ dòng lệnh. Là một phần của phiên đồ họa, trình mô phỏng cửa sổ dòng lệnh như gnome-terminal hoặc konsole rất giàu tính năng và thân thiện với người dùng so với các cửa sổ dòng lệnh có giao diện người dùng thuần văn bản. Trình mô phỏng cửa sổ dòng lệnh có ít tính năng hơn bao gồm XTerm, sakura, v.v.
Bằng cách sử dụng tổ hợp Ctrl+Alt+F1-F6, chúng ta có thể chuyển đến các phiên đăng nhập bảng điều khiển để mở vỏ đăng nhập thuần văn bản tương tác. Ctrl+Alt+F7 sẽ đưa phiên trở lại màn hình nền.
Note
|
|
Khởi chạy Vỏ bằng bash
Sau khi đăng nhập, hãy gõ bash
vào cửa sổ dòng lệnh để mở một vỏ mới. Về mặt kỹ thuật, vỏ này là một tiến trình con của vỏ hiện tại.
Khi bắt đầu tiến trình con bash
, chúng ta có thể chỉ định nhiều khoá chuyển khác nhau để xác định loại vỏ mà chúng ta muốn khởi động. Dưới đây là một số tùy chọn gọi bash
quan trọng:
bash -l
hoặcbash --login
-
sẽ gọi một vỏ đăng nhập.
bash -i
-
sẽ gọi một vỏ tương tác.
bash --noprofile
-
với vỏ đăng nhập sẽ bỏ qua cả tệp khởi động toàn hệ thống (
/etc/profile
) và các tệp khởi động cấp người dùng (~/.bash_profile
,~/.bash_login
và~/.profile
). bash --norc
-
với các vỏ tương tác sẽ bỏ qua cả tệp khởi động toàn hệ thống (
/etc/bash.bashrc
) và tệp khởi động cấp người dùng (~/.bashrc
). bash --rcfile <file>
-
với các vỏ tương tác sẽ xem
<file>
như tệp khởi động, bỏ qua/etc/bash.bashrc
toàn hệ thống và~/.bashrc
cấp người dùng.
Chúng ta sẽ cùng thảo luận về các tệp khởi động khác nhau ở bên dưới.
Khởi chạy Vỏ với su
và sudo
Thông qua việc sử dụng hai chương trình tương tự nhau này, chúng ta có thể thu được các loại vỏ cụ thể:
su
-
Thay đổi ID người dùng hoặc trở thành siêu người dùng (
root
). Với lệnh này, chúng ta có thể gọi cả vỏ đăng nhập và không đăng nhập:-
su - user2
,su -l user2
hoặcsu --login user2
sẽ bắt đầu một vỏ tương tác đăng nhập với tư cách củauser2
. -
su user2
sẽ khởi động vỏ tương tác không đăng nhập với tư cách làuser2
. -
su - root
hoặcsu -
sẽ khởi động vỏ tương tác đăng nhập với tư cách làroot
. -
su root
hoặcsu
sẽ khởi động một vỏ tương tác không đăng nhập với tư cách làroot
.
-
sudo
-
Thực thi các lệnh với tư cách một người dùng khác (bao gồm cả siêu người dùng). Vì lệnh này chủ yếu được sử dụng để lấy quyền gốc tạm thời nên người dùng sử dụng nó phải ở trong tệp
sudoers
. Để thêm người dùng vàosudoers
, ta cần trở thànhroot
và sau đó chạy:root@debian:~# usermod -aG sudo user2
Giống như
su
,sudo
cũng cho phép chúng ta gọi cả vỏ đăng nhập và không đăng nhập:-
sudo su - user2
,sudo su -l user2
hoặcsudo su --login user2
sẽ bắt đầu một vỏ tương tác đăng nhập với tư cách làuser2
. -
sudo su user2
sẽ khởi động một vỏ tương tác không đăng nhập với tư cách làuser2
. -
sudo -u user2 -s
sẽ khởi động một vỏ tương tác không đăng nhập với tư cách làuser2
. -
sudo su - root
hoặcsudo su -
sẽ khởi động một vỏ tương tác đăng nhập với tư cách làroot
. -
sudo -i
sẽ khởi động một vỏ tương tác đăng nhập với tư cách làroot
. -
sudo -i <some_command>
sẽ khởi động một vỏ tương tác đăng nhập với tư cách làroot
, chạy lệnh và quay lại người dùng ban đầu. -
sudo su root
hoặcsudo su
sẽ khởi động một vỏ tương tác không đăng nhập với tư cách làroot
. -
sudo -s
hoặcsudo -u root -s
sẽ khởi động một vỏ không đăng nhập với tư cách làroot
.
-
Khi sử dụng su
hoặc sudo
, quan trọng nhất là ta phải xem xét trường hợp cụ thể của mình để khởi động một vỏ mới: chúng ta có cần môi trường của người dùng mục tiêu hay không? Nếu có, chúng ta sẽ sử dụng các tùy chọn gọi vỏ đăng nhập; nếu không, chúng ta sẽ sử dụng các tuỳ chọn gọi vỏ không đăng nhập.
Có những loại Vỏ nào?
Để biết được mình đang làm việc ở loại vỏ nào, chúng ta có thể nhập echo $0
vào cửa sổ dòng lệnh và nhận được kết quả đầu ra sau:
- Đăng nhập tương tác
-
-bash
hoặc-su
- Không đăng nhập tương tác
-
bash
hoặc/bin/bash
- Không đăng nhập không tương tác (tệp lệnh)
-
<name_of_script>
Có bao nhiêu Vỏ?
Để xem có bao nhiêu vỏ bash
đang chạy trong hệ thống, chúng ta có thể sử dụng lệnh ps aux | grep bash
:
user2@debian:~$ ps aux | grep bash user2 5270 0.1 0.1 25532 5664 pts/0 Ss 23:03 0:00 bash user2 5411 0.3 0.1 25608 5268 tty1 S+ 23:03 0:00 -bash user2 5452 0.0 0.0 16760 940 pts/0 S+ 23:04 0:00 grep --color=auto bash
user2
tại debian
đã đăng nhập vào phiên GUI (hoặc hệ thống X Window) và mở gnome-terminal, sau đó họ đã nhấn Ctrl+Alt+F1 để chuyển sang một phiên cửa sổ dòng lệnh tty
. Cuối cùng, họ đã quay lại phiên GUI bằng cách nhấn Ctrl+Alt+F7 và gõ lệnh ps aux | grep bash
. Do đó, đầu ra đã cho thấy một vỏ tương tác không đăng nhập thông qua trình mô phỏng cửa sổ dòng lệnh (pts/0
) và một vỏ tương tác đăng nhập thông qua cửa sổ dòng lệnh thuần văn bản chuẩn (tty1
). Cũng hãy lưu ý rằng trường cuối cùng của mỗi dòng (lệnh) là bash
cho (pts/0
) và -bash
cho (tty1
).
Nơi Vỏ lấy cấu hình: Tệp khởi động
Chúng ta đã biết về các loại vỏ có thể tìm thấy trong hệ thống Linux. Đã đến lúc chúng ta biết những tệp khởi động nào sẽ được thực thi bởi vỏ nào. Hãy lưu ý rằng các tệp lệnh toàn hệ thống hoặc toàn cục sẽ được đặt trong thư mục /etc/
, trong khi các tệp lệnh cục bộ hoặc cấp người dùng sẽ được tìm thấy trong thư mục chính của người dùng (~
). Ngoài ra, khi cần tìm nhiều hơn một tệp, một khi tệp được tìm thấy và chạy, các tệp khác sẽ bị bỏ qua. Hãy tự mình khám phá và nghiên cứu các tệp này bằng trình soạn thảo văn bản yêu thích hoặc bằng cách nhập less <startup_file>
.
Note
|
Các tệp khởi động có thể được chia thành các tệp Bash cụ thể (những tệp chỉ giới hạn ở cấu hình và lệnh |
Vỏ Tương tác Đăng nhập
Cấp Toàn cục
/etc/profile
-
Đây là tệp
.profile
toàn hệ thống dành cho vỏ Bourne và vỏ tương thích với Bourne (bao gồmbash
). Thông qua một loạt các câu lệnhif
, tệp này sẽ đặt một số biến tương ứng nhưPATH
vàPS1
cũng như tìm nguồn — nếu chúng tồn tại — của cả tệp/etc/bash.bashrc
và các biến trong thư mục/etc/profile.d
. /etc/profile.d/*
-
Thư mục này có thể chứa các tệp lệnh được thực thi bởi
/etc/profile
.
Cấp cục bộ
~/.bash_profile
-
Tệp riêng của Bash này được sử dụng để định cấu hình môi trường người dùng. Nó cũng có thể được sử dụng để lấy nguồn cho cả
~/.bash_login
và~/.profile
. ~/.bash_login
-
Cũng là tệp riêng của Bash. Tệp này sẽ chỉ được thực thi nếu không có tệp
~/.bash_profile
. Tên của nó gợi ý cho ta biết rằng nó nên được sử dụng để chạy các lệnh cần thiết khi đăng nhập. ~/.profile
-
Tệp này không phải là tệp riêng của Bash và sẽ chỉ được dùng để lấy nguồn nếu cả
~/.bash_profile
và~/.bash_login
không tồn tại (điều này rất thường xảy ra). Vì vậy, mục đích chính của~/.profile
là để kiểm tra xem một vỏ Bash có đang được chạy hay không và — nếu đang được chạy — tìm nguồn cho~/.bashrc
nếu nó tồn tại. Nó thường thiết lập biếnPATH
để bao gồm thư mục~/bin
riêng tư của người dùng (nếu nó tồn tại). ~/.bash_logout
-
Nếu nó tồn tại, tệp riêng của Bash này sẽ thực hiện một số thao tác dọn dẹp khi thoát khỏi vỏ. Điều này sẽ thuận tiện trong những trường hợp như các phiên từ xa.
Khám phá các Tệp cấu hình Vỏ Đăng nhập Tương tác
Hãy cùng xem hoạt động của một số tệp này bằng cách sửa đổi /etc/profile
và /home/user2/.profile
. Chúng ta sẽ thêm vào mỗi dòng một dòng nhắc nhở về tệp đang được thực thi:
root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note
|
Hai toán tử chuyển hướng |
Do đó, thông qua đầu ra của các lệnh echo
tương ứng, chúng ta sẽ biết khi nào mỗi tệp này được đọc và thực thi. Để chứng minh cho điều này, hãy cùng xem điều gì sẽ xảy ra khi user2
đăng nhập qua ssh
từ một máy khác:
user2@debian:~$ ssh user2@192.168.1.6 user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10 Hello from /etc/profile Hello from /home/user2/.profile
Như hai dòng cuối cùng cho biết, nó đã hoạt động. Ngoài ra, hãy lưu ý ba điều:
-
Tệp toàn cục sẽ được chạy đầu tiên.
-
Không có tệp
.bash_profile
hoặc.bash_login
trong thư mục chính củauser2
. -
Dấu ngã (
~
) đã mở rộng đến đường dẫn tuyệt đối của tệp (/home/user2/.profile
).
Vỏ Tương tác không Đăng nhập
Cấp Toàn cục
/etc/bash.bashrc
-
Đây là tệp
.bashrc
toàn hệ thống dành cho các vỏbash
tương tác. Thông qua việc thực thi của nó,bash
sẽ đảm bảo rằng nó đang được chạy một cách tương tác, kiểm tra kích thước cửa sổ sau mỗi lệnh (cập nhật các giá trị củaLINES
vàCOLUMNS
nếu cần) và đặt một số biến.
Cấp Cục bộ
~/.bashrc
-
Ngoài việc thực hiện các tác vụ tương tự như các tác vụ được mô tả cho
/etc/bash.bashrc
ở cấp độ người dùng (chẳng hạn như kiểm tra kích thước cửa sổ hoặc có đang được chạy tương tác hay không), tệp riêng của Bash này thường sẽ thiết lập một số biến lịch sử và tìm nguồn cho~ /.bash_aliases
nếu nó tồn tại. Ngoài ra, tệp này thường được sử dụng để lưu trữ các bí danh và chức năng cụ thể của người dùng.Tương tự như vậy, cũng cần lưu ý rằng
~/.bashrc
sẽ được đọc nếubash
phát hiện<stdin>
của nó là một kết nối mạng (như trường hợp với kết nối Secure Shell (SSH) trong ví dụ trên) .
Khám phá các Tệp cấu hình Vỏ Tương tác không Đăng nhập
Bây giờ, hãy sửa đổi /etc/bash.bashrc
và /home/user2/.bashrc
:
root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc
Và đây là điều sẽ xảy ra khi user2
khởi động một vỏ mới:
user2@debian:~$ bash Hello from /etc/bash.bashrc Hello from /home/user2/.bashrc
Một lần nữa, hai tệp đã được đọc và thực thi.
Warning
|
Hãy nhớ rằng do thứ tự chạy các tệp, các tệp cục bộ sẽ được ưu tiên hơn các tệp toàn cục. |
Vỏ Đăng nhập không Tương tác
Một vỏ không tương tác với các tùy chọn -l
hoặc --login
sẽ buộc phải hoạt động giống như một vỏ đăng nhập và do đó, các tệp khởi động được chạy sẽ giống như các tệp dành cho vỏ tương tác đăng nhập.
Để chứng minh cho điều này, hãy viết một đoạn lệnh đơn giản và làm cho nó có thể thực thi được. Chúng ta sẽ không bao gồm bất kỳ một shebangs nào vì ta sẽ gọi bash executable (tệp thực thi bash - /bin/bash
với tùy chọn đăng nhập) từ dòng lệnh.
-
Chúng ta sẽ tạo tệp lệnh
test.sh
chứa dòngecho 'Hello from a script'
để có thể chứng minh rằng tệp lệnh chạy thành công:user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
-
Làm cho tệp lệnh có thể thực thi được:
user2@debian:~$ chmod +x ./test.sh
-
Cuối cùng, chúng ta gọi
bash
với tùy chọn-l
để chạy tệp lệnh:user2@debian:~$ bash -l ./test.sh Hello from /etc/profile Hello from /home/user2/.profile Hello from a script
Nó đã hoạt động! Trước khi chạy tệp lệnh, quá trình đăng nhập đã diễn ra và cả
/etc/profile
và~/.profile
đều đã được thực thi.
Note
|
Chúng ta sẽ tìm hiểu về shebangs và tất cả các khía cạnh khác của tệp lệnh vỏ trong các bài học sau. |
Bây giờ, chúng ta đã có đầu ra tiêu chuẩn (stdout) của lệnh echo
vào đầu vào tiêu chuẩn (stdin) của kết nối ssh
bằng một đường ống (|
):
user2@debian:~$ echo "Hello-from-a-noninteractive-login-shell" | ssh user2@192.168.1.6 Pseudo-terminal will not be allocated because stdin is not a terminal. user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Hello from /etc/profile Hello from /home/user2/.profile -bash: line 1: Hello-from-a-noninteractive-login-shell: command not found
Một lần nữa, /etc/profile
và ~/.profile
đã được thực thi. Ngoài ra, dòng đầu tiên và dòng cuối cùng của đầu ra đã nói lên khá nhiều điều về hoạt động của vỏ.
Vỏ không Tương tác không Đăng nhập
Các tệp lệnh sẽ không đọc bất kỳ tệp nào được liệt kê ở trên mà sẽ tìm biến môi trường BASH_ENV
, mở rộng giá trị của nó nếu cần và sử dụng nó làm tên của tệp khởi động để đọc và thực thi lệnh. Chúng ta sẽ tìm hiểu thêm về biến môi trường trong bài học tiếp theo.
Như đã đề cập ở trên, thông thường, /etc/profile
và ~/.profile
sẽ đảm bảo rằng cả /etc/bash.bashrc
và ~/.bashrc
đều được thực thi sau khi đăng nhập thành công. Đầu ra của lệnh sau sẽ cho thấy điều này:
root@debian:~# su - user2 Hello from /etc/bash.bashrc Hello from /etc/profile Hello from /home/user2/.bashrc Hello from /home/user2/.profile
Hãy nhớ rằng các dòng trước đây chúng ta đã thêm vào các tệp lệnh khởi động — và gọi vỏ tương tác đăng nhập ở cấp độ người dùng với su - user2
— bốn dòng đầu ra có thể được giải thích như sau:
-
Hello from /etc/bash.bashrc
có nghĩa là/etc/profile
đã lấy nguồn từ/etc/bash.bashrc
. -
Hello from /etc/profile
có nghĩa là/etc/profile
đã được đọc và thực thi đầy đủ. -
Hello from /home/user2/.bashrc
có nghĩa là~/.profile
đã lấy nguồn từ~/.bashrc
. -
Hello from /home/user2/.profile
có nghĩa là~/.profile
đã được đọc và thực thi đầy đủ.
Hãy lưu ý rằng với su - <username>
(cũng là su -l <username>
và su --login <username>
), chúng ta sẽ đảm bảo được việc gọi vỏ đăng nhập, trong khi su <username>
chỉ gọi /etc/bash.bashrc
và ~/.bashrc
.
Lấy nguồn Tệp
Trong các phần trước, chúng ta đã thảo luận về việc một số tệp lệnh khởi động sẽ bao gồm hoặc thực thi các tệp lệnh khác. Cơ chế này được gọi là lấy nguồn và sẽ được giải thích trong phần này.
Lấy nguồn Tệp với .
Dấu chấm (.
) thường được tìm thấy trong các tệp khởi động.
Trong tệp .profile
của máy chủ Debian, chúng ta có thể tìm thấy — ví dụ — khối sau:
# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
Chúng ta đã thấy việc thực thi một tệp lệnh có thể dẫn đến việc thực thi một tệp lệnh khác như thế nào. Do đó, câu lệnh if`sẽ đảm bảo rằng tệp `$HOME/.bashrc
— nếu nó tồn tại (-f
) — sẽ được lấy nguồn (tức là đọc và thực thi) khi đăng nhập:
. "$HOME/.bashrc"
Note
|
Như chúng ta sẽ học trong bài học tiếp theo, |
Hơn nữa, chúng ta có thể sử dụng .
bất cứ khi nào sửa đổi tệp khởi động và muốn thực hiện các thay đổi có hiệu quả mà không cần khởi động lại. Ví dụ: chúng ta có thể:
-
thêm bí danh vào
~/.bashrc
:user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning
|
Khi gửi đầu ra của một lệnh vào một tệp, hãy nhớ đừng nhầm lệnh nối thêm ( |
-
xuất dòng cuối cùng của
~/.bashrc
để kiểm tra xem mọi thứ có ổn không:user2@debian:~$ tail -n 1 !$ tail -n 1 ~/.bashrc alias hi='echo We salute you.'
Note!$
mở rộng đến đối số cuối cùng từ lệnh trước đó. Trong trường hợp của chúng ta là~/.bashrc
. -
lấy nguồn tệp thủ công:
user2@debian:~$ . ~/.bashrc
-
và gọi bí danh để chứng minh là nó có hoạt động:
user2@debian:~$ hi We salute you.
Note
|
Tham khảo bài học tiếp theo để tìm hiểu về bí danh và biến. |
Lấy nguồn Tệp với source
Lệnh source
đồng nghĩa với .
. Vì vậy, để lấy nguồn ~/.bashrc
, chúng ta cũng có thể làm như sau:
user2@debian:~$ source ~/.bashrc
Nguồn gốc của các Tệp khởi động Vỏ: SKEL
SKEL
là một biến với giá trị là đường dẫn tuyệt đối đến thư mục skel
. Thư mục này phục vụ như một khuôn mẫu cho cấu trúc hệ thống tệp của các thư mục chính của người dùng. Nó bao gồm các tệp sẽ được kế thừa bởi bất kỳ tài khoản người dùng mới nào được tạo (tất nhiên là có bao gồm cả các tệp cấu hình cho vỏ). SKEL
và các biến liên quan khác được lưu trữ trong /etc/adduser.conf
- tệp cấu hình cho adduser
:
user2@debian:~$ grep SKEL /etc/adduser.conf # The SKEL variable specifies the directory containing "skeletal" user SKEL=/etc/skel # If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
SKEL
được đặt thành /etc/skel
. Do đó, các tệp lệnh khởi động định cấu hình vỏ của chúng ta nằm trong đó:
user2@debian:~$ ls -a /etc/skel/ . .. .bash_logout .bashrc .profile
Warning
|
Hãy nhớ rằng các tệp bắt đầu bằng |
Bây giờ, hãy tạo một thư mục trong /etc/skel
để tất cả những người dùng mới có thể lưu trữ tệp lệnh cá nhân của họ trong đó:
-
Với
root
, chúng ta sẽ chuyển vào/etc/skel
:root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
Liệt kê nội dung của nó:
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
Tạo thư mục của mình và kiểm tra xem tất cả có diễn ra như mong đợi:
root@debian:/etc/skel# mkdir my_personal_scripts root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc my_personal_scripts .profile
-
Xóa
user2
cùng với thư mụchome
của nó:root@debian:~# deluser --remove-home user2 Looking for files to backup/remove ... Removing files ... Removing user `user2' ... Warning: group `user2' has no more members. Done.
-
Thêm
user2
lần nữa để nó có một thư mục chính mới:root@debian:~# adduser user2 Adding user `user2' ... Adding new group `user2' (1001) ... Adding new user `user2' (1001) with group `user2' ... Creating home directory `/home/user2' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for user2 Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y
-
Cuối cùng, đăng nhập với tên
user2
và liệt kê tất cả các tệp trong/home/user2
để xem mọi thứ có diễn ra như mong đợi không:root@debian:~# su - user2 user2@debian:~$ pwd /home/user2 user2@debian:~$ ls -a . .. .bash_history .bash_logout .bashrc my_personal_scripts .profile
Mọi thứ đã diễn ra đúng như chúng ta mong đợi.
Bài tập Hướng dẫn
-
Hãy nghiên cứu cách khởi động các vỏ trong cột “Vỏ khởi động với…” và điền vào các thông tin được yêu cầu:
Vỏ khởi động với… Tương tác? Đăng nhập? Kết quả của echo $0
sudo ssh user2@machine2
Ctrl+Alt+F2
su - user2
gnome-terminal
Một người dùng thông thường sử dụng konsole để khởi động một phiên của sakura
Một tệp lệnh có tên
test.sh
chứa lệnhecho $0
-
Hãy viết lệnh
su
vàsudo
để khởi chạy vỏ được chỉ định:- Vỏ đăng nhập tương tác với tư cách là
user2
-
su
:sudo
: - Vỏ đăng nhập tương tác với tư cách là
root
-
su
:sudo
: - Vỏ tương tác không đăng nhập với tư cách là
root
-
su
:sudo
: - Vỏ tương tác không đăng nhập với tư cách là
user2
-
su
:sudo
:
- Vỏ đăng nhập tương tác với tư cách là
-
Tệp khởi động nào sẽ được đọc khi vỏ trong cột “Loại vỏ” được khởi động?
Loại vỏ /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Vỏ đăng nhập tương tác với tư cách là
user2
Vỏ đăng nhập tương tác với tư cách là
root
Vỏ không đăng nhập tương tác với tư cách là
root
Vỏ không đăng nhập tương tác với tư cách là
user2
Bài tập Mở rộng
-
Trong Bash, chúng ta có thể viết một hàm
Hello world!
đơn giản bằng cách đưa đoạn mã sau vào một tệp trống:function hello() { echo "Hello world!" }
-
Tiếp theo, chúng ta nên làm gì để đưa hàm này vào vỏ?
-
Một khi có sẵn trong vỏ hiện tại, bạn sẽ gọi nó như thế nào?
-
Để tự động hóa mọi thứ, bạn sẽ đặt hàm và lệnh gọi của nó vào tệp nào để nó được thực thi khi
user2
mở cửa sổ dòng lệnh từ phiên X Window? Đó là loại vỏ gì? -
Bạn sẽ đặt hàm và lệnh gọi của nó vào tệp nào để nó được chạy khi
root
khởi chạy một vỏ tương tác mới bất kể nó có đăng nhập hay không?
-
-
Hãy xem đoạn lệnh
Hello world!
bash
cơ bản sau đây:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Xin chào thế giới!"
-
Giả sử chúng ta làm cho tệp lệnh có thể thực thi được và chạy nó. Đó có phải là một tệp lệnh tương tác không? Tại sao?
-
Điều gì làm cho một tệp lệnh có tính tương tác?
-
-
Hãy tưởng tượng bạn đã thay đổi giá trị của một số biến trong
~/.bashrc
và muốn những thay đổi đó có hiệu lực mà không cần khởi động lại. Từ thư mục chính của bạn, làm thế nào để có thể đạt được điều đó theo hai cách khác nhau? -
John vừa bắt đầu phiên X Window trên máy chủ Linux. Anh ấy mở một trình mô phỏng cửa sổ dòng lệnh để thực hiện một số nhiệm vụ quản trị, nhưng thật lạ khi phiên này bị treo và anh ấy cần mở một vỏ văn bản.
-
Làm thế nào để anh ấy có thể mở được vỏ
tty
đó? -
Những tệp khởi động nào sẽ được lấy nguồn?
-
-
Linda là người dùng máy chủ Linux. Cô ấy đã lịch sự yêu cầu quản trị viên có tệp
~/.bash_login
để cô ấy có thể in ngày và giờ trên màn hình khi đăng nhập. Những người dùng khác rất thích ý tưởng này và đã làm theo. Quản trị viên gặp khó khăn trong việc tạo tệp cho tất cả những người dùng khác trên máy chủ nên anh ấy quyết định thêm một chính sách mới và tạo~/.bash_login
cho tất cả những người dùng mới tiềm năng. Làm thế nào để quản trị viên có thể hoàn thành nhiệm vụ này?
Tóm tắt
Trong bài học này, chúng ta đã học về:
-
Vỏ sẽ thiết lập môi trường của người dùng trong hệ thống Linux.
-
Bash là vỏ hàng đầu trên các bản phân phối GNU/Linux.
-
Công việc đầu tiên mà vỏ thực hiện là đọc và thực thi một hoặc nhiều tệp khởi động khác nhau.
-
Các khái niệm về tương tác và đăng nhập liên quan đến vỏ.
-
Cách khởi chạy các loại vỏ khác nhau bằng
bash
,su
,sudo
và Ctrl+Alt+F1-F6. -
Cách kiểm tra loại vỏ bằng
echo $0
. -
Các tệp khởi động cục bộ
~/.bash_profile
,~/.profile
,~/.bash_login
,~/.bash_logout
và~/.bashrc
. -
Các tệp khởi động toàn cục
/etc/profile
,/etc/profile.d/*
,/etc/bash.bashrc
. -
Các tệp cục bộ được ưu tiên hơn các tệp toàn cục.
-
Cách chuyển hướng đầu ra của lệnh bằng
>
(ghi đè) và>>
(nối thêm). -
Ý nghĩa của thư mục
skel
. -
Cách lấy nguồn tệp.
Các lệnh được sử dụng trong bài học này:
bash
-
Tạo một vỏ mới.
su
-
Tạo một vỏ mới.
sudo
-
Tạo một vỏ mới.
usermod
-
Sửa đổi một tài khoản người dùng.
echo
-
Hiển thị một dòng văn bản.
ps
-
Báo cáo ảnh chụp tức thời của các tiến trình hiện tại.
less
-
Trình đánh số cho các tệp dài.
ssh
-
Khởi động một kết nối Open SSH (từ xa).
chmod
-
Thay đổi các bit chế độ của một tệp (ví dụ như làm cho nó có thể thực thi được).
grep
-
In các dòng phù hợp với một mẫu.
l
-
Liệt kê nội dung thư mục.
cd
-
Thay đổi thư mục.
mkdir
-
Tạo thư mục.
deluser
-
Xóa người dùng.
Thêm một người dùng mới.
.
-
Lấy nguồn một tệp.
source
-
Lấy nguồn một tệp.
tail
-
Xuất phần cuối cùng của tệp.
Đáp án Bài tập Hướng dẫn
-
Hãy nghiên cứu cách khởi động các vỏ trong cột “Vỏ khởi động với…” và điền vào các thông tin được yêu cầu:
Vỏ khởi động với… Tương tác? Đăng nhập? Kết quả của echo $0
sudo ssh user2@machine2
Đúng
Đúng
-bash
Ctrl+Alt+F2
Đúng
Đúng
-bash
su - user2
Đúng
Đúng
-bash
gnome-terminal
Đúng
Sai
bash
Một người dùng thông thường sử dụng konsole để khởi động một phiên của sakura
Đúng
Sai
/bin/bash
Một tệp lệnh có tên
test.sh
chứa lệnhecho $0
Sai
Sai
./test.sh
-
Hãy viết lệnh
su
vàsudo
để khởi chạy vỏ được chỉ định:- Vỏ đăng nhập tương tác với tư cách là
user2
su
-
su - user2
,su -l user2
hoặcsu --login user2
sudo
-
sudo su - user2
,sudo su -l user2
hoặcsudo su --login user2
- Vỏ đăng nhập tương tác với tư cách là
root
su
-
su - root
hoặcsu -
sudo
-
sudo su - root
,sudo su -
hoặcsudo -i
- Vỏ tương tác không đăng nhập với tư cách là
root
su
-
su root
hoặcsu
sudo
-
sudo su root
,sudo su
,sudo -s
hoặcsudo -u root -s
- Vỏ tương tác không đăng nhập với tư cách là
user2
su
-
su user2
sudo
-
sudo su user2
hoặcsudo -u user2 -s
- Vỏ đăng nhập tương tác với tư cách là
-
Tệp khởi động nào sẽ được đọc khi vỏ trong cột “Loại vỏ” được khởi động?
Loại vỏ /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
Vỏ đăng nhập tương tác với tư cách là
user2
Có
Có
Có
Có
Vỏ đăng nhập tương tác với tư cách là
root
Có
Có
Không
Không
Vỏ không đăng nhập tương tác với tư cách là
root
Không
Có
Không
Không
Vỏ không đăng nhập tương tác với tư cách là
user2
Không
Có
Không
Có
Đáp án Bài tập Mở rộng
-
Trong Bash, chúng ta có thể viết một hàm
Hello world!
đơn giản bằng cách đưa đoạn mã sau vào một tệp trống:function hello() { echo "Hello world!" }
-
Tiếp theo, chúng ta nên làm gì để đưa hàm này vào vỏ?
Để cung cấp hàm cho vỏ hiện tại, chúng ta phải lấy nguồn tệp chứa nó.
-
Một khi có sẵn trong vỏ hiện tại, bạn sẽ gọi nó như thế nào?
Chúng ta sẽ gọi nó bằng cách gõ tên của nó vào cửa sổ dòng lệnh.
-
Để tự động hóa mọi thứ, bạn sẽ đặt hàm và lệnh gọi của nó vào tệp nào để nó được thực thi khi
user2
mở cửa sổ dòng lệnh từ phiên X Window? Đó là loại vỏ gì?Tệp tốt nhất để đặt nó là
/home/user2/.bashrc
. Vỏ được gọi sẽ là một vỏ tương tác không đăng nhập. -
Bạn sẽ đặt hàm và lệnh gọi của nó vào tệp nào để nó được chạy khi
root
khởi chạy một vỏ tương tác mới bất kể nó có đăng nhập hay không?Trong
/etc/bash.bashrc
vì tệp này được thực thi cho tất cả các vỏ tương tác — cho dù có đăng nhập hay không.
-
-
Hãy xem đoạn lệnh
Hello world!
bash
cơ bản sau đây:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Hello world!"
-
Giả sử chúng ta làm cho tệp lệnh có thể thực thi được và chạy nó. Đó có phải là một tệp lệnh tương tác không? Tại sao?
Không, vì không có sự tương tác của con người và không có lệnh nào được người dùng nhập vào.
-
Điều gì làm cho một tệp lệnh có tính tương tác?
Việc nó yêu cầu đầu vào từ người dùng.
-
-
Hãy tưởng tượng bạn đã thay đổi giá trị của một số biến trong
~/.bashrc
và muốn những thay đổi đó có hiệu lực mà không cần khởi động lại. Từ thư mục chính của bạn, làm thế nào để có thể đạt được điều đó theo hai cách khác nhau?$ source .bashrc
hoặc
$ . .bashrc
-
John vừa bắt đầu phiên X Window trên máy chủ Linux. Anh ấy mở một trình mô phỏng cửa sổ dòng lệnh để thực hiện một số nhiệm vụ quản trị, nhưng thật lạ khi phiên này bị treo và anh ấy cần mở một vỏ văn bản.
-
Làm thế nào để anh ấy có thể mở được vỏ
tty
đó?Anh ấy có thể làm điều đó bằng cách nhấn Ctrl+Alt+F1-F6 để nhập một trong sáu vỏ tty.
-
Những tệp khởi động nào sẽ được lấy nguồn?
/etc/profile
/home/john/.profile
-
-
Linda là người dùng máy chủ Linux. Cô ấy đã lịch sự yêu cầu quản trị viên có tệp
~/.bash_login
để cô ấy có thể in ngày và giờ trên màn hình khi đăng nhập. Những người dùng khác rất thích ý tưởng này và đã làm theo. Quản trị viên gặp khó khăn trong việc tạo tệp cho tất cả những người dùng khác trên máy chủ nên anh ấy quyết định thêm một chính sách mới và tạo~/.bash_login
cho tất cả những người dùng mới tiềm năng. Làm thế nào để quản trị viên có thể hoàn thành nhiệm vụ này?Anh ấy có thể đạt được điều này bằng cách đặt
.bash_login
vào thư mục/etc/skel
.