請點選您的帳號:
以下是特定機器的參數:
Code number: [code-num]
您的IP: [Local-IP]
每次都要更新
編輯環境變數 在bashrc文件末端加入兩行字
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH
檢查網路:
編輯環境變數:
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH
檢查網路:
eth0 Link encap:Ethernet HWaddr 1c:af:f7:00:00:xx inet addr: [Local-IP] Bcast:172.31.255.255 Mask:255.240.0.0 inet6 addr: fe80::1eaf:f7ff:fe00:55/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:79449 errors:0 dropped:0 overruns:0 frame:0 TX packets:14316 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:265298595 (253.0 MiB) TX bytes:1709153 (1.6 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
每次都要更新:
新增使用者
檢查作業用std055一定要新增
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
統一在家目錄做事
提示字符變成 [帳號]@[hostname]:~$
新增資料夾
檢查是否出現homework資料夾
連本機:
這是本機連本機 新的shell預設位於家目錄
離開連線:
指定使用者及port
查看基本環境:
操作目錄檔案:
備份目錄檔案例子:
搜尋目錄檔案例子:
/etc/ssh/sshd_config /usr/share/doc/openssh-client/examples/sshd_config
檔案連結:
ln [被連結檔案] [捷徑]:
產生助教要檢查的作業:
Q:為什麼使用su 切換新創的使用者只有錢錢的符號???
A:因為我們的環境預設不載入bash,所以手動輸入bash即可
Q:我的sudo 指令無法使用???
A:因為許多同學不熟悉echo及編輯文件,所以.bashrc被改壞了,
莫及莫慌莫害怕,等編輯文件的功能熟悉之後再改回來。
目前暫時用不到sudo功能。
創四個文件,練習跟權限相關的指令
Permission Denied (因此文件尚未得到執行權限)
unix 上的編輯器主要分為兩種, vi 先轉換狀態再開始工作,
其他的編輯器如 nano 和 emacs ,大致上維持同個狀態,利用組合鍵達到傳遞指令的功能。
vi 是unix 早期即發展出來的編輯器,許多維護系統的狀況不得不從 vi 展開後續工作,
所以 vi 為必學的使用工具。
文字編輯的練習請在821的Ubuntu上使用。
否則退不出畫面,難以幫大家操作。
先使用vim 熟悉vi的使用方式。
確認 vim 有裝:
回到家目錄並產生練習文件,打開:
剛進入畫面是[游標模式],可以移動方向鍵
但是還無法編輯 。
欲編輯文字請 [按 i]進入[插入模式]
[按 Esc] 可以從[插入模式]回到[游標模式]
在[游標模式]的當下[按 shift + 冒號]
在冒號後面打對應的功能英文字之後[按 Enter]
yy 整行複製
p 貼上目前複製的內容
dd 整行刪掉
:w 存檔
:w [another file name] 另存新檔
:q 離開
修改過又沒有存檔的文件會離開失敗。
想離開確定不存檔可用:
:q! 強迫離開,驚嘆號是強迫的意思。
如果第二次之後打開文件出現:
Swap file ".testvim.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
請按對應的頭文字即可。
nano 是輕量化的編輯器,對於簡單的編輯,堪用。
nano 進入畫面就可開始編輯,其他功能由組合鍵傳達。
^ 符號是組合鍵的的意思,意指[ctrl+後面的鍵]
[ctrl+G] : 進入說明提示頁
[ctrl+O] : 存檔
[ctrl+X] : 離開
[ctrl+C] : 取消
[ctrl+K] : 剪下整行
[ctrl+U] : 貼上被剪下的整行
如同上禮拜所做的,回到homework並產生練習文件,打開:
1.將所有case字串改成 string01
2.將所有esac字串改成 string02
3.刪除前十行
(行數以當下的行數計算)
4.複製前十行,於文件最後一行貼上
5.將步驟四再做三次
6.將15到35行的內容,前面加上五個空白
7.將 11行和12行的內容合併
8.將 12行和13行的內容合併
9. 將 13行和14行的內容合併
10. 刪掉所有fi 字串
11. 另存新檔成 vihw[std帳號三位數]
因為是作業所以助教不會回答怎麼做。(下面有提示)
可以自己上網查用法。
主要看會不會用指令,會酌量給分。
:set nu 將行數顯示出來
:%s/old/new/g 取代全部的字串
:起點行數,終點行數 s/old/nwer/g 取代範圍字串
^ 符號代表該行前面
/字串 往游標之後尋找該字串。
?字串 往游標之前尋找該字串。
n 往下繼續尋找下一個相同的字串。
N 往上繼續尋找下一個相同的字串。
10dd 刪除10行
10yy 複製10行
P 在下一行貼上
J 合併此行和下一行
. del的那個點可將上次的動作再做一次
u 小寫u可回覆上一個動作
如果sudo 跟其他指令都沒問題(指令前面不用加/sbin)請跳過此小節。
完成作業後(熟悉編輯器後)再做。
檢查bashrc是否正確
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH
有多打、少打、或打字錯誤的請修正。
有疑慮的可使用wget指令下載助教的檔案參考。
不要直接拿來用,可能會有問題。
確認無誤後用source 指令宣告至目前環境。
用你熟悉的編輯器編輯一文件,命名為 sample.sh
#! /bin/bash for i in a b c do echo $i done
存檔後增加執行權限並執行
a b c
前置作業
這次有三個練習作業請大家完成(grep, diff, sed)
新增使用者,助教檢查用
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
用新創好的帳號登入
切換到std056目錄
新增作業資料夾
新增10/28的資料夾
因為會用到,安全起見先讓設定檔作備份
在1028的資料夾裡新增一個檔案叫interfaces_new
將在/etc/network底下的interfaces這個檔案寫入到interfaces_orgi
請創立一個檔案名稱叫做interfaces_new
將interfaces_orgi檔案中,抓取有eth的欄位(grep),並寫到interfaces_new
Hint:
利用管線命令(pipe) | 這符號,可以做到複雜的功能
像是 last | sort 意思就是在查看登入紀錄的同時做排序,讓我們更好閱讀
| 後面也可以使用head, tail, grep等其他指令
PS. 若是出現permission deny,因為新創的檔案沒有權限(請用chmod指令)
若是有sudoer的問題,修改/etc/sudoer的檔案內容即可
創立兩個檔案叫作group1和group2,並將下面內容貼上
root:x:0:root bin:x:1:root,bin,daemonn users:x:200:henry,image,enquiry adm:x:25:adm,daemon,listen dialout:x:18:root,henry lp:x:19:lp ftp:x:50:
root:x:0:root bin:x:1:root,bin,daemon users:x:100:henry,image,enquiry adm:x:25:adm,daemon,listen dialout:x:19:root,henry lp:x:18:lp ftp:x:50: Cron:x:16:cron
自行練習使用diff, sdiff ,cmp對group1和group2作比較
創立一個檔案叫作group_diff
將兩個檔案以diff作比較,並寫入到group_diff中
我們這邊以bashrc作為範例
首先先下載~
再創立一個檔案bashrc_test
先將bashrcexample的內容寫到bashrc_test裡面
將bashrc_test的檔案中,PATH的字串以你的帳號(e.g. std055)作取代
在將bashrc_test中,第6~10行內容刪除
在將bashrc_test中,第15行加上容內UNIX-2015
Hint :
sed ‘1,100d’ file :刪除file裡1到100行的內容
sed ‘1a hello’ file : 在file裡第1行加上hello
sed ‘1,100c YEE’ file : 在file裡的1~100行以字串YEE取代
sed ‘s/s1/s2/g’ file : 用s2取代所有在file裡的s1字串
另外可以使用-i 直接修改檔案內容,而非透過螢幕顯示
舉例 sed –i ‘1,10d’ file 直接刪除1~10行內容
要學會看自己的環境,
上網問問題時要報出自己的環境,方便其他人回答問題:
檢視連線可以確認是否有不正常的連線
如果有或不確定則改變密碼等方法增加安全性。
這禮拜的作業是交作業:
使用mv 或 cp 等指令將之前在各處存放的作業移到/home/std056/homework 底下
普通使用者用到別人家的家目錄請用sudo
之前創過的std055因為缺少許多預設值,現在以std056為主。
要交的項目請參考下面的ls
1028 1007 file01 file02 file03 file04 filetoedit foo myspell mywc private vihw[您的帳號]
至於1028資料夾 ls 出來則是:
interfaces_new group_diff bashrc_test
打包檔案並傳到助教的機器裡:
從哪裡打包出來的沒有硬性規定,
作業有在tar檔內即可。
scp 為ssh 版本的cp ,跨主機使用。
每次scp都需要輸入密碼,密碼就是你知道的。
想自己解壓縮看看得可以使用:
想看有沒有交成功的使用ssh 搭配 ls:
可把standard output 在local的畫面上。
本日優先處理交作業的相關的環境跟指令,之前有缺漏或不會寫的同學,
請問其他同學或有時間再處理。
作業繳交期限,此堂課期中考那禮拜的禮拜日。
!!連載再開!!
大家已經有足夠的背景知識,來了解自己使用的環境了!
此章節帶大家看自己的機器如何被開啟的,並了腳本的基本用法。
|
|
啟動虛擬機腳本
#! /bin/bash MEM=2048M # Don't Edit, File automatically generated by Config-Kvm-UAS script if [ $EUID -ne 0 ] then sudo echo "Super User passwd, please:" if [ $? -ne 0 ] then echo "Sorry, need su privilege!" exit 1 fi fi if [ ! -d /proc/sys/net/ipv4/conf/brLAN ]; then echo "Network bridge brLAN does not exist, start it first." exit 2 fi sudo chmod 666 /dev/net/tun sudo tunctl -u `whoami` -t uas1 sudo /sbin/ifconfig uas1 up sudo ovs-vsctl add-port brLAN uas1 mkdir /src3/KVM/bin/network-std-001 echo "Starting VM: std-001..., mem=${MEM}" screen -S std-001 -d -m kvm -name std-001 -localtime \ -m ${MEM} \ -net nic,vlan=0,netdev=uas1,macaddr=1c:af:f7:00:00:01,model=virtio \ -netdev tap,id=uas1,ifname=uas1,script=no \ -monitor unix:/src3/KVM/bin/network-std-001/MonSock,server,nowait \ -vnc :1,password \ -drive index=0,media=disk,if=virtio,file=/src3/KVM/img/UAS/std001.qcow2 & sleep 3 echo "set_password vnc unix2015" | socat - unix-connect:/src3/KVM/bin/network-std-001/MonSock
關閉虛擬機,恢復網路腳本
#! /bin/bash # Don't Edit, File automatically generated by Config-Kvm-UAS script if [ $EUID -ne 0 ] then sudo echo "Super User passwd, please:" if [ $? -ne 0 ] then echo "Sorry, need su privilege!" exit 1 fi fi if [ -S /src3/KVM/bin/network-std-001/MonSock ]; then echo "system_powerdown" | socat - unix-connect:/src3/KVM/bin/network-std-001/MonSock echo "Please wait 10 seconds." sleep 10 else echo "Socket has been removed! Shutdown by ssh or resotre Lan only." fi ping -c 3 172.16.16.101 if [ $? -eq 0 ]; then echo "std-001 still alive, shut it down. Enter passwd twice!" ssh -t @172.16.16.101 'sudo init 0' else rm -rf /src3/KVM/bin/network-std-001 fi echo "Restore lan..." if [ -d /proc/sys/net/ipv4/conf/uas1 ]; then sudo ovs-vsctl del-port brLAN uas1 sudo /sbin/ifconfig uas1 down sudo tunctl -d uas1 fi
VNC server Guacamole:
為了方便網頁存取,虛擬機會丟出VNC流量以及等待密碼。
VNC的server會輸入正確的密碼,取得畫面並等待使用者使用。
官方網站Guacamole Web site.
#! /bin/bash sudo cp ~/.Xauthority /root sudo aptitude update sudo aptitude install python-setuptools git xterm -y cd git clone git://github.com/mininet/mininet cd mininet gcc -o mnexec mnexec.c sudo mv mnexec /usr/local/bin/ sudo python setup.py install echo $? sudo mn --version
系統維運需要大量定期的重複動作,
我們可藉由cron 幫我們在離峰的時候處理batch的工作
預設設定檔內容
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #
請不要在上課的機器真的做這個,所有虛擬機的流量都算在一個實體ip上。
cron 跟腳本的相性良好,經常結合使用
以下介紹另外一個範本。
某工程師的腳本Hacker-scripts.
上機作業需繳交的項目
1028 1007 file01 file02 file03 file04 vihw[您的帳號] foo myspell mywc private
shell 因為歷史因素支援很多種語法,不過有時候你想用的剛好不支援。
遇到循序處理及數字運算時,可使用 seq 及 expr
例如:
真實案例: 啟動/關閉 所有機器
declare -a PORT={0,0,0,0,0,0,0} #陣列 區分不同的host for i in `seq -w 1 49`; do #-w 補零補到跟最大數的位數 HOST=`expr $i '%' 7` # mod if [ ${HOST} -eq 0 ]; then # -eq 等於 HOST='7' fi ((PORT[$HOST]++)) # 累計在該host上已經算過幾台機器 if [ ! ${HOST} -eq 1 ];then ssh -t cs0$HOST "/UAS/start-std-0$i-tap${PORT[${HOST}]}-AsDaemon" #如果運算正確可以在正確的機器啟動已存在的腳本 fi done
這次不要壓縮,檔案名稱照題目裡寫的。
使用scp 指令交到 std055 的機器上,以各位學號為名的資料夾已經創建好。
要查看、處理自己已經交的檔案
因為用vnc寫腳本解析度太差,
可選用std056帳號的ssh 連線,
需將自己機器的std056帳號的密碼改成[那個密碼](如果你之前用自己的密碼)
ssh 連線會在關閉視窗時掉線(目前的buffer會找不回來) ,請勤加存檔小心使用。
#!/usr/bin/perl # Script: sample.pl - Shows use of variables print("Your name: ") ; $name = 左小括STDIN右小括 ; # Input from keyboard chomp($name) ; # Removes trailing \n 去除結尾處的換列字符 "\n" print("Temperature in Centigrade: ") ; $centigrade= 左小括STDIN右小括 ; # Whitespace unimportant $fahrenheit= $centigrade*9/5 + 32 ; # Here too printf "Temperature %s in Fahrenheit: %f\n", $name, $fahrenheit ;執行範例程式
chmod +x sample.pl; sample.pl流程控制
cat leap_year.pl#!/usr/bin/perl # while (1) { $yesorno = "not" ; printf("Enter a year: "); chomp($year = 左小括STDIN右小括); if ("$year" > 0) { if ($year % 4 == 0 && $year % 400 == 0) { $yesorno = "certainly" ; } elsif ($year % 100 != 0 && $year % 4 == 0) { $yesorno = "certainly" ; } print ("$year is " . $yesorno . " a leap year\n") ; } printf("Wish to continue? "); chomp($answer = 左小括STDIN右小括); last if ($answer eq "n" || $answer eq "N"); }陣列
cat ar_in_ar.pl#!/usr/bin/perl # @days_between = ("Wed", "Thu") ; @days = (Mon, Tue, @days_between, Fri) ; @days[5,6] = qw/Sat Sun/ ; $length = @days ; # @days in scalar context print ("The third day of the week is $days[2]\n") ; print ("The days of the week are @days\n") ; print ("The number of elements in the array is $length\n") ; print ("The last subscript of the array is $#days\n") ; $#days = 5; #Resize the array print ("\$days[6] is now $days[6]\n") ;