上機日誌


請點選您的帳號:

以下是特定機器的參數:

Code number: [code-num]

您的IP: [Local-IP]


2015/09/30

每次都要更新

sudo aptitude update
sudo aptitude upgrade

編輯環境變數 在bashrc文件末端加入兩行字

nano ~/.bashrc
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH

檢查網路:

ping 8.8.8.8 -c 3
ifconfig

2015/10/07

編輯環境變數:

echo "PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin" >> ~/.bashrc
echo "export PATH" >> ~/.bashrc
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH
source ~/.bashrc

檢查網路:

ping 8.8.8.8 -c 3
ifconfig
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)

每次都要更新:

sudo aptitude update
sudo aptitude upgrade

HomeWork 01:

HomeWork前置作業:

新增使用者

檢查作業用std055一定要新增

sudo useradd std055
sudo passwd std055
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

統一在家目錄做事

cd
提示字符變成 [帳號]@[hostname]:~$

新增資料夾

mkdir ~/homework
ls
檢查是否出現homework資料夾

ssh 連線練習:

連本機:

ssh [Local-IP]
這是本機連本機 新的shell預設位於家目錄

離開連線:

exit

進階with參數 ssh連線:

指定使用者及port

ssh -p 22 std055@[Local-IP]
exit

常用指令練習:

查看基本環境:

date
who
pwd
top
df
df -h
ps
ps -aux
ps -aux | grep process

操作目錄檔案:

ls /home/std055
ls -l /home/std055
ls -a /home/std055
ls -la /home/std055
touch origl
rm origl
mkdir wrongdir
rmdir wrongdir

備份目錄檔案例子:

touch original
echo "line1" >> original
echo "line2" >> original
echo "line3" >> original
more original
cp original backup
more backup
cat backup
echo "Ooops! error placement" > original
cp backup original

搜尋目錄檔案例子:

find . -name original -print
sudo find / -name sshd_config -print
/etc/ssh/sshd_config /usr/share/doc/openssh-client/examples/sshd_config

檔案連結:

ln [被連結檔案] [捷徑]:

ln original lindedfile
ls -l
ln -s original softlinkedfile
ls -l

產生助教要檢查的作業:

cd ~/homework
history
history >> 1007

上機問題回顧

Q:為什麼使用su 切換新創的使用者只有錢錢的符號???

A:因為我們的環境預設不載入bash,所以手動輸入bash即可

su [新創的帳號]
bash
sudo mkdir /home/[新創的帳號]
cd

Q:我的sudo 指令無法使用???

A:因為許多同學不熟悉echo及編輯文件,所以.bashrc被改壞了,

莫及莫慌莫害怕,等編輯文件的功能熟悉之後再改回來。

目前暫時用不到sudo功能。

2015/10/14

homework-2

創四個文件,練習跟權限相關的指令

cd ~/homework
su
touch file01
chgrp [你的帳號] file01
touch file02
chown [你的帳號] file02
touch file03
chmod 777 file03
touch file04
echo "pwd" >> file04
./file04
Permission Denied (因此文件尚未得到執行權限)
chmod +x file04
./file04
exit

文字編輯器常用功能介紹, vi & nano

unix 上的編輯器主要分為兩種, vi 先轉換狀態再開始工作,

其他的編輯器如 nano 和 emacs ,大致上維持同個狀態,利用組合鍵達到傳遞指令的功能。

vi 是unix 早期即發展出來的編輯器,許多維護系統的狀況不得不從 vi 展開後續工作,

所以 vi 為必學的使用工具。

文字編輯的練習請在821的Ubuntu上使用。

否則退不出畫面,難以幫大家操作。

先使用vim 熟悉vi的使用方式。

確認 vim 有裝:

sudo apt-get install vim

回到家目錄並產生練習文件,打開:

cd
cp .bashrc testfile
vim testfile

vi 的基本模式轉換:

剛進入畫面是[游標模式],可以移動方向鍵

但是還無法編輯 。

欲編輯文字請 [按 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 是輕量化的編輯器,對於簡單的編輯,堪用。

nano 進入畫面就可開始編輯,其他功能由組合鍵傳達。

nano testfile

nano 常用組合鍵介紹:

^ 符號是組合鍵的的意思,意指[ctrl+後面的鍵]

[ctrl+G] : 進入說明提示頁

[ctrl+O] : 存檔

[ctrl+X] : 離開

[ctrl+C] : 取消

[ctrl+K] : 剪下整行

[ctrl+U] : 貼上被剪下的整行


2015/10/21

homework-03

如同上禮拜所做的,回到homework並產生練習文件,打開:

cd ~/homework
cp ~/.bashrc filetoedit
vim filetoedit

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可回覆上一個動作


修復bashrc

如果sudo 跟其他指令都沒問題(指令前面不用加/sbin)請跳過此小節。

完成作業後(熟悉編輯器後)再做。

檢查bashrc是否正確

cat ~/.bashrc
......(原本的內容) PATH=.:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH

有多打、少打、或打字錯誤的請修正。

有疑慮的可使用wget指令下載助教的檔案參考。

不要直接拿來用,可能會有問題。

wget www.cs.nchu.edu.tw/~snmlab/Unix-1-2015/bashrcexample

確認無誤後用source 指令宣告至目前環境。

source ~/.bashrc

簡單的Script 範例:

用你熟悉的編輯器編輯一文件,命名為 sample.sh

vi sample.sh
#! /bin/bash for i in a b c do echo $i done

存檔後增加執行權限並執行

chmod +x sample.sh
./sample.sh
a b c

2015/10/28

Homework-04

前置作業
這次有三個練習作業請大家完成(grep, diff, sed)

新增使用者,助教檢查用

sudo adduser std056
sudo passwd std056
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

用新創好的帳號登入

su std056

切換到std056目錄

cd /home/std056

新增作業資料夾

mkdir homework
cd homework

新增10/28的資料夾

mkdir 1028
cd 1028

grep exercise

因為會用到,安全起見先讓設定檔作備份

cp /etc/network/interfaces /etc/network/interfaces_backup

在1028的資料夾裡新增一個檔案叫interfaces_new

touch 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的檔案內容即可


diff exercise

創立兩個檔案叫作group1和group2,並將下面內容貼上

touch group1 group2
nano group1
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:
nano group2
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中


sed exercise

我們這邊以bashrc作為範例

首先先下載~

wget www.cs.nchu.edu.tw/~snmlab/Unix-1-2015/bashrcexample

再創立一個檔案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行內容



2015/11/04

基礎指令練習

要學會看自己的環境,

上網問問題時要報出自己的環境,方便其他人回答問題:

uname -a
df -h
du -h
file [某個檔案]
df -h

檢視連線

檢視連線可以確認是否有不正常的連線

如果有或不確定則改變密碼等方法增加安全性。

w
who
finger

homework[01-04]

這禮拜的作業是交作業:

使用mv 或 cp 等指令將之前在各處存放的作業移到/home/std056/homework 底下

普通使用者用到別人家的家目錄請用sudo

之前創過的std055因為缺少許多預設值,現在以std056為主。

要交的項目請參考下面的ls

ls /home/std056/homework
1028 1007 file01 file02 file03 file04 filetoedit foo myspell mywc private vihw[您的帳號]

至於1028資料夾 ls 出來則是:

ls /home/std056/homework/1028
interfaces_new group_diff bashrc_test

打包檔案並傳到助教的機器裡:

從哪裡打包出來的沒有硬性規定,

作業有在tar檔內即可。

tar zcvf 學號.tar /home/std056/homework/*
scp 學號.tar std056@172.16.16.155:/home/std056/handin

scp 為ssh 版本的cp ,跨主機使用。

每次scp都需要輸入密碼,密碼就是你知道的。


想自己解壓縮看看得可以使用:

tar zxvf 學號.tar

想看有沒有交成功的使用ssh 搭配 ls:

可把standard output 在local的畫面上。

ssh std055@172.16.16.155 "ls /home/std056/handin"

本日優先處理交作業的相關的環境跟指令,之前有缺漏或不會寫的同學,

請問其他同學或有時間再處理。

作業繳交期限,此堂課期中考那禮拜的禮拜日。


!!連載再開!!

2015/Dec

上課環境介紹

大家已經有足夠的背景知識,來了解自己使用的環境了!

此章節帶大家看自己的機器如何被開啟的,並了腳本的基本用法。

實驗環境


虛擬機環境
Virtual Machine
Location 821 機房伺服器
CPU vcpu*2
Memory 4G
Disk spaces 80G (QCOW2 Format)
O.S. Debian Jessie
理學大樓 821 機房
CSIE-Cloud01 ~ CSIE-Cloud06
CPU AMD Opteron™ Processor 6128 * 2
(total 16 cpu cores)
Memory 32G
Disk spaces 500G、500G、1T
O.S. Debian wheezy
CSIE-Cloud07、CSIE-Cloud08
CPU AMD Opteron™ Processor 6234 * 2
(total 24 cpu cores)
Memory 32G
Disk spaces 500G、500G、1T
O.S. Debian wheezy

開啟及關閉虛擬機

啟動虛擬機腳本

cat start-std-001-tap1-AsDaemon
#! /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

關閉虛擬機,恢復網路腳本

cat stop-std-001-restore-lan-tap1
#! /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.


用腳本處理一連串或重複的指令。例:安裝mininet

cat mininetinstall.sh
#! /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

Crobtab練習

系統維運需要大量定期的重複動作,

我們可藉由cron 幫我們在離峰的時候處理batch的工作

預設設定檔內容

cat /etc/crontab
# /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 ) #

請練習 Crobtab功能: 每個禮拜 update 每個月upgrade

請不要在上課的機器真的做這個,所有虛擬機的流量都算在一個實體ip上。


另一個(極端的)例子

cron 跟腳本的相性良好,經常結合使用

以下介紹另外一個範本。

某工程師的腳本Hacker-scripts.

作業注意事項

上機作業需繳交的項目

ls /home/std056/homework
1028 1007 file01 file02 file03 file04 vihw[您的帳號] foo myspell mywc private

基本變數、運算

shell 因為歷史因素支援很多種語法,不過有時候你想用的剛好不支援。

遇到循序處理及數字運算時,可使用 seq 及 expr

例如:

for i in `seq 0 6`; do \
HNum=`expr $i '*' 7 '+' ${1} \
VNum=`expr $i + 1` \
echo "the virtual machine ${VNum} is on {HNum}th physical machine" \
done

真實案例: 啟動/關閉 所有機器

cat startall.sh
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 的機器上,以各位學號為名的資料夾已經創建好。

scp [作業] std056@172.16.16.155:/home/std056/shellhw/[你的學號]/

要查看、處理自己已經交的檔案

ssh std056@172.16.16.155 "ls /home/std056/shellhw/[你的學號]
ssh std056@172.16.16.155 "[指令] /home/std056/shellhw/[你的學號]/[檔案]{之類的}"

新增ssh連線

因為用vnc寫腳本解析度太差,

可選用std056帳號的ssh 連線,

需將自己機器的std056帳號的密碼改成[那個密碼](如果你之前用自己的密碼)

ssh 連線會在關閉視窗時掉線(目前的buffer會找不回來) ,請勤加存檔小心使用。

Perl

查看perl 版本 (檢查是否可使用)

/usr/bin/perl -v
cat sample.pl
#!/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") ;