Thứ Ba, 8 tháng 7, 2014

Hướng dẫn sử dụng tmux

Tmux là một trình quản lý terminal hiệu quả. Ưu điểm:
  • Cho phép quản lý cùng lúc nhiều terminal
  • Detach/attach terminal, nhờ vậy bạn có thể lấy lại được terminal đã bị mất trong khi kết nối ssh đột ngột bị ngắt.
  • Cho phép tạo nhiều window trong một tmux session. Trong mỗi window, bạn lại có thể tạo ra nhiều pane. Pane sẽ chia nhỏ một window ra nhiều vùng theo chiều dọc hoặc chiều ngang
  • Cho phép đặt tên cho session và từng window trong session

Bài viết này chỉ hướng dẫn cách sử dụng

Để tmux nhận command, nó cần một prefix key. Mặc định prefix key này là Ctrl + b. Tôi có thể cấu hình prefix của tmux trong ~/.tmux.conf

set -g prefix C-a ### dùng ctrl + a làm phím prefix
unbind C-b
bind C-a send-prefix


Để khởi động tmux, tôi chỉ cần gõ tmux. Sau đây, tôi sẽ liệt kê một số command cần thiết: 

Các command bắt đầu bằng C-a (Ctrl + a) chỉ có tác dụng nếu tôi đang ở trong một tmux:
C-a s: Danh sách các tmux session 
C-a d: Detach tmux session hiện tại
C-a $: Đặt tên cho session hiện tại
C-a c: Tạo mới window
C-a w: Danh sách các window
C-a ,: Đặt tên cho window hiện tại
C-a &: Kill window hiện tại

exit: Thoát và kill window hiện tại

C-a %: Chia đôi window hiện tại thành hai pane theo chiều dọc
C-a ": Chia đôi window hiện tại thành hai pane theo chiều ngang
C-a [arrow key]: Di chuyển qua lại giữa các pane trên window
Chia pane rất tiện dụng khi vừa chạy chương trìn, vừa xem log của chương trình. 
C-a x: Kill pane hiện tại.

Copy paste giữa các window hoặc pane

C-a [  để vào copy mode. Dùng C -spacebar để bôi đen vùng. Dùng arrow key để di chuyển lên xuống, trái phải. Dùng Alt + w để copy. Cuối cùng dùng C-a ] để paste vào một window hoặc pane khác.

Các command sau sẽ có tác dụng khi tôi ở ngoài tmux session:
tmux list-sessions: Danh sách các tmux session.
tmux attach -t <sessionname>: Session name có thể lấy từ kết quả chạy lệnh tmux list-sessions. Bạn có thể attach lại tmux terminal qua session name
tmux kill-session -t <sessionname>: Kill một session xác định
tmux kill-server: Kill tất cả tmux session

Chủ Nhật, 6 tháng 7, 2014

Copy dữ liệu lên/từ server qua ssh

Với một system admin đây là hoạt động rất hay gặp. Để thực hiện được bạn có hai cách:
- Dùng scp
- Dùng rsync qua ssh

Cách 1: Tôi dùng scp
Copy lên server
scp <username>@<server ip>:/home/<username> <file>

Copy từ server về thư mục hiện tại
scp <username>@<server ip>:/home/<username>/<file> .

Cách 2: Tôi dùng rsync qua ssh
Copy lên server
rsync -avz <file> -e "ssh -l <username>" <server ip>:/home/<username>

Copy từ server về thư mục hiện tại
rsync -avz -e "ssh -l <username>" <server ip>:/home/<username>/<file> .

Thứ Bảy, 5 tháng 7, 2014

Truy cập nội dung file iso

Trên windows, tôi có thể dùng một số tool như power iso để ảo hóa file iso thành một ổ đĩa gắn ngoài. Ý tưởng tương tự cũng được hiện thực hóa trên linux. Tôi sẽ ảo hóa iso thành một loop device và gắn loop device đó vào một mount point trên hệ thống. Cuối cùng tôi truy cập nội dung file iso qua chính mount point đó.

sudo mount -o loop file.iso /mnt

Điều chỉnh giới hạn PID trên hệ thống

Mặc định, linux dành 15 bits cho PID. Do đó giới hạn của PID sẽ là 0..2^15 -1= 0..32767 PIDs

Để điều chỉnh thông số này, tôi thay đổi giá trị trong file:
/proc/sys/kernel/pid_max

Có hai cách để thay đổi giá trị này:

Cách 1: Bổ sung thêm một dòng vào /etc/sysctl.conf
kernel.pid_max=<Giá trị mới>
Save lại, sau đó để thay đổi được ấn định tôi dùng lệnh
sysctl -p

Cách 2: Sửa trực tiếp giá trị vào trong file /proc/sys/kernel/pid_max
Sau đó ấn định thay đổi bằng lệnh 
sysctl -p

Tôi có thể xác nhận thay đổi cho cả hai cách trên qua:

systcl kernel.pid_max
hoặc
cat /proc/sys/kernel/pid_max

Tính số CPU và số core của mỗi CPU

Để tính số CPU, tôi sẽ tìm trong file /proc/cpuinfo. Mỗi CPU sẽ được gán cho một physical id khác nhau. Tính số lượng physical id phân biệt sẽ ra số CPU

sudo cat /proc/cpuinfo | grep "physical id" | sort | uniq
physical id    : 0 -> Kết quả này cho thấy hệ thống chỉ có một CPU

Để tính số core của mỗi CPU, tôi cũng tìm trong /proc/cpuinfo. Các core của cùng một CPU sẽ có số physical id giống nhau. Thống kê số lượng physical id trên mỗi CPU sẽ cho ra số core của mỗi CPU

sudo cat /proc/cpuinfo | grep  "physical id" | sort | uniq -c
4 physical id    : 0 -> Kết quả này cho thấy CPU có physical id 0 có 4 cores.

Thứ Năm, 3 tháng 7, 2014

Lấy thông tin đĩa cứng

Các thông tin tôi có thể lấy:
- Đĩa cứng hiện tại có tổng dung lượng bao nhiêu ?
- Đĩa được hiện tại phân vùng thế nào ?
Tôi dùng lệnh sau:
sudo fdisk -l

Để biết chi tiết file system type và mức độ sử dụng dung lượng của từng phân vùng trên đĩa cứng hiện tại ? Tôi dùng lệnh sau:
df -Th

Muốn lấy thông tin chi tiết về phân vùng của đĩa cứng khác, tôi phải mount đĩa cứng đó lên một mountpoint của đĩa cứng hiện tại
sudo mount -t ext3 /dev/sdb /mnt

Kiểm tra đĩa cứng đã được mount chưa, tôi dùng lệnh:
mount

Di chuyển vào mountpoint và chạy lần lượt hai lệnh fdisk -l và df -T để lấy thông tin về đĩa cứng được mount

Sau khi hoàn thành công việc trên /dev/sdb, tôi cần unmount nó khỏi hệ thống:
sudo umount /mnt 
hoặc
sudo umount /dev/sdb

Chủ Nhật, 29 tháng 6, 2014

Cấu hình named based virtual host và ip based virtual host

Named based virtual host: Một apache server cho phép host nhiều website có domain name khác nhau trên cùng một IP. Name based virtual host được sử dụng để cung cấp shared hosting.

IP based virtual host: Một apache server cho phép host nhiều website có domain khác nhau trên các IP khác nhau.

Cấu hình named based virtual host:

Chuẩn bị
<ServerRoot>/public_html/namebased/web1/index.html
               <html><body><h1>Name based: Website 1</h1></body></html>
<ServerRoot>/public_html/namebased/web2/index.html
               <html><body><h1>Name based: Website 2</h1></body></html>
<ServerRoot> là thư mục trỏ đến thư mục cài đặt của apache, trực tiếp chứa các thư mục con như conf, bin...
  
Apache server nằm trên một máy tính có IP được gán trên một interface là 192.168.56.1

Cấu hình để apache server host hai website kể trên:
vi <ServerRoot>/conf/httpd.conf

Listen 8080

<VirtualHost 192.168.56.1:8080>
   ServerName web1.namebased.example.com
   ServerAlias web1 web1.example.com  
   ServerAlias *.web1.namebased.example.com
   DocumentRoot <ServerRoot>/public_html/namebased/web1/
</VirtualHost>

<VirtualHost 192.168.56.1:8080>
   ServerName web2.namebased.example.com
   DocumentRoot <ServerRoot>/public_html/namebased/web2/
</VirtualHost>

Nguyên tắc chung của apache (đúng với cả name based và ip based virtualhost) sẽ là:
  • Tìm virtual host nào có ip:port phù hợp nhất. Nếu không có virtual host phù hợp thì apache sẽ đọc global server config để phục vụ. (Kiểm tra điều này bằng cách thay đổi tham số ip:port của từng virtualhost ví dụ chuyển hết về thành 192.168.56.1:80)
  • Tiếp đến, tìm virtual host có ServerName hoặc ServerAlias khớp với host header của request đến apache. Nếu không tìm thấy thì apache sẽ dùng default virtual host (Là virtual host đầu tiên khớp ip:port). Nếu tìm thấy nhiều hơn một virtual host có ServerName hoặc ServerAlias khớp thì apache dùng virtual host khớp đầu tiên  
Cấu hình IP based virtual host:

Chuẩn bị
<ServerRoot>/public_html/ipbased/web1/index.html
               <html><body><h1>IP based: Website 1</h1></body></html>
<ServerRoot>/public_html/ipbased/web2/index.html
               <html><body><h1>IP based: Website 2</h1></body></html>

Mỗi website khi này cần các IP khác nhau. Tôi không muốn mua thêm NIC (Network Interface Card). Tôi sẽ cấu hình IP alias trên một interface để tăng số IP gán trên interface này.
sudo ifconfig vboxnet0:0 192.168.56.2 up

Kiểm tra lại bằng ifconfig, bạn sẽ thấy có một alias IP 192.168.56.2 gán trên sub interface vboxnet0:0

Để hủy IP alias, bạn dùng:
sudo ifconfig vboxnet0:0 192.168.56.2 down

Cấu hình để apache server host hai website kể trên:
vi <ServerRoot>/conf/httpd.conf

Listen 80

<VirtualHost 192.168.56.1:80>
   ServerName web1.ipbased.example.com
   DocumentRoot <ServerRoot>/public_html/ipbased/web1/
</VirtualHost>

<VirtualHost 192.168.56.2:80>
   ServerName web2.ipbased.example.com
   DocumentRoot <ServerRoot>/public_html/ipbased/web2/
</VirtualHost>

Chú ý:
  • Apache có thể lắng nghe dịch vụ trên nhiều interface và nhiều port đồng thời.
  • Bạn có thể cấu hình /etc/hosts để browser của bạn có thể phân giải tên miền mà không cần đến DNS.

Thứ Bảy, 28 tháng 6, 2014

Tìm processname từ PID và tìm PID từ processname

Từ processname, bạn có thể tìm pid theo command sau:
pidof <processname>

Có thể có nhiều kết quả trả về, ví dụ khi tôi gõ
pidof httpd
Tôi nhận được chừng 5-6 kết quả đó là vì httpd process fork thêm nhiều child process. 

Từ pid, bạn có thể tìm ra procesname bằng một trong hai cách:
Cách 1: Dùng command
sudo ps -p <PID> -o comm=

Cách 2: Truy vấn đến /proc
cat /proc/<PID>/cmdline 

PID luôn map đến một process duy nhất nên kết quả trả về luôn chỉ có một

Flush cache của varnish

Flush hay clear cache của varnish được thực hiện qua tool varnishadm. Trong varnish, hành động này gọi là "ban" để làm cho cache trở nên invalidate. Varnish có lắng nghe trên một port mặc định 6082 (Xem trong /etc/default/varnish) để nhận các yêu cầu quản trị.

Trước hết vi /etc/default/varnish để chắc chắn về interface quản trị của varnish

######################
 DAEMON_OPTS="-a :80 \
               -T localhost:6082 \
               -f /etc/varnish/default.vcl \
               -S /etc/varnish/secret \
               -s malloc,256m"
######################


Chắc chắn interface là localhost:6082, tôi tiến hành connect theo command sau:
sudo varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret

Sau đó tại dấu nhắc bạn gõ dòng sau để invalidate response cho request URL:
varnish> ban.url <URL>

Ví dụ:
ban.url /index.html

Thứ Ba, 24 tháng 6, 2014

Chia sẻ giữa virtualbox host machine và guest machine

Host machine là máy thật
Guest machine là máy ảo

Để chia sẻ dữ liệu giữa host machine và một linux guest machine, trước hết bạn thiết lập shared folder trên host machine. Sau đó trong guest machine bạn thực hiện gắn shared folder vào một mount point trên guest machine.

sudo mount -t vboxsf <shared folder> <mount point>

Để chia sẻ dữ liệu giữa host machine và một windows guest machine, bạn cũng thiết lập shared folder trên host machine. Sau đó trong guest machine bạn thiết lập dòng lệnh sau trong command line prompt

net use x: \\vboxsvr\<shared folder>

Một ổ đĩa mạng sẽ xuất hiện trên windows guest machine để chia sẻ dữ liệu.


Lọc đoạn văn bản từ dòng line1 đến dòng line2

Để lọc một đoạn văn bản theo dòng line1 đến dòng line2, bạn cần kết hợp hai lệnh head và tail.

line = line2 - line1 + 1
head -n line2 filename | tail -n line

Chủ Nhật, 22 tháng 6, 2014

Bước đầu triển khai varnish - Cơ bản

Varnish là một reverse HTTP proxy nằm trước một web server để thực hiện caching data cho web server. Tutorial này tập trung vào việc triển khai varnish trên debian Ubuntu. Varnish sẽ làm reverse proxy cho apache server.

Tìm và cài đặt theo hướng dẫn tại đây: 
https://www.varnish-cache.org/installation/debian

wget http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb http://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install varnish


Cấu hình varnish

sudo vi /etc/default/varnish
Uncomment các dòng thuộc tùy chọn "DAEMON_OPTS" thuộc Alternative 2:
DAEMON_OPTS="-a :80 \
               -T localhost:6082 \

               -f /etc/varnish/default.vcl \
               -S /etc/varnish/secret \
               -s malloc,256m"


Dòng trên cho biết varnish service sẽ lắng nghe trên port 80. Thông số cấu hình cho varnish biết nó làm reverse cho service nào nằm trong hồ sơ /etc/varnish/default.vcl


sudo vi /etc/varnish/default.vcl
Nếu file chưa có thì bổ sung:
backend default {
     .host = "127.0.0.1";
     .port = "8080";
}
Những dòng trên cho biết varnish sẽ làm reverse proxy cho web service trên port 8080

Cấu hình apache
Chỉnh sửa trong httpd.conf

Listen 127.0.0.1:8080

Sau đó restart httpd và varnishd. 

Chú ý: Varnish sẽ không cache các http request có trường cookie nên cần xóa cookie của trình duyệt trước khi kiểm tra varnish.

Cập nhật dữ liệu index cho locate

Tất cả thông tin file/directory trên hệ thống của bạn đều có thể tìm thấy qua lệnh locate. Lệnh locate thực hiện tìm kiếm qua index database nên tốc độ nhanh hơn nhiều so với find nhưng hạn chế của nó là index database có thể đã bị lỗi thời (out-of-date). Chính vì lý do bạn cần cập nhật dữ liệu locate trước khi tìm kiếm.

Cập nhật index cho locate:
updatedb

Đánh index cho apropos

apropos tương đương với man -k dùng để tìm kiếm thông tin về một ứng dụng. Nếu trên hệ thống chưa có dữ liệu index thì apropos hay man -k đều không thể hiển thị thông tin.

Thực hiện đánh index cho apropos:
makewhatis

Tải package từ external repositories

Ngoài official repositories của ubuntu, trên thế giới còn nhiều repositories khác nữa như ppa...Đôi khi package bạn cần không thể tìm thấy trên official repositories của ubuntu, bạn có hai lựa chọn: Một là biên dịch và cài từ source code. Cách này đôi khi khá vất vả vì vấn đề dependencies và tương thích. Hai là tìm và tải package từ một external repositories. Trong tutorial này, tôi viết về cách thứ hai.

Ví dụ tôi muốn tải phần mềm movgrab - một chương trình download video từ các trang chia sẻ nhưng tôi không tìm thấy trên ubuntu official. Tôi tìm kiếm đoạn ppa của movgrab từ http://www.webupd8.org/2012/02/movgrab-command-line-video-downloader.html

sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install movgrab

Tất cả các repository bao gồm official, external third party repositories của ubuntu đều nằm trong /etc/apt/sources.list và /etc/apt/sources.list.d/ Lệnh add-apt-repository chỉ thực hiện thêm một cặp entry deb và deb-src vào trong file /etc/apt/sources.list hoặc một file nằm trong thư mục /etc/apt/sources.list.d/ 

Kết quả của câu lệnh sudo add-apt-repository ppa:nilarimogard/webupd8
sẽ tạo ra file /etc/apt/sources.list.d/nilarimogard-webupd8-precise.list chứa cặp entry:
deb http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu precise main
deb-src http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu precise main


Thay vì chạy lệnh add-apt-repository, bạn có thể chỉnh sửa file /etc/apt/sources.list, điền vào cặp entry deb và deb-src. Tôi từng tải ultramonkey theo cách này. Tôi tìm thấy thông tin deb và deb-src cho ultramonkey
từ http://www.ultramonkey.org/3/installation-debian.sarge.html Tôi bổ sung cặp entry vào cuối /etc/apt/sources.list
deb http://www.ultramonkey.org/download/3/ sarge main
deb-src http://www.ultramonkey.org/download/3 sarge main

Sau đó update repo và tải:
sudo apt-get update
sudo apt-get install ultramonkey

Tải video từ facebook, youtube và các trang chia sẻ khác

Trên linux có một phần mềm download video rất tuyệt vời viết bằng python có tên là youtube-dl. Không như tên gọi, nó không chỉ giúp bạn download video từ youtube mà còn từ facebook và nhiều trang chia sẻ video khác nữa.

Tải youtube-dl từ repositories:
sudo apt-get install youtube-dl

Phần mềm này vẫn được upgrade thường xuyên để thích nghi với nhiều trang chia sẻ video. Để upgrade, bạn chỉ việc chạy lại câu lệnh trên.

Cách download video cũng rất đơn giản:
youtube-dl "<URL>"

Thứ Bảy, 21 tháng 6, 2014

Mirror site dùng rsync - Phần 2

Ở phần trước tôi đã trình bày cách đồng bộ bằng rsync nhưng theo cách thủ công. Bạn không thể hàng phút lại gõ và chạy câu lệnh đó được. Để tự động hóa bạn chỉ cần đặt lịch chạy command. Crontab là ứng dụng đặt lịch phổ biến trên linux. 

Điều chỉnh hồ sơ crontab:
crontab -e

Bổ sung vào cuối hồ sơ:
*/1 * * * * /usr/bin/rsync -avz --delete /usr/local/apache2/htdocs/test/ -e "ssh -i <path to private file>" test@192.168.56.250:/var/www/test/

Ở đây tôi đặt lịch command sau mỗi phút.

Bạn mở syslog:
tail -f /var/log/syslog

Đợi một phút sau thấy log bắn ra thông báo cronjob đã được thực hiện nhưng thực tế là không có gì được đồng bộ cả. Lý do cho hiện tượng này là cron không biết gì về ssh-agent nên nó không thể nói chuyện với ssh-agent được, ssh-agent lại là thành phần quản lý private key, không có private key đồng nghĩa key based authentication không thể hoàn tất.

Để giải quyết vấn đề này, bạn dùng keychain. 
sudo apt-get install keychain

Keychain sẽ cho phép dùng lại ssh-agent và giúp cron nói chuyện được với ssh-agent. Trước tiên cần chạy keychain để nó nhận biết ssh-agent đang hoạt động.
keychain --nogui <path to private key>

Kết quả của lệnh trên là một file $HOME/.keychain/$HOSTNAME-sh được tạo ra. File này chứa hầu hết nội dung của output ssh-agent -s

Cuối cùng bạn chèn thêm vào cronjob một đoạn trỏ đến $HOME/.keychain/$HOSTNAME-sh
*/1 * * * * . $HOME/.keychain/$HOSTNAME-sh; /usr/bin/rsync -avz --delete /usr/local/apache2/htdocs/test/ -e "ssh -i <path to private file>" test@192.168.56.250:/var/www/test/

Chỉnh sửa hồ sơ crontab không yêu cầu restart cron service. Bạn chỉ cần đợi tiếp một phút để thấy kết quả như ý muốn.

Tham khảo: http://www.howtoforge.com/mirroring_with_rsync

Mirror site dùng rsync - Phần 1

rsync là một công cụ đồng bộ trên linux. Công cụ này hỗ trợ đồng bộ chỉ những sai biệt giữa hai directory và cho phép nén dữ liệu khi truyền qua network nên rất tối ưu cho băng thông. Tuy nhiên, các tiện ích xác định sai biệt và nén dữ liệu của nó có thể làm tăng CPU load.

Dữ liệu được truyền đi giữa hai site nằm trên hai máy khác nhau:
192.168.56.1: máy nguồn, /usr/local/apache2/htdocs/test, thư mục nguồn.
192.168.56.250: máy đích, /var/www/test, thư mục đích.

Dữ liệu sẽ được truyền qua tunnel giữa hai máy để đảm bảo tính an toàn. Tôi sẽ thiết lập một
openssh-client trên 192.168.56.1 
openssh-server trên 192.168.56.250
Phương thức xác thực là key based authentication. Cách thiết lập tôi đã có một bài viết nên ở đây tôi sẽ không viết lại.

Thực hiện lệnh trên 192.168.56.1
rsync -avz --delete /usr/local/apache2/htdocs/test -e "ssh -i <path to private file>" test@192.168.56.250:/var/www/test

-a: archive mode
-v: verbose
-z: compress
--delete: chỉ đồng bộ sai biệt giữa hai thư mục nguồn và đích
-e: mở ra một remote shell để đẩy dữ liệu lên qua tunnel ssh

Kết quả câu lệnh sẽ đồng bộ toàn bộ file/dir trong /usr/local/apache2/htdocs/test trên 192.168.56.1 lên /var/www/test trên 192.168.56.250. Chú ý cấp quyền đọc ghi cho user test lên thưc mục /var/www/test.

Tham khảo: http://www.howtoforge.com/mirroring_with_rsync

Shell script: Xem status của câu lệnh trước đó

Để xem status của câu lệnh trước đó, bạn dùng
echo $?

Shell script: Ứng dụng cú pháp logic

Cú pháp logic:
cm1||cmd2: chỉ duy nhất một trong hai cmd được thực hiện cho status = 0. Vì command sau chỉ hoạt động nếu command trước trả về status != 0.
cmd1&&cmd2: đảm bảo cả hai cmd đều được thực hiện cho status = 0. Vì command sau chỉ hoạt động nếu command trước trả về status = 0

Trên linux, mỗi một cmd được thực hiện đều trả về một status. Status == 0 là lệnh thực hiện thành công. Status != 0 là lệnh thực hiện không thành công.

Ví dụ:

ls /tmp/testing||mkdir /tmp/testing
In ra directory /tmp/testing nếu nó tồn tại, nếu không thì tạo dierctory đó.

[ -f /tmp/test ]&&echo "File is exist"||echo "File is not exists"
Kiểm tra /tmp/test có tồn tại hay không. Nếu tồn tại, status trả về 0, chạy tiếp lệnh echo "File is exists", status tiếp tục trả về 0 làm cho command cuối không thực hiệnđược
Nếu /tmp/test không tồn tại, status trả về khác 0, câu lệnh thứ hai không thực hiện được, tiếp đến câu lệnh cuối thực hiện được vì status hiện thời đang là != 0. 

Shell script: Xác định pid của shell hiện tại và shell cha

Để xem pid của shell hiện tại:
echo $$

Để xem pid của shell cha:
echo $PPID

Trường hợp bạn mở một tty mới thì một login shell /bin/login sẽ được mở ra. Login shell này sẽ tạo ra shell con, là shell mà bạn thao tác.

Trường hợp bạn mở một pts mới thì một shell sẽ được mở ra. Đây là shell bạn thao tác. Shell này có cha là gnome-terminal (Trên các distro khác nhau thì shell này sẽ khác nhau)


Tiến trình khởi động một terminal

Việc khởi tạo một termial trong linux trải qua rất nhiều bước. Bình thường, trong chế độ đồ họa, terminal của bạn là tty7. Terminal bạn mở trong tty7 đều là pts (terminal giả lập). Để mở thêm terminal mới, bạn nhấn tổ hợp phím CTRL + ALT + F(1-6). Bạn có thể mở tối đa thêm 6 terminal nữa.

Thứ tự các file khi khởi chạy terminal:
/etc/issue: Thông tin trước khi đăng nhập về phiên bản hệ điều hành, hostname...
/etc/motd: Thông tin sau khi đăng nhập thành công
Khi một terminal được mở, một shell sẽ được khởi tạo:
/etc/profile: Đây là file mà tất cả các shell sẽ phải chạy
~/.bashrc: Đây là file ẩn của mỗi user. Tùy vào bạn đang login vào user nào thì file ~/.bashrc của user đó sẽ được khởi chạy

Từ tiến trình trên, có thể thấy để can thiệp vào quá trình khởi tạo shell, bạn có thể chỉnh sửa /etc/profile hoặc ~/.bashrc

Thứ Năm, 19 tháng 6, 2014

Cấu hình ssh key based authentication

Để đăng nhập từ xa vào một server qua ssh bạn có hai cách để xác thực:
- passwd based
- key based

Với passwd based, bạn cần phải ghi nhớ passwd. SSH là giao thức an toàn nên bạn không lo passwd bị truyền clear text qua network

Với key based, bạn không cần passwd, thay vì passwd bạn sẽ dùng một cặp public và private key để truyền thông giữa client và server. Client sẽ giữ private key và mã hóa thông điệp còn public key sẽ nằm trên server dùng để giải mã thông điệp

Các bước thực hiện

Tại client:
Tạo một cặp private và public key. PKI có hai loại giải thuật chính là rsa và dsa. Hiện tại dsa được sử dụng phổ biến hơn.
ssh-keygen -b 1024 -t dsa

Một cặp id_dsa và id_dsa.pub được tạo ra. Bạn cất giữ id_dsa trong ~/.ssh
 và set quyền truy cập đến ~/.ssh/id_dsa là 400 còn thư mục ~/.ssh bạn set quyền 700

Vì private key được quản lý bởi ssh-agent, bạn cần add private key vào ssh-agent. Thông thường ssh-agent sẽ tự nhận diện nhưng không phải luôn luôn được như ý.
ssh-add <path to private key>

Tiếp đến đẩy id_dsa.pub lên server dùng scp (ở bước này, bạn đăng nhập vào server dùng passwd based ssh)
scp id_dsa.pub <user>@<server ip>:/home/<user>/

Trên server:
Tạo trên server thư mục /home/<user>/.ssh có chứa file authorized_key
Thư mục .ssh này cũng set quyền 700
Nối tiếp nội dung file id_dsa.pub vào authorized_key:
cat id_dsa.pub >> /home/<user>/.ssh/authorized_key
File authorized_key bạn set quyền 600

Điều chỉnh trong ssh config: /etc/ssh/sshd_config

Bỏ comment  các dòng sau:
RSAAuthentication yes
PubKeyAuthentication yes
AuthorizedKeysFile /home/<user>/.ssh/authorized_key

Cuối cùng restart lại ssh server

Truy cập từ  xa qua ssh:
ssh -vv <user>@<server ip>

Xóa file theo inode

Thực sự linux có hỗ trợ xóa file rồi. Lý do bạn cần dùng đến biện pháp xóa file theo inode vì đôi khi một số file có tên quá đặc biệt, đặc biệt đến nỗi khi truyền vào cú pháp rm -f <filename> Linux không thể cắt nghĩa được.

Để giải quyết tình huống này, bạn tìm xem inode number của file
ls -il | grep <filename>

Sau đó
find . -inum <inode number> -exec rm -f {} \;

Thứ Ba, 17 tháng 6, 2014

Lấy thông tin date theo định dạng cho trước

Để lấy thông tin date trong linux theo định dạng cho trước:

date +"%d-%m-%Y"

Chú ý có dấu cách giữa dấu cộng và date

Xóa package đã được cài đặt

Để xóa package đã được cài đặt bạn dùng syntax:

sudo apt-get remove <package>
Loại bỏ package nhưng giữ lại dependencies

sudo apt-get autoremove --purge <package>
Loại bỏ package cùng dependencies và các file cấu hình

Lấy thông tin về package đã được cài đặt

Có syntax sau rất thuận tiện để thu thập thông tin về một package đã được cài đặt:

dpkg -s <packagename>
Trả về version và các dependencies của package

dpkg -S <filename>
Cho biết file này thuộc package nào và đường dẫn đầy đủ đến chính file đó.

Xác định liệu một package đã được cài đặt hay chưa ?

Kỹ thuật này cho phép kiểm tra xem liệu một package đã được cài đặt trong hệ thống chưa:

dpkg -l | grep <package>

Tìm, tải và cài đặt một package trong debian linux

Bài viết này áp dụng cho linux distro debian:

Đầu tiên, bạn update lại repositories
sudo apt-get update

Sau đó tìm package trong repositories
sudo apt-cache search ^heartbeat

apt-cache có hỗ trợ tìm kiếm dùng regex pattern. Ở trên tôi tìm tất cả các package có bắt đầu bằng cụm từ heartbeat.

Tiếp đến bạn tải và cài đặt package:
sudo apt-get install <packagename>

Trường hợp bạn gặp broken dependencies, bạn có thể dùng syntax sau:
sudo apt-get -f install <packagename>

Linux - Thực hiện download package có hỗ trợ resume

Ngay trong linux, có một ứng dụng có tên wget cho phép bạn download package cho phép resume. Resume là chế độ cho phép bạn tiếp tục download package tính từ mốc dung lượng đã download được trước đó. Tính năng này rất tiện. Thay vì, bạn cần đợi chờ download hết một package có dung lượng lớn thì bạn có thể download từng phần trong nhiều ngày vào những thời điểm tiện lợi nhất.

Wget còn là một non-interactive download manager. Bạn có thể logout khỏi tài khoản, miễn là chưa tắt máy thì tiến trình download vẫn cứ tiếp diễn. Tiến trình khi đó tiếp diễn trong chế độ background.

Giờ là syntax của mã lệnh:
wget -c <URL download package>

Để stop một wget process đang chạy chế độ background, bạn có thể dùng syntax:
sudo pkill -9 wget