for条件付きループステートメント
forループステートメントを使用すると、スクリプトは一度に複数の情報を読み取り、情報を1つずつ操作できます。処理するデータに範囲がある場合は、forループステートメントの方が適しています。シェルスクリプトExample.shを実行します。アカウントに設定されたパスワードを入力すると、スクリプトはこれらのアカウントを自動的にチェックして作成します。冗長な情報が出力リダイレクト文字を介して/ dev / nullブラックホールファイルに転送されたため
[root@myserver ~]# cat users.txt
ndy
barry
carl
duke
eric
george
[root@myserver ~]# cat Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
[root@myserver ~]#
Linuxシステムでは、/ etc / passwdはユーザーアカウント情報を保存するために使用されるファイルです。このスクリプトがユーザーアカウントを正常に作成したかどうかを確認する場合は、このファイルを開いて、これらの新しく作成されたユーザー情報があるかどうかを確認できます。
[root@myserver ~]# sh Example.sh
Enter The Users Password : linuxprobe
ndy , Create success
barry , Create success
carl , Create success
duke , Create success
eric , Create success
george , Create success
[root@myserver ~]#
演習:5秒のカウントダウン
[root@myserver ~]# cat example1.sh
#!/bin/bash
echo "准备倒数5秒:"
for i in $(seq 5 -1 1)
do
echo -en "$i";sleep 1
done
echo -e "开始"
[root@myserver ~]# sh example1.sh
准备倒数5秒:
54321开始
[root@myserver ~]#
while条件付きループステートメント
while条件付きループステートメントは、スクリプトが特定の条件に基づいてコマンドを繰り返し実行できるようにするステートメントです。そのループ構造では、実行前の最終的な実行回数がわからないことがよくあります。これは、forループステートメントの使用とはまったく異なります。ターゲットと範囲のシーンがあります。whileループ文は、条件テストの真偽を判断してコマンドの実行を継続するかどうかを決定します。条件が真の場合は実行を継続し、偽の場合はループを終了します。whileステートメントの文法形式を図4-21に示します。
図4-21whileループステートメントの構文形式
次に、マルチブランチのif条件付きテストステートメントとwhile条件付きループステートメントを使用して、値の大きさを推測するために使用されるスクリプトGuess.shを記述します。スクリプトは、$ RANDOM変数を使用してランダム値(範囲0〜32767)を取得し、この乱数に対して1000までの剰余演算を実行し、exprコマンドを使用して結果を取得し、この値を使用してユーザーと通信します。読み取りコマンドを介して入力された値が比較され、判断されます。この判断文は、ユーザーが入力した値がexprコマンドで取得した値と等しいか、大きいか、小さいかを判断する3つの状況に分けられます。現在、これらの内容に焦点を当てていません。注意が必要なのは、while条件ループステートメントの条件テストが常に真であるため、ユーザーが入力した値が次の値になるまで、判断ステートメントが無期限に実行されることです。 exprコマンドによって取得された値。等しい後にexit0コマンドを実行して、スクリプトの実行を終了します。
[root@myserver ~]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
[root@myserver ~]# sh Guess.sh
商品实际价格为0-999之间,猜猜看是多少?
请输入您猜测的价格数目:600
太高了!
请输入您猜测的价格数目:500
太高了!
请输入您猜测的价格数目:300
太低了!
请输入您猜测的价格数目:450
太低了!
请输入您猜测的价格数目:480
太高了!
请输入您猜测的价格数目:470
太高了!
请输入您猜测的价格数目:460
太高了!
请输入您猜测的价格数目:455
太低了!
请输入您猜测的价格数目:456
恭喜您答对了,实际价格是 456
您总共猜测了 9 次
[root@myserver ~]#
シェルはwhileループを使用して三角形を出力します
[root@myserver ~]# cat example2.sh
#!/bin/sh
i=1
while [ $i -le 10 ] ; do
j=1
while [ $j -le $((10-$i)) ] ; do
echo -n ' '
j=$(($j+1))
done
j=1
while [ $j -le $((2*$i-1)) ] ; do
echo -n x
j=$(($j+1))
done
echo
i=$(($i+1))
done
exit 0
[root@myserver ~]# sh !$
sh example2.sh
x
xxx
xxxxx
xxxxxxx
xxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
[root@myserver ~]#
ケース条件付きテストステートメント
以前にC言語を勉強したことがある場合は、このセクションのタイトル「これはswitchステートメントではありません!」を見るときっと笑顔になります。はい、case条件付きテストステートメントとswitchステートメントの機能は非常に似ています。caseステートメントは、複数の範囲のデータを照合することです。照合が成功すると、関連するコマンドが実行され、条件テスト全体が終了します。データがリストされた範囲にない場合、アスタリスク(*)で定義されたデフォルトのコマンド実行されます。caseステートメントの文法構造を図4-22に示します。
図4-22ケース条件付きテストステートメントの文法構造
上で紹介したGuess.shスクリプトには致命的な弱点があります-それは数字しか受け入れることができません!文字を入力してみると、スクリプトがすぐにクラッシュすることがわかります。その理由は、文字を数字と比較できないためです。たとえば、「3以上である」という命題は完全に間違っています。ユーザーの入力を決定するための特定の手段が必要です。ユーザーの入力が数値でない場合、スクリプトはクラッシュを回避するためにプロンプトを表示できます。
スクリプトでケース条件付きテストステートメントとワイルドカードを組み合わせることで(詳細は第3章を参照)、この要件を完全に満たすことができます。次に、スクリプトCheckkeys.shを記述し、ユーザーに文字を入力して変数KEYに割り当てるように求め、変数KEYの値に応じて、値が文字、数字、またはその他の文字であるかどうかをユーザーに示します。
[root@myserver ~]# cat Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
[root@myserver ~]# sh Checkkeys.sh
请输入一个字符,并按Enter键确认:3
您输入的是 数字。
運動
[root@myserver ~]# cat example3.sh
#!/bin/bash
printf "Input integer number: "
read num
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
[root@myserver ~]# sh !$
sh example3.sh
Input integer number: 5
Friday
スケジュールされたタスクサービスプログラム
経験豊富なシステム運用および保守エンジニアは、Linuxが人間の介入なしに特定のサービスまたはコマンドを指定された期間に自動的に有効または停止できるようにすることで、運用および保守の自動化を実現できます。バッチ処理作業を実行するための強力なスクリプトプログラムができましたが、キーボードのエンターキーを押してこのスクリプトプログラムを毎日午前2時に実行する必要がある場合は、これは非常に面倒です(もちろん、また、深夜にEnterキーを押すように子猫を訓練することもできます)。次に、Liu Dun氏は、サーバーのスケジュールされたタスクサービスを設定する方法をすべての人に説明し、定期的および定期的な作業をシステムに渡して自動的に完了します。
1回限りのスケジュールされたタスクは、1回だけ実行され、通常、一時的な作業要件を満たすために使用されます。atコマンドを使用してこの機能を実現できます。「attime」の形式で記述してください。設定されているがまだ実行されていない1回限りのスケジュールされたタスクを表示する場合は、「at -l」コマンドを使用できます。削除する場合は、「atrmタスク番号」を使用できます。atコマンドを使用して1回限りのスケジュールされたタスクを設定する場合、デフォルトで対話型の方法が使用されます。たとえば、次のコマンドを使用して、今夜23時30分にWebサイトサービスを自動的に再起動するようにシステムを設定します。
[root@linuxprobe ~]# at 23:30
at > systemctl restart httpd
at > 此处请同时按下Ctrl+d来结束编写计划任务
job 3 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2016 a root
計画されたタスクを正式に展開する前に、LiuDun先生へのマントラ「分、時間、日、月、週の順序」をお読みください。これは、crondサービスを使用してタスクを設定するためのパラメータ形式です(形式については、表4-6を参照してください)。一部のフィールドが設定されていない場合は、図4-23に示すように、位置を占めるためにアスタリスク(*)を使用する必要があることに注意してください。
図4-23crondを使用してタスクのパラメータ形式を設定する
Webサイトを参照して、独自のタイミングタスクを調整することもできます https://tool.lu/crontab/
毎週月曜日、水曜日、金曜日の午前3時25分に、tarコマンドを使用して、特定のWebサイトのデータディレクトリをバックアップファイルとしてパッケージ化する必要があるとします。crontab -eコマンドを使用して、スケジュールされたタスクを作成できます。スケジュールされたタスクを自分で作成するために-uパラメーターを使用する必要はありません。効果を達成するための特定のパラメーターは、crontab-lコマンドの結果に示されているとおりです。
[root@myserver ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
[root@myserver ~]# crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
ユーザーIDと機能
管理者UIDは0です:システムの管理者ユーザー。
システムユーザーUIDは1〜999です。特定のサービスプログラムの脆弱性によりハッカーがサーバー全体に権限を拡大することを防ぐため、デフォルトのサービスプログラムは独立したシステムユーザーによって実行され、被害の範囲を効果的に制御します。共通ユーザーUIDは1000から始まります:それは日常業務のために管理者によって作成されたユーザーです
useraddコマンド
useraddコマンドは、新しいユーザーを作成するために使用されます。形式は「useradd [option] username」です。
useraddコマンドを使用して、ユーザーアカウントを作成できます。このコマンドを使用してユーザーアカウントを作成すると、デフォルトのユーザーホームディレクトリが/ homeディレクトリに保存され、デフォルトのシェルインタープリターが/ bin / bashになり、ユーザーと同じ名前の基本ユーザーグループが作成されます。デフォルト
-c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录> 指定用户登入时的起始目录。
-D 变更预设值.
-e<有效期限> 指定帐号的有效期限。
-f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。
-g<群组> 指定用户所属的群组。
-G<群组> 指定用户所属的附加群组。
-m 自动建立用户的登入目录。
-M 不要自动建立用户的登入目录。
-n 取消建立以用户名称为名的群组.
-r 建立系统帐号。
-s<shell> 指定用户登入后所使用的shell。
-u<uid> 指定用户ID。
一般ユーザーを追加
[root@myserver ~]# id yhd
uid=1007(yhd) gid=1007(yhd) groups=1007(yhd)
システムユーザーを追加する
[root@myserver ~]# useradd -r yang
[root@myserver ~]# id yang
uid=976(yang) gid=974(yang) groups=974(yang)
[root@myserver ~]#
新しく追加したユーザーのホームディレクトリを指定します
[root@myserver ~]# useradd -d /home/gaga xiaxia
[root@myserver ~]# tree /home
/home
├── barry
├── carl
├── duke
├── eric
├── gaga
├── george
├── linuxprobe
│ ├── Desktop
│ ├── Documents
│ ├── Downloads
│ ├── Music
│ ├── Pictures
│ ├── Public
│ ├── Templates
│ └── Videos
├── ndy
└── yhd
17 directories, 0 files
[root@myserver ~]#
ユーザーを作成してIDを作成する
[root@myserver ~]# useradd caocao -u 544
[root@myserver ~]# id caocao
uid=544(caocao) gid=1011(caocao) groups=1011(caocao)
[root@myserver ~]#
以下では、通常のユーザーを作成し、ホームディレクトリのパス、ユーザーのUID、およびシェルインタープリターを指定します。以下のコマンドでは、Bashインタープリターとは大きく異なるターミナルインタープリターのメンバーである/ sbin / nologinに注意してください。ユーザーのインタープリターがnologinに設定されると、ユーザーはシステムにログインできなくなります。
[root@myserver ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin laoliu
[root@myserver ~]# id laoliu
uid=8888(laoliu) gid=8888(laoliu) groups=8888(laoliu)
[root@myserver ~]#
groupaddコマンド
groupaddコマンドは、ユーザーグループを作成するために使用されます。形式は「groupadd [オプション]グループ名」です。
システム内の各ユーザーのアクセス許可をより効率的に割り当てることができるようにするために、複数のユーザーが作業内の同じグループに追加されることが多く、ユーザーのタイプごとにアクセス許可を均一に配置できます。ユーザーグループを作成する手順は非常に簡単です
-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组ID小于 500;
-K:覆盖配置文件 "/ect/login.defs";
-o:允许添加组 ID 号不唯一的工作组。
-f,--force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。
usermodコマンド
usermodコマンドは、ユーザーの属性を変更するために使用され、形式は「usermod [option] username」です。
-c<备注> 修改用户帐号的备注文字。
-d登入目录> 修改用户登入时的目录。
-e<有效期限> 修改帐号的有效期限。
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-g<群组> 修改用户所属的群组。
-G<群组> 修改用户所属的附加群组。
-l<帐号名称> 修改用户帐号名称。
-L 锁定用户密码,使密码无效。
-s<shell> 修改用户登入后所使用的shell。
-u<uid> 修改用户ID。
-U 解除密码锁定。
passwdコマンド
passwdコマンドは、ユーザーパスワード、有効期限、認証情報などを変更するために使用されます。形式は「passwd [option] [username]」です。
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
共通ユーザーパスワードとルートパスワードを変更する
[root@myserver ~]# passwd yhd
Changing password for user yhd.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@myserver ~]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@myserver ~]#
passwdコマンドは、ユーザーがシステムにログインすることを禁止します(ユーザーのロック--->ユーザーステータスの表示->ユーザーのロック解除--->ユーザーステータスの表示)
[root@myserver ~]# passwd -l yhd
Locking password for user yhd.
passwd: Success
[root@myserver ~]# passwd -S yhd
yhd LK 2021-01-15 0 99999 7 -1 (Password locked.)
[root@myserver ~]# passwd -u yhd
Unlocking password for user yhd.
passwd: Success
[root@myserver ~]# passwd -S yhd
yhd PS 2021-01-15 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@myserver ~]#
userdelコマンド
userdelコマンドは、ユーザーを削除するために使用されます。形式は「userdel [option] username」です。
-f 强制删除用户
-r 同时删除用户及用户家目录
[root@myserver ~]# tail -f /etc/passwd
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash
yhd:x:1007:1007::/home/yhd:/bin/bash
yang:x:976:974::/home/yang:/bin/bash
gaga:x:1008:1008::/yang/hua:/bin/bash
pipi:x:1009:1009::/yang/gaga:/bin/bash
xiaxia:x:1010:1010::/home/gaga:/bin/bash
caocao:x:544:1011::/home/caocao:/bin/bash
laoliu:x:8888:8888::/home/linux:/sbin/nologin
^C
[root@myserver ~]# userdel -r pipi
[root@myserver ~]# tail -f /etc/passwd
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash
yhd:x:1007:1007::/home/yhd:/bin/bash
yang:x:976:974::/home/yang:/bin/bash
gaga:x:1008:1008::/yang/hua:/bin/bash
xiaxia:x:1010:1010::/home/gaga:/bin/bash
caocao:x:544:1011::/home/caocao:/bin/bash
laoliu:x:8888:8888::/home/linux:/sbin/nologin
^C
[root@myserver ~]#