Quản trị viên Linux - Tập lệnh Shell

Giới thiệu về Bash Shell

Giống như hương vị của GNU Linux, shell có nhiều loại và khác nhau về khả năng tương thích. Vỏ mặc định trong CentOS được gọi là Bash hoặc Bourne Again Shell. Bash shell là một phiên bản sửa đổi ngày nay của Bourne Shell do Stephen Bourne phát triển. Bash là sự thay thế trực tiếp cho Thompson Shell ban đầu trên hệ điều hành Unix do Ken Thompson và Dennis Ritchie phát triển tại Bell Labs (Stephen Bourne cũng được Bell Labs tuyển dụng)

Mọi người đều có một lớp vỏ yêu thích và mỗi người đều có thế mạnh và khó khăn. Nhưng phần lớn, Bash sẽ là trình bao mặc định trên tất cả các bản phân phối Linux và phổ biến nhất là có sẵn. Với kinh nghiệm, mọi người sẽ muốn khám phá và sử dụng một vỏ phù hợp nhất với họ. Tuy nhiên đồng thời, mọi người cũng sẽ muốn làm chủ Bash shell.

Các shell Linux khác bao gồm: Tcsh, Csh, Ksh, Zsh và Fish.

Phát triển các kỹ năng sử dụng bất kỳ trình bao Linux nào ở cấp độ chuyên gia là cực kỳ quan trọng đối với quản trị viên CentOS. Như chúng tôi đã đề cập trước đây, không giống như Windows, Linux ở trung tâm của nó là một hệ điều hành dòng lệnh. Shell chỉ đơn giản là một giao diện người dùng cho phép quản trị viên (hoặc người dùng) đưa ra các lệnh cho hệ điều hành. Nếu một quản trị viên hệ thống Linux là một phi công của hãng hàng không, việc sử dụng shell sẽ tương tự như việc đưa máy bay ra khỏi phi công lái tự động và lấy các điều khiển thủ công để có chuyến bay linh hoạt hơn.

Một trình bao Linux, như Bash, được biết đến trong thuật ngữ Khoa học Máy tính là Command Line Interpreter. Microsoft Windows cũng có hai trình thông dịch dòng lệnh được gọi là DOS (đừng nhầm lẫn với hệ điều hành DOS gốc) và PowerShell.

Hầu hết các shell hiện đại như Bash cung cấp constructscho phép các tập lệnh shell phức tạp hơn để tự động hóa cả các tác vụ thông thường và phức tạp.

Cấu trúc bao gồm -

  • Kiểm soát luồng tập lệnh (ifthen và else)
  • Các phép toán so sánh logic (lớn hơn, nhỏ hơn, bằng nhau)
  • Loops
  • Variables
  • Các tham số xác định hoạt động (tương tự như công tắc có lệnh)

Sử dụng Shell Script so với ngôn ngữ kịch bản

Thông thường, khi nghĩ về việc thực hiện một tác vụ, quản trị viên tự hỏi: Tôi nên sử dụng shell script hay một ngôn ngữ kịch bản như Perl, Ruby hoặc Python?

Không có quy tắc thiết lập nào ở đây. Chỉ có sự khác biệt điển hình giữa trình bao và ngôn ngữ kịch bản.

Vỏ

Shell cho phép sử dụng các lệnh Linux như sed , grep , tee , cat và tất cả các tiện ích dựa trên dòng lệnh khác trên hệ điều hành Linux. Trên thực tế, hầu hết mọi tiện ích dòng lệnh Linux đều có thể được viết mã trong shell của bạn.

Một ví dụ tuyệt vời về việc sử dụng shell sẽ là một tập lệnh nhanh để kiểm tra danh sách các máy chủ để phân giải DNS.

Tập lệnh Bash đơn giản của chúng tôi để kiểm tra tên DNS -

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

danh sách từ nhỏ để kiểm tra độ phân giải DNS trên -

dns 
www 
test 
dev 
mail 
rdp 
remote

Đầu ra đối với miền google.com -

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

Tận dụng các lệnh Linux đơn giản trong trình bao của chúng tôi, chúng tôi đã có thể tạo một tập lệnh 5 dòng đơn giản để kiểm tra tên DNS từ một danh sách từ. Điều này sẽ mất một khoảng thời gian đáng kể trong Perl, Python hoặc Ruby ngay cả khi sử dụng Thư viện DNS được triển khai độc đáo.

Ngôn ngữ viết kịch bản

Một ngôn ngữ kịch bản sẽ cung cấp nhiều quyền kiểm soát hơn bên ngoài shell. Tập lệnh Bash ở trên đã sử dụng một trình bao bọc xung quanh lệnh máy chủ Linux . Điều gì sẽ xảy ra nếu chúng ta muốn làm nhiều hơn và tạo ứng dụng của riêng mình như máy chủ để tương tác bên ngoài shell? Đây là nơi chúng tôi sẽ sử dụng một ngôn ngữ kịch bản.

Ngoài ra, với ngôn ngữ kịch bản được duy trì cao, chúng tôi biết các hành động của mình sẽ hoạt động trên các hệ thống khác nhau phần lớn. Ví dụ: Python 3.5 sẽ hoạt động trên bất kỳ hệ thống nào khác đang chạy Python 3.5 với cùng các thư viện được cài đặt. Không phải vậy, nếu chúng ta muốn chạy tập lệnh BASH của mình trên cả Linux và HP-UX.

Đôi khi ranh giới giữa ngôn ngữ kịch bản và trình bao mạnh mẽ có thể bị mờ. Có thể tự động hóa các tác vụ quản trị CentOS Linux bằng Python, Perl hoặc Ruby. Làm như vậy thực sự là khá phổ biến. Ngoài ra, các nhà phát triển shell-script giàu có đã tạo ra một daemon máy chủ web đơn giản, nhưng có chức năng khác trong Bash.

Với kinh nghiệm về ngôn ngữ kịch bản và tự động hóa các tác vụ trong trình bao, quản trị viên CentOS sẽ có thể nhanh chóng xác định nơi bắt đầu khi cần giải quyết vấn đề. Việc bắt đầu một dự án với shell script là khá phổ biến. Sau đó, chuyển sang ngôn ngữ kịch bản (hoặc biên dịch) khi một dự án trở nên phức tạp hơn.

Ngoài ra, bạn có thể sử dụng cả ngôn ngữ script và shell script cho các phần khác nhau của dự án. Một ví dụ có thể là một tập lệnh Perl để quét một trang web. Sau đó, sử dụng một tập lệnh shell để phân tích cú pháp và định dạng với sed , awkegrep . Cuối cùng, sử dụng tập lệnh PHP để chèn dữ liệu được định dạng vào cơ sở dữ liệu MySQL bằng GUI web.

Với một số lý thuyết đằng sau shell, hãy bắt đầu với các khối xây dựng cơ bản để tự động hóa các tác vụ từ Bash shell trong CentOS.

Đầu ra đầu vào và chuyển hướng

Xử lý stdout thành một lệnh khác -

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

Ở trên, chúng ta đã chuyển cat'sstoud sang wc để xử lý với ký tự pipe . wc sau đó xử lý đầu ra từ cat , in số dòng của output.txt vào terminal. Hãy nghĩ về ký tự ống dẫn như một "đường ống" truyền đầu ra từ một lệnh, sẽ được xử lý bởi lệnh tiếp theo.

Sau đây là các khái niệm chính cần nhớ khi xử lý chuyển hướng lệnh:

Con số Trình mô tả tệp Tính cách
0 đầu vào tiêu chuẩn <
1 đầu ra tiêu chuẩn >
2 lỗi tiêu chuẩn
nối stdout >>
chỉ định chuyển hướng &
ống stdout thành stdin |

Chúng tôi đã giới thiệu điều này trong chương một mà không thực sự nói nhiều về chuyển hướng hoặc gán chuyển hướng. Khi mở một terminal trong Linux, shell của bạn được coi là mục tiêu mặc định cho -

  • đầu vào tiêu chuẩn <0
  • đầu ra tiêu chuẩn> 1
  • lỗi tiêu chuẩn 2

Hãy xem cách này hoạt động như thế nào -

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$

/ dev / pts / 0 là thiết bị đầu cuối giả của chúng tôi. CentOS Linux nhìn vào điều này và nghĩ rằng ứng dụng đầu cuối mở của chúng tôi giống như một thiết bị đầu cuối thực sự với bàn phím và màn hình được cắm vào thông qua giao diện nối tiếp. Tuy nhiên, giống như một hypervisor trừu tượng hóa phần cứng của hệ điều hành / dev / pts trừu tượng hóa thiết bị đầu cuối của chúng ta thành các ứng dụng.

Từ lệnh lsof trên , chúng ta có thể thấy bên dướiFDcột mà cả ba bộ mô tả tệp được đặt thành thiết bị đầu cuối ảo của chúng tôi (0,1,2). Bây giờ chúng ta có thể gửi lệnh, xem đầu ra lệnh, cũng như bất kỳ lỗi nào liên quan đến lệnh.

Sau đây là các ví dụ cho STDIN và STDOUT -

GIỚI THIỆU

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

Cũng có thể gửi cả stdoutstderr đến các tệp riêng biệt -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

Khi tìm kiếm toàn bộ hệ thống tệp, hai lỗi đã gặp phải. Mỗi kết quả được gửi đến một tệp riêng để xem xét sau này, trong khi kết quả trả về được đặt vào một tệp văn bản riêng biệt.

Gửi stderr tới một tệp văn bản có thể hữu ích khi thực hiện những việc xuất nhiều dữ liệu đến thiết bị đầu cuối như biên dịch ứng dụng. Điều này sẽ cho phép kiểm tra các lỗi có thể bị mất khỏi lịch sử cuộn ngược của thiết bị đầu cuối.

Một lưu ý khi chuyển STDOUT sang tệp văn bản là sự khác biệt giữa >>>. Dấu đôi ">>" sẽ nối vào một tệp, trong khi dạng số ít sẽ chặn tệp và ghi nội dung mới (vì vậy tất cả dữ liệu trước đó sẽ bị mất).

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

Trong lệnh trên, tệp văn bản stdin.txt đã được chuyển hướng đến lệnh cat , lặp lại nội dung của nó thành STDOUT .

Ký tự ống dẫn "|"

Ký tự ống sẽ lấy đầu ra từ lệnh đầu tiên, chuyển nó làm đầu vào cho lệnh tiếp theo, cho phép lệnh thứ cấp thực hiện các thao tác trên đầu ra.

Bây giờ, hãy "chuyển hướng" câu lệnh của mèo sang một lệnh khác -

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

Ở trên, wc thực hiện các phép tính về đầu ra từ cat được truyền từ đường ống. Lệnh pipe đặc biệt hữu ích khi lọc đầu ra từ grep hoặc egrep -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

Trong lệnh trên, chúng tôi đã chuyển mỗi số 4 chữ số vào wc từ tệp văn bản chứa tất cả các số từ 65535 được chuyển qua bộ lọc egrep .

Chuyển hướng đầu ra với &

Đầu ra có thể được chuyển hướng bằng cách sử dụng &tính cách. Nếu chúng ta muốn hướng đầu ra cả STDOUT và STDERR, vào cùng một tệp, nó có thể được thực hiện như sau:

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

Chuyển hướng bằng cách sử dụng &ký tự hoạt động như thế này: đầu tiên, đầu ra được chuyển hướng thành out.txt . Thứ hai, STDERR hoặc bộ mô tả tệp 2 được gán lại vào cùng vị trí với STDOUT, trong trường hợp này là out.txt .

Chuyển hướng cực kỳ hữu ích và có ích trong khi giải quyết các vấn đề gặp phải khi thao tác các tệp văn bản lớn, biên dịch mã nguồn, chuyển hướng đầu ra trong các tập lệnh shell và phát hành các lệnh Linux phức tạp.

Mặc dù mạnh mẽ, việc chuyển hướng có thể trở nên phức tạp đối với các Quản trị viên CentOS mới hơn. Thực hành, nghiên cứu và thỉnh thoảng đặt câu hỏi cho diễn đàn Linux (chẳng hạn như Stack Overflow Linux) sẽ giúp giải quyết các giải pháp nâng cao.

Bash Shell cấu tạo

Bây giờ chúng ta đã biết rõ về cách Bash shell hoạt động, chúng ta hãy tìm hiểu một số cấu trúc cơ bản, thường được sử dụng, để viết script. Trong phần này chúng ta sẽ khám phá -

  • Variables
  • Loops
  • Conditionals
  • Kiểm soát vòng lặp
  • Đọc và ghi vào tệp
  • Các phép toán cơ bản

Gợi ý gỡ rối bằng BASH

BASH có thể hơi phức tạp so với một ngôn ngữ kịch bản chuyên dụng. Một số lỗi lớn nhất trong tập lệnh BASH là do thoát sai hoặc không thoát được các hoạt động tập lệnh được chuyển tới shell. Nếu bạn đã xem qua một kịch bản vài lần và nó không hoạt động như mong đợi, đừng băn khoăn. Điều này là phổ biến ngay cả với những người sử dụng BASH để tạo các tập lệnh phức tạp hàng ngày.

Tìm kiếm nhanh trên Google hoặc đăng ký tại một diễn đàn Linux chuyên gia để đặt câu hỏi sẽ dẫn đến giải pháp nhanh chóng. Rất có thể ai đó đã gặp vấn đề chính xác và nó đã được giải quyết.

BASH scripting là một phương pháp tuyệt vời để nhanh chóng tạo ra các script mạnh mẽ cho mọi thứ, từ việc tự động hóa các tác vụ quản trị đến tạo các công cụ hữu ích. Để trở thành nhà phát triển tập lệnh BASH cấp chuyên gia cần có thời gian và thực hành. Do đó, hãy sử dụng tập lệnh BASH bất cứ khi nào có thể, nó là một công cụ tuyệt vời cần có trong hộp công cụ Quản trị CentOS của bạn.