436 Chương 9 ■ Scripts Viết, Cấu hình Email, và sử dụng cơ sở dữ liệu
Mặc dù tung ra nhiều chương trình từ một kịch bản có thể tiết kiệm thời gian trong việc bắt đầu của
môi trường làm việc và một số tình huống khác, kịch bản cũng thường xuyên được sử dụng để chạy một
loạt các chương trình mà thao tác dữ liệu trong một số cách . Kịch bản như vậy thường làm notinclude
các ký hiệu ở hai đầu của các lệnh vì một lệnh phải chạy sau khi một
hoặc thậm chí có thể dựa vào đầu ra từ đầu tiên. Một danh sách đầy đủ của các lệnh như là
không thể bởi vì bạn có thể chạy bất kỳ chương trình bạn có thể cài đặt trong Linux như là một lệnh trong một
kịch bản, thậm chí một kịch bản khác. Một số lệnh thường được sử dụng trong các kịch bản bao gồm
như sau:
Bình thường tập thao tác lệnh Các lệnh thao tác với file, chẳng hạn như ls,
mv, cp, và rm, thường được sử dụng trong kịch bản. Bạn có thể sử dụng các lệnh này để giúp tự động hóa
các tác vụ bảo trì tập lặp đi lặp lại.
Grep lệnh này được mô tả trong Chương 1. Nó nằm những file chứa chuỗi cụ thể.
Tìm đâu grepsearches cho mô hình trong nội dung của các tập tin, finddoes như vậy dựa trên
tên tập tin, quyền sở hữu, và đặc điểm tương tự. Lệnh này được mô tả trong Chương 4.
cắt văn bản này chiết xuất lệnh từ trường trong một tập tin. Nó thường được sử dụng để trích xuất
thông tin biến từ một tập tin có nội dung được đánh giá cao có hoa văn. Để sử dụng nó, bạn vượt qua
nó một hoặc nhiều lựa chọn xác định những thông tin nào mà bạn muốn, theo sau bởi một hoặc nhiều
tên tập tin. Ví dụ, thư mục nhà của người sử dụng xuất hiện trong lĩnh vực đại tràng được phân định thứ sáu
của / etc / Passwdfile. Do đó, bạn có thể gõ cắt -f 6 -d ":" / etc / passwdto trích xuất
thông tin này. Các lệnh tương tự trong một kịch bản sẽ lấy thông tin này, bạn sẽ
có thể tiết kiệm đến một biến hoặc vượt qua một lệnh tiếp theo thông qua một đường ống.
Sed Chương trình này được mô tả trong Chương 1. Nó cung cấp rất nhiều các tính năng của một
trình soạn thảo văn bản thông thường nhưng thông qua các lệnh có thể được gõ tại dấu nhắc lệnh
hoặc. nhập vào trong một kịch bản
lặp Đôi khi một kịch bản phải cung cấp một thông báo cho người sử dụng; echois công cụ để
thực hiện mục tiêu này. Bạn có thể vượt qua các tùy chọn khác nhau để echoor chỉ là một chuỗi để hiển thị cho
người sử dụng. Ví dụ, echo "Nhấn phím Enter" gây ra một kịch bản để hiển thị các quy định
chuỗi.
Mail mailcommand có thể được sử dụng để gửi email từ bên trong một kịch bản. Vượt qua nó
subjectparameter -s để xác định một dòng tiêu đề và cung cấp cho nó một địa chỉ email như là cuối cùng
tranh luận. Nếu được sử dụng tại các dòng lệnh, bạn gõ một tin nhắn và chấm dứt nó với
một phím tắt Ctrl + D. Nếu được sử dụng từ một kịch bản, bạn có thể bỏ qua đối tượng hoàn toàn, vượt qua nó một
tập tin bên ngoài như thông điệp sử dụng chuyển hướng đầu vào, hoặc sử dụng một tài liệu ở đây để vượt qua văn bản để
các mailcommand như đầu vào. (Chương 1 mô tả chuyển hướng đầu vào và ở đây các tài liệu.)
Bạn có thể muốn sử dụng lệnh này để gửi thư đến superuser về những hành động của một
kịch bản khởi động hoặc một kịch bản chạy trên cơ sở tự động. Lệnh này được mô tả trong
chi tiết hơn trong chương này.
Scripts Viết 437
Nhiều người trong số các lệnh này là cực kỳ phức tạp, và hoàn toàn mô tả chúng là vượt ra ngoài phạm vi của chương này. Bạn có thể tham khảo trang man các lệnh 'để biết thêm thông tin. Một vài trong số họ được mô tả
ở những nơi khác trong cuốn sách này.
Thậm chí nếu bạn có một nắm đầy đủ về cách sử dụng một số lệnh bên ngoài quan trọng, chỉ cần thực hiện lệnh bạn có thể khi nhập chúng tại một dấu nhắc lệnh là các tiện ích giới hạn.
Nhiều nhiệm vụ hành chính đòi hỏi bạn sửa đổi những gì bạn gõ vào một lệnh, hoặc thậm chí
những lệnh nào bạn nhập vào, tùy thuộc vào thông tin từ các lệnh khác. Vì lý do này, ngôn ngữ kịch bản bao gồm các tính năng bổ sung để giúp bạn thực hiện các kịch bản của bạn hữu ích.
Sử dụng biến
giúp Variablescan bạn mở rộng các tiện ích của kịch bản. Một biến là một giữ chỗ trong một kịch bản
cho một giá trị đó sẽ được xác định khi chạy kịch bản. Biến các giá trị 'có thể được thông qua
như tham số cho kịch bản, được tạo ra trong nội bộ để các kịch bản, hoặc chiết xuất từ kịch bản của
môi trường.
Các biến được truyền cho các kịch bản thường được gọi là tham số. Họ đang được đại diện bởi một dấu đô la ($) tiếp theo là một số từ 0 đến 9 $ 0stands cho tên của
kịch bản, $ 1is tham số đầu tiên vào kịch bản, $ 2is tham số thứ hai, và như vậy.
Để hiểu cách này có thể có ích, hãy xem xét các nhiệm vụ thêm một người sử dụng. Như đã mô tả
ở Chương 7, "Quản trị hệ thống," tạo một tài khoản cho một người sử dụng mới thường
liên quan đến việc chạy ít nhất là hai lệnh-useraddand passwd. Bạn cũng có thể cần phải chạy
lệnh trang web cụ thể bổ sung, chẳng hạn như lệnh mà tạo người dùng sở hữu bất thường
thư mục ngoài thư mục chủ của người dùng.
Các shiftcommand thay đổi các biến tham số để điều gì sẽ
bình thường là $ 2becomes $ 1, những gì sẽ là $ 3becomes $ 2, và như vậy.
Thêm một số, như trong ca 3, thay đổi các bài tập bằng con số của
đơn vị. Các shiftcommand không làm thay đổi $ 0variable, mặc dù. Bạn có thể
sử dụng kết hợp shiftin với một vòng lặp (mô tả sau, trong "Sử dụng Loops")
để kiểm tra tất cả các thông số được truyền cho một kịch bản, trong trường hợp đặt hàng hoặc họ
số là chưa biết khi bạn viết kịch bản.
Như một ví dụ về cách một kịch bản với một biến tham số có thể giúp đỡ trong tình huống như vậy,
xem xét Listing 9.2. Kịch bản này tạo ra một tài khoản và thay đổi mật khẩu của tài khoản
(bạn sẽ được nhắc nhở để nhập mật khẩu khi bạn chạy các script). Nó tạo ra một thư mục
trong cây shareddirectory / tương ứng với tài khoản, và nó đặt ra một liên kết tượng trưng đến
thư mục đó từ thư mục chủ của người dùng mới. Nó cũng điều chỉnh quyền sở hữu và quyền trong một cách mà có thể hữu ích, tùy thuộc vào quyền sở hữu và quyền hạn của hệ thống
chính sách.
438 Chương 9 ■ Scripts Viết, Cấu hình Email, và sử dụng cơ sở dữ liệu
Listing 9.2: Một kịch bản mà làm giảm tính sáng tạo sự nhàm
chán! # / bin / sh
useradd -m 1 $
passwd 1 $
mkdir -p / chia sẻ / 1 $
chown $ 1.users / chia sẻ / 1 $
chmod 775 / chia sẻ / 1 $
ln -s / chia sẻ / $ 1 / home / $ 1 / chia sẻ
chown $ 1.users / home / $ 1 / chia sẻ
Nếu bạn sử dụng Bảng liệt kê 9.2, bạn cần gõ chỉ có ba điều: tên kịch bản với mong muốn
tên người dùng và mật khẩu (hai lần). Ví dụ, nếu kịch bản được gọi là mkuser, bạn có thể sử dụng
nó như thế này:
ajones # mkuser
Thay đổi mật khẩu cho ajones người dùng
Mật khẩu mới:
Nhập lại mật khẩu mới:
passwd: tất cả các thẻ xác thực được cập nhật thành công
nhất của chương trình 'kịch bản hoạt động âm thầm, trừ khi họ gặp phải vấn đề, vì vậy
tương tác (bao gồm cả cách gõ mật khẩu, mà không echo để màn hình) là một kết quả của
chỉ passwdcommand. Trong thực tế, kịch bản Listing 9.2 sẽ thay thế bảy dòng lệnh
với một. Mỗi một trong những dòng sử dụng tên người dùng, do đó bằng cách chạy script này, bạn cũng
làm giảm cơ hội của một lỗi đánh máy gây ra vấn đề.
Một loại biến được phân công trong kịch bản-ví dụ, các biến như vậy có thể
được thiết lập từ đầu ra của một lệnh. Các biến này cũng được xác định bởi các dấu hiệu đồng đô la hàng đầu, nhưng họ thường đưa ra những cái tên ít nhất là bắt đầu với một bức thư, chẳng hạn như $ Addr
hoặc $ Name. (Khi giá trị được gán cho biến, dấu $ được bỏ qua, như minh họa
trong thời gian ngắn.) Sau đó bạn có thể sử dụng các biến này kết hợp với các lệnh thông thường như thể họ
là các thông số lệnh, nhưng giá trị của biến được truyền vào lệnh.
Ví Ví dụ, hãy xem xét Bảng liệt kê 9.3, trong đó kiểm tra để xem liệu router của máy tính là
với sự giúp đỡ của các pingutility. Kịch bản này sử dụng hai biến. Việc đầu tiên là $ ip, mà
được chiết xuất từ các đầu ra của routeusing các grep, tr, và cutcommands. (Những
lệnh này được mô tả trong Chương 1.) Khi bạn đang gán giá trị cho một biến từ
các đầu ra của một lệnh, lệnh đó phải được kèm theo trong các nhân vật lại dấu tick (`),
trong đó xuất hiện trên cùng một phím dấu ngã (~) trên hầu hết các bàn phím. Đây là những notordinary
dấu nháy đơn, xuất hiện trên cùng một phím với các nhân vật báo thường xuyên (") trên hầu hết các
bàn phím. Các biến thứ hai, $ ping, chỉ đơn giản là chỉ vào pingprogram. Nó có thể dễ dàng được
bỏ qua, với việc sử dụng tiếp theo của $ pingreplaced bởi các đường dẫn đầy đủ đến các chương trình hoặc chỉ đơn giản
bằng cách ping (dựa trên biến $ PATHenvironment để tìm các chương trình). Biến như thế này
đôi khi được dùng để làm cho nó dễ dàng hơn để thay đổi kịch bản trong tương lai. Ví dụ, nếu bạn
Viết Scripts 439
di chuyển các pingprogram, bạn chỉ cần thay đổi một dòng của kịch bản. Biến trỏ đến
tập tin nhị phân cũng có thể được sử dụng kết hợp với các điều kiện để đảm bảo rằng các kịch bản làm việc
trên nhiều hệ thống, ví dụ, nếu pingwere gọi là cái gì khác trên một số hệ thống.
Listing 9.3: Script chứng minh chuyển nhượng và sử dụng các biến
#! / Bin / sh
ip = `route -n | grep UG | tr-s "" | cắt -f -d 2 ""
`ping =" / bin / ping
"echo" Kiểm tra xem nếu $ ip là lên ...
"$ ping -c 5 $ ip
Trong thực tế, bạn sử dụng Bảng liệt kê 9.3 bằng cách gõ tên của kịch bản . Kết quả sẽ được
thông báo kiểm tra để xem nếu 192.168.1.1is lên (với 192.168.1.1replaced bởi hệ thống cổng mặc định của máy tính) và đầu ra từ pingcommand, mà nên cố gắng
để gửi năm gói tin đến router. Nếu router lên và được cấu hình để đáp ứng với các lệnh ping,
bạn sẽ nhìn thấy năm gói trở lại và thông tin tóm tắt. Nếu router xuống, bạn sẽ thấy
thông báo lỗi tới những hiệu ứng mà chủ nhà đã không thể truy cập.
Listing 9.3 là hạn chế sử dụng thực tế và có lỗi. Ví dụ, các
kịch bản xác định cổng của máy tính chỉ đơn thuần bởi sự hiện diện của
chuỗi UGin dòng đầu ra của router từ đường. Nếu máy tính có hai router xác định, điều này sẽ không làm việc một cách chính xác, và kết quả có thể sẽ là một kịch bản
mà đối xử tệ bạc. Điểm của Liệt kê 9.3 không phải là để có một chương trình hoàn hảo
mà còn cho thấy các biến thể được chỉ định và sử dụng.
Scripts giống như Liệt kê 9.3, mà có được thông tin từ chạy một hoặc nhiều lệnh,
rất hữu ích trong việc cấu hình các tính năng dựa trên đặc thù hệ thống thông tin hoặc các thông tin
thay đổi theo thời gian. Bạn có thể sử dụng một cách tiếp cận tương tự để có được tên máy hiện (sử dụng
các hostnamecommand),
đang được dịch, vui lòng đợi..
