Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

13 tháng 11, 2012

Sử dụng kết nối SSL/TLS trên java với các self-certificate

Vấn đề này tôi gặp phải khi viết một unitest cho kết nối imaps tới một server sử dụng self-certificate. Mọi nỗ lực kết nối tới server tôi đều gặp lỗi java phàn nàn về việc kết nối sử dụng một certificate không đáng tin - "untrusted certificate". Câu hỏi đặt ra ở đây là làm thế nào để ép java tiếp tục sử dụng kết nối này?
Nếu bạn để ý mỗi khi bạn dùng trình duyệt để kết nối tới một địa chỉ dạng https:// nào đó bạn có thể nhận được thông báo về việc đây là một kết nối không đáng tin, nếu bạn tin tưởng nó thì có thể thêm ngoại lệ này vào trình duyệt. Và đây cũng là ý tưởng để tôi giải quyết vấn đề này, đó là tôi cần phải tìm cách để java sẽ tự động thêm certificate này vào kho lưu trữ của mình hoặc đánh lừa java để nó luôn luôn tin tưởng vào certificate này.
Cách làm như sau:
  • Trước khi mở kết nối tôi cho java chạy qua hàm sau:
    private static void disableUntrustedComplain(){
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers(){
                        return null;
                    }
                   
                    public void checkClientTrusted(X509Certificate[] certs, String authType){}
                   
                    public void checkServerTrusted(X509Certificate[] certs, String authType){}
                }
            };
            try{
                SSLContext sc = SSLContext.getInstance("TLS");//SSL nếu sử dụng mã hóa SSL.
                sc.init(null, trustAllCerts, new SecureRandom());
                SSLContext.setDefault(sc);
                System.out.println("disabled");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
  •  Hàm này có tác dụng giúp java bỏ qua các complaining về untrusted certificate
  • Sau khi chạy hàm này chúng ta có thể thoải mái kết nối tới bất kỳ một kết nối nào sử dụng SSL/TLS.
Vui lòng xem thêm tại đây để tham khảo:http://abhinavasblog.blogspot.com/2011/07/allow-untrusted-certificate-for-https.html 
UPDATE:
    Gần đây tôi có làm việc với các kết nối liên quan tới giao thức XMPP (cụ thể là với Openfire) thì thấy cần phải sửa đoạn code trên một chút thì mới chạy được (Lưu ý là chỉ áp dụng với Openfire thôi nhé).
    Khi xử lý kết nối với Openfire sử dụng các self-certificate, mặc dù tôi sử dụng hàm ở phía trên nhưng vẫn bị dính lỗi PKIX không tin tưởng certificate. Để xử lý lỗi này tôi làm như sau:
Khi khởi tạo kết nối tới server XMPP tôi thêm thông tin cấu hình như sau:
SSLContext sc = disableUntrustedComplain();
        ConnectionConfiguration cc = new ConnectionConfiguration("mydomain.com", 5222);
        cc.setCustomSSLContext(sc);
        XMPPConnection connection = new XMPPTCPConnection(cc);
Trong đó có một số điểm lưu ý:
  • Hàm disableUntrustedComplain tôi trả về một giá trị thay vì sử dụng void như ở trên.
    Hàm này nội dung sẽ như sau:
    private static SSLContext disableUntrustedComplain(){
            SSLContext sc = null;
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {

                    @Override
                    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {

                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                }
            };
            //install the all-trusting trust manager
            try {
                sc = SSLContext.getInstance("TLS");//TLS or SSL
                sc.init(null, trustAllCerts, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                SSLContext.setDefault(sc);
                System.out.println("disable");
            } catch(NoSuchAlgorithmException naex){
                naex.printStackTrace();
            }catch(KeyManagementException kmex){
                kmex.printStackTrace();
            }finally{
                return sc;
            }
        }

Các tham số mạng quan trọng trên Linux

Thực ra tôi không biết nên đặt tiêu đề cho bài viết này là gì cho hợp lý. Thôi thì cứ đặt tạm một cái tên, sau đó sẽ suy nghĩ sau này nên đặt lại như thế nào.

Bài viết này tôi sẽ giải thích cho các bạn một số tham số có liên quan tới mạng trên hệđiều hành Linux (ởđây tôi sẽ lấy vídụ vơi hệđiều hànhUbuntu.

1 - Tham số somaxconn

     Tham số này bạn có thể xem bằng lệnh: cat /proc/sys/net/core/somaxconn
    Giá trị mặc định của nó là 128
    Tham số này định nghĩa giá trị tối đa cho hàng đợi socket của hệ điều hành. Tức là với mỗi một kết nối thành công tới hệ thống thì tham số này sẽ tự động giảm đi 1 và ngược lại khi kết nối được giải phóng. Nếu số kết nối chiếm hết 128 thì các kết nối sau sẽ bị từ chối.
    Để thay đổi tham số này ta có 2 cách:
    Đổi tạm thời trong phiên làm việc hiện tại: echo 256 > /proc/sys/net/core/somaxconn
    Đổi tham số này vĩnh viễn: sysctl -w net.core.somaxconn=1024

2 - netdev_max_backlog:

    Định nghĩa số gói và hàng đợi tối đa được áp dụng cho các thiết bị non-NAPI được cache lại trong trường hợp kernel không kịp xử lý.
    Giá trị mặc định là 1000
    Để thay đổi tham số này ta có 2 cách:
    Đổi tạm thời trong phiên làm việc hiện tại: echo 256 > /proc/sys/net/core/netdev_max_backlog
    Đổi tham số này vĩnh viễn: sysctl -w net.core.netdev_max_backlog=1024

26 tháng 10, 2012

Các tiện ích của Postfix

Trong bài viết này tôi sẽ hướng dẫn những người quản trị hệ thống mail Postfix sử dụng một số tiện ích sẵn có của Postfix.
1 - Kiểm tra nội dung các thư đang nằm trong queue của Postfix.
  • Trong postfix, các hàng đợi bao gồm: Active, Deferred, defer, bounced,... Mỗi hàng đợi tương ứng với một thư mục trong thư mục Data của postfix.
  • Trong mỗi hàng đợi, các thư được lưu theo cấu trúc như sau:
    - Mỗi thư có một ID riêng.
    - Thư có ID bắt đầu bằng ký tự nào thì sẽ được phân bố trong thư mục có tên là kí tự đó. Ví dụ, thư có ID 000115A0B99 đang bị deffered sẽ nằm trong thư mục /deffered/0/
  • Để xem nôi dung của một thư trong hàng đợi ta làm như sau:
    Bằng quyền root ta chạy lệnh /opt/postfix/sbin/postcat -q /opt/postfix/spool/deferred/0/00115A0B99.
    Lưu ý đường dẫn thực tế tới các file có thể thay đổi tùy theo môi trường cài đặt của người dung.
2 - Xóa các thư chỉ định trong hàng đợi.
Lệnh:
mailq | grep Luat_xoa | awk '{print $1}' | tr -d'*' | sudo /opt/postfix/sbin/postsuper -d -
Lưu ý đường dẫn thực tế có thể thay đổi tùy theo môi trường cài đặt của người dùng.
Xin tham khảo thêm các tham số của lệnh mailq và postsuper để có những lệnh phù hơp.
3 - Đếm số lượng thư trong một hàng đợi
Lệnh:
find /var/spool/postfix/deferred -type f -print | wc -l
Trong đó:
  • deferred: là tên hàng đợi thư trong postfix.
  • find: lệnh tìm kiếm.
  • wc -l: đếm số dòng trong kết quả hiện ra của lệnh find.
4 - Xóa thư trong hàng đợi chỉ định:
Lệnh:
postsuper -d ALL tên_hàng_đợi
Hàng đợi có thể là: deferred, incoming, active, bounce,...
5 - Thay đổi thời gian thử lại thư không thể gửi được.
Ta điều chỉnh tham số bounce_queue_lifetime.
Đơn vị tính là d - day, h - hour, w - week, s - second, m - minute

17 tháng 10, 2012

Sử dụng applet trong Ubuntu

Bài này được tôi rút từ kinh nghiệm thực tế. Tôi đã thử sử dụng icedtea plugin nhưng có vẻ là không ăn thua. Tôi đã thử trên Firefox, chưa thử trên Chromium nhưng có thể vẫn đúng, bạn nên thử nếu có nhu cầu. Và bài viết này tôi sử dụng Ubuntu 12.04.
Bài toán đặt ra của tôi là:
  • Tôi có một applet tự viết muốn chạy trên firefox để test nhưng không được.
  • Ngoài ra tôi còn có nhu cầu hiển thị java console để có thể debug các lỗi trong applet tuy nhiên thử rất nhiều cách với Icedtea cũng đều không được.
Sau một hồi loay hoay thì tôi cũng tạo dựng được môi trường như ý muốn. Bạn có thể làm như sau
  • Mở terminal.
  • Thêm kho cho Ubuntu bằng lệnh:
    sudo add-apt-repository ppa:webupd8team/java
  • Cập nhật lại kho bằng lệnh:
    sudo apt-get update
  • Cài đặt java bằng lệnh:
  • do apt-get install oracle-java7-installer
Sau đó bạn mở Oracle Java 7 Plugin Control Panel lên, enable Java console để sử dụng.
Giờ bạn hãy thử mở một applet lên xem, bạn sẽ thấy màn hình console java quen thuộc của windows hiện lên.




21 tháng 9, 2012

Gửi file theo đường http upload bằng client

Đây là một vấn đề khá thú vị và người viết cũng đã từng đặt ra câu hỏi này từ lâu, đó là: ta có thể dùng một trình duyệt để upload một/nhiều file lên web qua đường http upload (qua các form), vậy có thể mô phỏng chức năng này trên client (không bằng trình duyệt mà là sử dụng các ứng dụng để upload file y như một trình duyệt). Cho tới tận bây giờ người viết mới có cơ hội để thử nghiệm. Câu trả lời là hoàn toàn được.
Tôi sử dụng bộ thư viện HttpComponent và lập trình bằng ngôn ngữ java.
Dưới đây là mã nguồn tôi trích xuất từ bộ unitest của tôi:
public class testUploadFile {
   
    static String url = "http://127.0.0.1:8080/web/convert/document.pdf";
    static String path = "/home/user/NOTICE.txt";
   
    public static void main(String[] args) throws Exception{
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("string_field", new StringBody("field value"));
        FileBody bin = new FileBody(new File(path));
        reqEntity.addPart("attachment_field", bin);

        httpPost.setEntity(reqEntity);
        System.out.println("Sending request " + httpPost.getRequestLine());
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity resEntity = response.getEntity();

        if(resEntity != null){
            String page = EntityUtils.toString(resEntity);
            System.out.println("Page: " + page);
        }
    }
}
Trong đoạn mã trên bạn chú ý cho tôi các dòng được bôi màu xanh.
  • HttpMultipartMode.BROWSER_COMPATIBLE tôi chưa rõ được vì sao phải dùng tham số với giá trị như này thì mới có thể upload file lên được, nếu bạn dùng giá trị MultipartEntity thì có vẻ là không thể chạy được, ít ra là với phiên bản của thư viện tôi đang dùng.
  • FileBody: tôi dùng để lấy nội dung file cần gửi.
  • reqEntity.addPart: tôi dùng để đính nội dung file cần gửi vào request.
  • Ngoài ra với hàm addPart bạn có thể dùng để đính thêm nhiều thông tin nữa vào cho request để gửi lên server, thường là các tham số thêm.
  •  httpClient.execute: được dùng để gửi request lên server.
  • response.getEntity: được dùng để nhận response của server.
Nói chung với cách dùng này, ngoài việc bạn có thể gửi file lên server bạn có thể thực hiện được rất nhiều các chức năng khác nữa, như: gửi SOAP, gửi các request lấy nội dung file,....
Chúc bạn thành công.

Edit: Ngoài ra bạn có thể thêm header vào các request bằng cách thêm vào đoạn mã  sau:
 httpPost.setHeader(tên_tham_số, giá_trị);
Ví dụ:
token = "JSESSIONID=1csup075gbkbm; ZM_TEST=true; ZM_AUTH_TOKEN=0_e83a2b9e2617f747bae138454d4dee946814b924_69643d33363a34636639303538612d656339392d343061662d613234312d3933666539353230373963313b6578703d31333a313335313030373830393138313b747970653d363a7a696d6272613b"; 
httpPost.setHeader("Cookie", token);

18 tháng 9, 2012

Công cụ so sánh file và thư mục trên Linux (Ubuntu)

Trong quá trình làm project, tôi thường xuyên có nhu cầu chia nhánh và nhập các nhánh cho project do đó phát sinh nhu cầu làm thế nào để nhanh chóng tìm ra những thay đổi trong một project. Tôi có thể lấy ví dụ ra những câu hỏi sau đây:
  • Có những file mã nguồn nào trong project bị thay đổi? File nào bị xóa? File nào thêm mới.
  • Nội dung của những file bị thay đổi là gì
  • Các file bị thay đổi nằm ở đâu?
  • ....
Để trả lời cho câu hỏi này tôi chọn Meld một merge tool rất mạnh trên Linux. Bạn có thể download nó tại kho phần mềm của Linux hoặc trực tiếp từ địa chỉ http://meldmerge.org/.
Các chức năng chính của meld:
  • So sánh nội dung của 2 file.
  • So sánh nội dung của 2 thư mục
  • Xem nội dung thay đổi giữa 2 file.
  • Merge các thay đổi giữa file, thư mục,
  • ....
Dưới đây là một số hình ảnh của chương trình:


09 tháng 9, 2012

Chèn biểu tượng Yahoo online/offline vào Blog, Website

Để chèn biểu tượng Yahoo online/offline vào Blog hoặc Website, các bạn làm như sau:
Bạn copy đoạn mã sau vào blog/web (paste vào chỗ muốn hiển thị)

<a href="ymsgr:sendIM?Yahoo!ID"><img border="0" src="http://presence.msg.yahoo.com/online?u=Yahoo!ID&m=g&t=ImageNo&l=us" alt="click here to chat" /></a>

Trong đó:

"Yahoo!ID" là tên nick YM của bạn.

"Click here to chat" là dòng chữ hiện ra khi người khác rê chuột vào biểu tượng YM! của bạn, chỉnh sửa tùy thích.

"ImageNo" là kiểu hiện thị thông báo online hay offline, là 1 trong các kiểu 1,2,3, 6-> 16, như sau:

Kiểu 1, 2, 3



Kiểu 6



Kiểu 7



Kiểu 8



Kiểu 9



Kiểu 10



Kiểu 11



Kiểu 12



Kiểu 13



Kiểu 14



Kiểu 15



Kiểu 16





Nguồn http://thuthuatvietnam.com

31 tháng 8, 2012

Xử lý sự cố không nhận card mạng trên Ubuntu 10.04

1. Card mạng dòng Atheros Ethernet(AR8151)

Hãy chắc chắn máy bạn đang sử dụng dòng card mạng này bằng lệnh:
Lshw  -class network
Trong danh sách hiện ra bạn sẽ thấy có cụm từ Atheros/Atlanstic.
Sau đó hãy vào trong các địa chỉ sau để download driver tương ứng:
ubuntu 10.04 :

http://media.cdn.ubuntu-de.org/forum/attachments/48/33/2666793-AR81Family-linux-v1.0.1.14.tar.gz

ubuntu 10.10

http://media.cdn.ubuntu-de.org/forum/attachments/2666793/AR81Family-linux-v1.0.1.14_10.10.tar.gz

These links are from:

http://forum.ubuntuusers.de/topic/lan-geht-nicht-wlan-schon/#post-2666793
 Sau khi download driver, bạn sẽ được một file nén dạng tar.gz. Bạn giải nén file này ra và chuyển vào thư mục đã giải nén chạy các lệnh sau:
tar -xzvf AR81Family-Linux-v1.0.1.9.tar.gz

sudo su

make install

modprobe atl1e

exit
Xem thêm link: http://comments.gmane.org/gmane.linux.network/200232
Và đây: http://unixblogger.wordpress.com/2011/10/18/the-pain-of-an-realtek-rtl8111rtl8168-ethernet-card/
Liên hệ với người viết bài nếu bạn gặp sự cố khi tải driver, tôi sẽ gửi driver cho bạn qua email. 

08 tháng 6, 2012

Xử lý XML trong PHP.

Để phân tích một nội dung XML ta dùng hàm:
simplexml_load_string($xml_string);
Hàm này sẽ phân tích nội dung XML trong chuỗi thành các Object.
Để truy cập vào các element của XML ta dùng hàm children như sau:
$data->item->children(uri);
Trong đó uri có thể có hoặc không, đó là một namespace trong xml.
Hàm này sẽ phân tích các element trong xml thành các array.
Từ đây ta sẽ dùng foreach để tiếp tục xử lý cho các attribute trong các element.
Có 2 dạng foreach:

  • foreach($d as $v): dùng để lấy các giá trị trong mảng $d
  • foreach($d as $k => $v:): dùng để lấy cả key và giá trị trong mảng $d
Xem ví dụ sau:
Array ( 
 [condition] => Array ( 
  [text] => SimpleXMLElement Object ( [0] => Partly Cloudy )
  [code] => SimpleXMLElement Object ( [0] => 30 )
  [temp] => SimpleXMLElement Object ( [0] => 79 )
  [date] => SimpleXMLElement Object ( [0] => Mon, 07 Jul 2008 9:54 am EDT )
 )

 [forecast] => Array ( 
  [Mon] => Array ( 
   [day] => SimpleXMLElement Object ( [0] => Mon )
   [date] => SimpleXMLElement Object ( [0] => 7 Jul 2008 )
   [low] => SimpleXMLElement Object ( [0] => 69 )
   [high] => SimpleXMLElement Object ( [0] => 87 )
   [text] => SimpleXMLElement Object ( [0] => Isolated Thunderstorms )
   [code] => SimpleXMLElement Object ( [0] => 37 )
  )

  [Tue] => Array ( 
   [day] => SimpleXMLElement Object ( [0] => Tue )
   [date] => SimpleXMLElement Object ( [0] => 8 Jul 2008 )
   [low] => SimpleXMLElement Object ( [0] => 71 )
   [high] => SimpleXMLElement Object ( [0] => 90 )
   [text] => SimpleXMLElement Object ( [0] => Isolated Thunderstorms )
   [code] => SimpleXMLElement Object ( [0] => 37 ) 
  ) 
 ) 
)
Trong ví dụ nếu coi mảng to nhất là $d, ta sẽ có như sau:
foreach($d as $v)
thì $v sẽ là các mảng con bên trong $d.
foreach($d as $k => $v)
thì $k sẽ là 2 string 'condition' hoặc 'forecast'
còn $v sẽ là các mảng có khóa là 'condition' hoặc 'forecast'
như vậy nếu muốn tiếp tục truy cập vào sâu thêm ta sẽ dùng
foreach($v as $v1)
....

24 tháng 5, 2012

Địa chỉ ip 0.0.0.0 nghĩa là gì?

Đôi khi trên linux, nếu bạn chạy lênh route -n bạn sẽ có kết quả này:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.31.18      0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
38.96.196.94    192.168.1.2     255.255.255.255 UGH   0      0        0 wlan0
192.168.84.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
192.168.1.0     0.0.0.0         255.255.255.0   U     2      0        0 wlan0
192.168.110.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlan0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 ppp0
0.0.0.0         192.168.1.2     0.0.0.0         UG    0      0        0 wlan0
Vậy, địa chỉ ip 0.0.0.0 khác gì với các địa chỉ IP khác.
0.0.0.0 là một địa chỉ IP đặc biệt, dùng để chỉ tất các địa chỉ IP mà một máy đang có.
Ví dụ bạn có một server có các địa chỉ IP như sau:
10.2.50.25
10.2.50.26
10.2.50.27
Khi đó nếu bạn khai báo như sau:
0.0.0.0:25
có nghĩa là bạn có thể kết nới tới cổng 25 của server tại bất cứ địa chỉ ip address nào của server (ví dụ 10.2.50.25 và 10.2.50.26 đều được).
Nó khác với nếu bạn chỉ khai báo:
10.2.50.25:25
thì bạn chỉ có thể kết nối tới cổng 25 của server tại địa chỉ ip 10.2.50.25, còn với các địa chỉ còn lại thì bạn không thể kết nối vào cổng 25

15 tháng 5, 2012

Cách sử dụng các tham số recipient_bcc_maps và sender_bcc_maps trong Postfix

1 - Làm thế nào để forward một bản sao của thư gửi tới một địa chỉ sang một địa chỉ khác.
  • Sử dụng tham số: recipient_bcc_maps.
    Tham số này sẽ yêu cầu postfix tự động tạo một bản sao copy bí mật thư gửi tới các địa chỉ hoặc domain chỉ định tới một địa chỉ chỉ định khác.
  • Nội dung: recipient_bcc_maps=hash:/đường/dẫn/tới/file/maps
    Lưu ý, tham số này có thể nhận nhiều giá trị, mỗi giá trị nằm  cách nhau một dấu phẩy và thứ tự ưu tiên truy vấn là từ trái qua phải.
  • Lệnh: postconf -e recipient_bcc_maps="hash:/đường/dẫn/tới/file/maps"
    Lệnh này sẽ edit nội dung của tham số recipient_bcc_maps, lưu ý các nội dung cũ sẽ bị ghi đè.
  • Nội dung file map:
    @domain.com       địa_chỉ_nhận@domain.com
     địa_chỉ_1@domain.com      địa_chỉ_2@domain.com
  • Sau đó cần map nó vào với postfix bằng lệnh:
    postmap /đường/dẫn/tới/file/maps
  • Sau đó khởi động lại postfix bằng lệnh:
    postfix reload.
2 - Làm thế nào để forward một bản sao của thư gửi đi từ một địa chỉ sang một địa chỉ khác
  • Sử dụng tham số: sender_bcc_maps.
    Tham số này sẽ yêu cầu postfix tự động tạo một bản sao copy bí mật thư gửi từ các địa chỉ hoặc domain chỉ định tới một địa chỉ chỉ định khác.
  • Nội dung: sender_bcc_maps=hash:/đường/dẫn/tới/file/maps
    Lưu ý, tham số này có thể nhận nhiều giá trị, mỗi giá trị nằm  cách nhau một dấu phẩy và thứ tự ưu tiên truy vấn là từ trái qua phải.
  • Lệnh: postconf -e sender_bcc_maps="hash:/đường/dẫn/tới/file/maps"
    Lệnh này sẽ edit nội dung của tham số sender_bcc_maps, lưu ý các nội dung cũ sẽ bị ghi đè.
  • Nội dung file map:
    @domain.com       địa_chỉ_nhận@domain.com
    địa_chỉ_1@domain.com      địa_chỉ_2@domain.com
  • Sau đó cần map nó vào với postfix bằng lệnh:
    postmap /đường/dẫn/tới/file/maps
  • Sau đó khởi động lại postfix bằng lệnh:
    postfix reload.

03 tháng 5, 2012

crontab trong Linux

Crontab trong linux tương tự như một tiến trình lập lịch, nó giúp người dùng có thể chỉ định khi nào thì hệ thống sẽ chạy một lệnh, kịch bản,.... đã định sẵn.
Tương ứng với mỗi người dùng sẽ có một crontab riêng.
Crontab sẽ không bị xóa khi hệ thống bị khởi động lại.
Crontab không hoạt động thay thế chức năng startup, và hoàn toàn không giống chức năng startup của hệ điều hành.
Để tạo mới, sửa một crontab, ta dùng lệnh sau:
crontab -e
Cấu trúc nội dung một crontab như sau:
Ví dụ: 0 12 14 2 * ls -l > /var/log/log.log
  • Mỗi lệnh trong crontab được đặt trong một dòng.
  • Comment được bắt đầu bằng ký tự "#"
  • Cấu trúc lệnh trong crontab:
    [min][space][hour][space][dayofmonth][space][monthofyear][space][dayofweek][space][command]
  • Trong đó:
    min: phút, (0-59)
    hour: giờ trong ngày, (0-23)
    dayofmonth: ngày trong tháng, (1-31)
    monthofyear: tháng trong năm, (1-12)
    dayofweek: ngày trong tuần (0-6, tương đương với Sunday-Saturday)
    command: là bất cứ lệnh hệ thống nào, cho phép gọi tới một file có quyền x.
  • Chú ý: crontab cho phép sử dụng các ký tự thay thế.
    Kiểu thay thế: * tương đương với bất cứ giá trị nào.
    Kiểu mỗi: */5 tương đương với cứ mỗi 5 đơn vị thời gian.
    Kiểu liệt kê: 2, 4, 6 cứ vào thời điểm 2, 4, 6 đơn vị thời gian.
    Kiểu khoảng: 9-17 lấy bất cứ giá trị nào nằm trong khoảng  từ 9 đến 17
Lệnh crontab:
crontab [-u user] [option] file
-u user: chỉ ra người dùng mà crontab của họ sẽ được chỉnh sửa.
-l : hiển thị nội dung crontab ra thiết bị hiển thị mặc định, ví dụ màn hình.
-r : xóa crontab.
-e : chỉnh sửa nội dung crontab ở chế độ soạn thảo.
-i : xóa crontab sau khi được người dùng chọn y/Y.
-s : unknow.

25 tháng 4, 2012

Chặn địa chỉ mail không mong muốn bằng Postfix

Có 2 cách để chặn 1 địa chỉ mail không mong muốn trong Postfix.
Cách 1: chặn bằng postfix
  • Tạo một file mà postfix có thể truy cập được:
    ví dụ: vi /etc/postfix/conf/postfix_firewall
  • Nhập nội dung file vừa tạo như sau:
    user@domain.com REJECT
    Trong đó:
    user@domain.com là địa chỉ cần chặn
    REJECT là thao tác thực hiện, ở đây nghĩa là từ chối và gửi thư thông báo cho người gửi (Có thể chọn DISCARD để hệ thống âm thầm loại bỏ thư này đi mà không báo lại cho người gửi)
  • Gõ lệnh:
    postmap hash:postfix_firewall 
  • Chạy lệnh:
    postconf -e smtpd_sender_restrictions="check_sender_access hash:/etc/postfix/conf/postfix_firewall"
  • Khởi động lại postfix bằng lệnh:
    postfix reload.
Xem thêm tại đây để biết cách cấu hình các tham số: http://www.postfix.org/access.5.html
Cách 2: áp dụng cho hệ thống postfix có sử dụng spam assassin
  • Mở file cấu hình của spam assassin:
    vi /etc/mail/spamassassin/local.cf (Đường dẫn này tùy lúc cài spam assassin quản trị đã cài như thế nào)
  • Thêm dòng sau:
    blacklist_from user@domain.com
    Trong đó: user@domain.com là địa chỉ cần chặn
  • Khởi động lại spam assassin:
    /etc/init.d/spamassassin restart
  • Khi đó mọi thư gửi từ địa chỉ user@domain.com sẽ bị hệ thống đưa vào thư rác.

20 tháng 4, 2012

Các tạo virtual IP (VIP) cho các máy chạy Linux

VIP là chức năng cho phép 1 card mạng có thể có nhiều ip.
Với khả năng này, một máy chủ duy nhất có thể triển khai nhiều webserver với nhiều địa chỉ ip khác nhau hoặc dùng vào mục đích cluster,...
Cách 1: sử dụng lệnh ifconfig.
Để tạo VIP, ta dùng lệnh sau:
ifconfig eth0:0 192.168.1.3
Lệnh này sẽ tạo thêm một VIP với tên thiết bị là eth0:0 và địa chỉ IP là 192.168.1.3.
Để kiểm tra lại ta gõ lệnh:
ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:14:6C:83:39:92
inet addr:192.168.1.28 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:33442 errors:0 dropped:0 overruns:0 frame:0
TX packets:38225 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20240563 (19.3 Mb) TX bytes:3483829 (3.3 Mb)
Interrupt:18
Sau khi tạo ra, VIP có thể được sử dụng như một card mạng thông thường.
Để xóa VIP ta dùng lệnh sau:
ifconfig down eth0:0
Cách 2: sử dụng lệnh iproute.
Để tạo VIP ta dùng lệnh sau:
ip addr add 192.168.1.28 dev eth1
với addr, add, dev là từ khóa.
192.168.1.28 là địa chỉ ip cần gán.
eth1: tên thiết bị thực tế sẽ thiết lập cho VIP.
Sau đó chạy lệnh:
ip show addr
để enable VIP đã tạo ra.
Kiểm tra lại bằng lệnh:
ifconfig
3: eth1: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:14:6c:83:39:92 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.28/32 scope global eth1
Để xóa VIP ta dùng lệnh:
ip addr del 192.168.1.28/32 dev eth1
với addr, del và dev là từ khóa
192.168.1.28/32 là địa chỉ ip của VIP (không cần phải dùng /32)
eth1 là tên card đã tạo VIP.
Link tham khảo: How to creating virtal ip address on linux
http://www.tecmint.com/create-multiple-ip-addresses-to-one-single-network-interface/

18 tháng 4, 2012

Các thủ thuật sử dụng trên Firefox (Cập nhật 18/04/2012)

Dưới đây là một số thủ thuật hay và hữu ích đối với người dùng Firefox.
1 - Tự động điền địa chỉ lên thanh địa  chỉ:
Khi đang gõ một địa chỉ trên thanh địa chỉ, bạn có thể:
Nhấn ctrl + enter: để có tên miền .com, ví dụ gõ "google" --> sẽ có "www.google.com"
Nhấn shift + enter: để có tên miền .net
2 - Phím tắt để đóng tab đang mở:
Khi đang xem một tab, nếu muốn đóng tab đó ngay lập tức hãy nhấn ctrl + w

09 tháng 4, 2012

Lập trình hướng đối tượng trong javascript

Một số lưu ý trước khi đọc bài viết:
  • Bài viết không hướng tới mục đích hướng dẫn người lập trình đi từng bước từ cơ bản tới nâng cao trong việc lập trình javascript.
  • Nội dung bài viết chỉ mang tính gợi nhớ, như một note list giúp người lập trình dựa theo đó mỗi khi cần sử dụng kỹ thuật lập trình hướng đối tượng trên javascript.
1 - Hàm khởi tạo đối tượng
function name_object(variables){
 }
2 - Kế thừa trong javascript:
Đặt hàm này phía sau hàm khởi tạo của đối tượng:
name_object.prototype = new parent_object();
name_object.prototype.constructor = name_object
3 - Biến private, biến public:
  • Biến private: là các biến được định nghĩa với từ khóa var ở bên trong hàm khởi tạo của một Object
    var variable;
    Lưu ý: khai báo như thế này cũng có thể coi là một biến private của Object
    function Car(param){
       this.member = param;//param là biến private
    }
    Một biến private chỉ có thể truy cập được từ một hàm private và hàm privileged (không thể truy cập được từ ngoài và cũng không thể truy cập được từ public method của chính Object đó)
  • Biến public: là biến được khai báo với từ khóa this.
    this.variable;
  • Trong một Object, ta dùng từ khóa this khi truy cập một thuộc tính để chỉ ra rằng ta đang muốn truy cập vào thuộc tính của chính Object này.
4 - Hàm private, hàm public:
  • Hàm private: là hàm được khai báo bên trong của hàm khởi tạo của Object, chỉ có thể được gọi thông qua hàm privileged
    var function_name = function(variables){
        function dec(){
       //đây là hàm private
       }

    }
  • Hàm public: là hàm được khai báo với từ khóa prototype

    Classname.prototype.method = function(){}
5. Static properties:
  • Là thuộc tính được khai báo theo mẫu Classname.propertyName = value 
6. Static method
  • Là method được khai báo theo mẫu Classname.methodName = function(){}
  • Có thể sử dụng static method mà không cần khởi tạo đối tượng.
5. Prototype là gì?
6. Một số lưu ý thú vị khi dùng javascript "Object "
  • Khi khởi tạo một đối tượng, nếu không dùng từ khóa new thì trong đối tượng nếu dùng this, this này sẽ là một global object (nếu dùng thì new thì this sẽ chính là đối tượng đó)
  • Thực chất các hàm trong lập trình hướng đối tượng của javascript cũng chỉ là một thuộc tính được gán giá trị là một hàm.
  • Prototype thường được dùng để tạo public method và trong việc kế thừa.
Tham khảo thêm tại:
Muốn nắm nhanh hơn thì bạn vui lòng chuyển qua bài này:
 http://dalmate-tech.blogspot.com/2013/05/lap-trinh-huong-oi-tuong-voi-javascript.html

05 tháng 4, 2012

Một số nguyên tắc bảo mật cơ bản cho máy chủ chạy Linux


  1. Bảo mật tài khoản đăng nhập
  • Không enable tài khoản root của hệ thống. Không cần thiết phải disable các account mặc định của hệ thống bởi vì với các hệ điều hành Linux hiện tại thì hacker không thể lợi dụng các tài khoản này để xâm nhập vào hệ thống nữa.
    Gõ lệnh: sudo passwd root -l trên Ubuntu để lock lại tài khoản root nếu bạn đã "lỡ" mở ra.
  • Hãy tạo ra một account của riêng bạn để đăng nhập vào hệ thống theo nguyên tắc sau:
    Tên account: là một tên ngẫu nhiên, không nên là tên bạn hoặc những gì thân quen với bạn(viết tắt, viết biến tấu, người yêu, thằng ngồi bên trái, ..), ví dụ nên đặt một cái tên đăng nhập là: omaynaythatlabaomat --> nguyên tắc đặt tên này sẽ giúp kẻ tấn công không thể dò ra được account login là gì (đa phần các vụ brute force sẽ dò theo một danh sách những account có sẵn, mà account như này thì chắc chắn không có trong danh sách của kẻ tấn công rồi)
    Mật khẩu: hãy cố gắng đặt càng dài càng tốt, có kết hợp các biến tấu theo quy tắc chỉ bạn nghĩ ra. Ví dụ đơn giản thế này: matkhaunaythatladaivaphuctap -->MaTkHaUnAyThAtLaDaIvAPhUcTaP (biến lần 1 theo nguyên tắc 1 hoa 1 thường) -->M@TkH@uN@yTh@tL@D@!v@PhUcT@p (biến lần 2 bằng cách thay a = @) --> MaTkH2uN@yTh2tL@Da!v2PhucT2p (biến lần 3, trộn lẫn giữa số ,chữ và ký tự !) --> Điều này đảm bảo làm khó ngay cả cho những kẻ tấn công kiên trì nhất cũng phải nản lòng (tôi đảm bảo kể cả kẻ tấn công có đứng nhìn bạn gõ mật khẩu hắn cũng không thể nhớ được là bạn đã gõ những gì)
     2. Ngăn không cho người dùng đăng nhập hệ thống.
  • Xóa public key trong file ~/.ssh/authorized_key
  • Xóa không cho người dùng dùng password sudo: passwd -d username (Xóa password của user) hoăc passwd -l username (Lock password của user)
  • Dùng visudo: xóa tất cả các user có quyền NOPASSWD

Một số thủ thuật hay trên Linux (Cập nhật ngày 25/03/2019)

Bài viết này tôi muốn mang tới cho các bạn một số thủ thuật thú vị khi làm việc trên môi trường Linux. Thiết nghĩ, nội dung bài này sẽ có ích nhiều cho các bạn đang và có mong muốn bước chân vào thế giới lập trình shell, perl trên các hệ thống Linux nhiều hơn. Cụ thể hơn, nội dung sẽ được trình bày theo dạng Hỏi - Đáp để  thuận tiện cho các bạn tra cứu sau này.
1 - Làm thế nào để liệt kê các thư viện đã được cài trong máy?
Bạn chạy lệnh này để liệt kê các thư viện đã được cài:
/sbin/ldconfig -p
2 - Làm thế nào để xác định có những chương trình nào đã cài trên máy chạy linux?
Tùy theo hệ điều hành, bạn có thể dùng các lệnh sau:
Với các dòng RPM based:
rpm -qa
Với các dòng Debian hoặc Ubuntu
dpkg --list
Với các dòng OpenBSD
pkg_info  
3 - Làm thể nào để liệt kê có các cổng nào đang mở và các chương trình nào đang chiếm giữ cổng đó?
Chạy với quyền root lệnh sau:
netstat -tulpn 
Hoặc:
nmap -sT -O localhost 
4 - Tôi muốn biết thông tin về một hostname hoặc một địa chỉ ip?
Để biết thông tin về hostname hãy gõ:
whois hostname
Để biết thông tin về địa chỉ ip hãy gõ:
dig -x ip 
5 - Tôi muốn biết thông tin về phần cứng của máy, tôi phải làm thế nào?
Để biết thông tin về CPU hãy gõ:
cat /proc/cpuinfo
Để biết thông tin về bộ nhớ hãy gõ:
free -m
Để biết thông tin về ổ cứng hãy gõ:
sudo fdisk -l
Để biết thông tin về dung lượng đã dùng của ổ cứng hãy gõ:
df -h
Để biết thông tin về các card PCI hãy gõ:
lspci
Để biết thông tin về dung lượng các tập tin sử dụng hãy gõ:
du
Để biết thông tin về các công việc đang chạy hãy gõ:
 lsdev
Để biết thông tin về các ổ USB hãy gõ:
lsusb
Để biết thông tin phần cứng RAM, hãy gõ:
sudo dmidecode --type 17
6 - Tìm kiếm file có chứa một xâu chỉ định
Để tìm kiếm file có chứa một xâu chỉ đinh, bạn gõ:
grep -r "string" /path
7 - Tìm kiếm các file có dung lượng lớn:
Để tìm kiếm các file có dung lượng lớn trên hệ thống, ta có thể dùng lệnh sau:
find /đường_dẫn -size +dung_lượng_tối_thiểu -size -dung_lượng_tối_đa
8 - Tôi muốn xem dịch vụ nào đang chiếm port nào trong hệ thống:
Bạn sử dụng lênh:
lsof -Pnl +M -i4 : dành cho các địa chỉ IPv4.
lsof -Pnl +M  -i6: dành cho các địa chỉ IPv6
9 - Tôi gõ lệnh cat /đường_dẫn/file | grep "text" thì bị lỗi "Binary file (standard input) matches"
Bạn thử lại với lệnh: cat /đường_dẫn/file | grep "text" --text
10 - Tôi muốn chạy lệnh netstat ở chế độ thời gian thực, tôi phải làm như nào?
Trong linux có lệnh watch để chạy một lệnh nào đó lặp lại trong một khoảng thời gian nào đó. Bạn có thể tận dụng lệnh này để làm việc này. Mẫu lệnh có dạng:

watch -n 30 "netstat -ntu | awk '{print \$5}' | cut -d: -f1 | sort | uniq -c | sort -n"
 
Bạn gõ lệnh man hoặc help để biết thêm chi tiết cách sử dụng của lệnh watch 
11 - Tôi muốn tìm kiếm thông tin một process thông qua process Id:
Bạn chạy lệnh sau:
ps -p PID
12 - Tôi muốn xem trong hệ thống đang có những user nào
Để xem danh sách các user đang có trong hệ thống, bạn chạy lệnh sau:
cat /etc/passwd

02 tháng 4, 2012

Làm thế nào để độ cao của bảng đạt 100% kích thước cửa sổ

Đây là một vấn đề gặp khá phổ biến đối với người làm HTML. Độ cao của bảng không mở rộng 100% như mong muốn ngay cả khi ta đã thiết lập style của bảng như sau:
Thực tế với đoạn code trên khi xem trên trình duyệt, bảng khong hề phủ đầy 100% kích thước của màn hình trình duyệt như mong muốn.
Vậy tại sao vấn đề này xảy ra:
  • Khi thiết lập height của table là 100%, thì table sẽ phủ đầy 100% diện tích có thể về chiều cao của đối tượng chứa nó. Nếuđói trượng chứa nó không chiếm 100% kích thước trình duyệt thì table cũng không thể làm thế.
Như vậy để giải quyết vấn đề này ta cần làm như sau:
  • Thiết lập cho đối tượng chứa table phải chiếm 100% diện tích trình duyệt.
Vậy thực tế nếu muốn table có chiều cao bằng chiều cao toàn bộ trình duyệt ta phải làm như sau:

.....

....

html, body {
      height: 100%;
}

28 tháng 3, 2012

Sử dụng ổ đĩa SAN trên Linux với Open-iscsi

Đón xem:
Một bài viết về cách kết nối với ổ SAN trên Linux bằng Open-Iscsi

26 tháng 3, 2012

Những lệnh Linux người quản trị cần biết (update 10-08-2021)

Phần này mình chỉ đề cập đến những câu lệnh cần thiết mà một người quản trị hệ thống Linux cần biết và nắm rõ. Nội dung diễn giải cho các lệnh được viết theo ý hiểu của tác giả thế nên các bạn không nên thắc mắc tại sao nó lại thế nhé. Các lệnh sẽ được sắp xếp theo thứ tự abc và sẽ được update dần theo thời gian.
A
1. Adduser command
  • Chức năng: Thêm user vào quyền sudo
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: adduser user_name sudo
B
C
1 - Chage command
  • Chức năng: Xem thông tin user trong hệ thống.
  • Hệ điều hành: Linux, *nix.
  • Có sẵn: Có.
  •  Cấu trúc lệnh: 
    • chage -l user
    • chage -E yyyy-mm-dd user: Thay đổi thông tin hết hạn của user.
D
1 - Dig command
  • Chức năng: truy vấn các bản ghi trên DNS
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có
  • Cấu trúc lệnh: dig [option] domain.com
    Trong đó:
    dig: tên lệnh
    domain.com: tên miền cần truy vấn
    Option: tùy chọn
  • Option bao gồm:
    mx: truy vấn bản ghi MX
    a: truy vấn bản ghi A
2 - dpkg-reconfigure:

  • Chức năng: cấu hình lại tham số một số biến môi trường.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có
  • Cấu trúc lệnh: dpkg-reconfigure tên_tham_số
    Trong đó:
    dpkg-reconfigure: tên lệnh
    Tên tham số: có thể là tzdata(nếu muốn đổi timezone của máy), java (nếu muốn đổi các thông số liên quan tới java),....
 3 - date
  • Chức năng: xem thông tin thời gian trên hệ thống + chỉnh lại thông tin thời gian trên hệ thống
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có
  • Cấu trúc lệnh: date tham_số
    Trong đó:
    date: tên lệnh
    Tham số: 04 (Month) 12 (Day) 1600 (Time in 24hour) 2011 (Year). Ví dụ: 041216002011 sẽ đổi giờ hệ thống thành ngày 12 tháng 4 năm 2011 lúc 16h00 
4 - dpkg -l
  •  Chức năng: xem thông tin các gói đã cài đặt trong hệ thống.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có.
5 - df:
  • Chức năng: Xem thông tin về dung lượng ổ đĩa trong hệ thống.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có.
E
F
1 - fg command
  • Chức năng: đưa một tiến trình đang chạy từ chế độ background sang foreground
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: fg [process number]
    Trong đó:
    fg: tên lệnh.
    process number: số thứ tự của background process, xem thông qua lệnh jobs.
2 - fping command:
  • Chức năng: một kiểu ping nâng cao
  • Hệ điều hành: Linux, *nix.
  • Có sẵn: không, phải cài thêm.
  • Cấu trúc lệnh: fping domain.com
    Trong đó:
    fping: tên lệnh
    domain.com: địa chỉ remote server
3 - find command:
  • Chức năng: tìm kiếm một tập tin, thư mục chỉ định trong hệ thống.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có.
  • Cấu trúc lệnh: find [path...] [expression]
    Trong đó:
    find : tên lệnh.
    path: đường dẫn cần thực hiện tìm kiếm.
    expression: yêu cầu tìm kiếm
  • Vui lòng xem thêm với lệnh find --help
  • Ví dụ: find /opt/ -name "test*" sẽ tìm kiếm trong thư mục opt tất cả các file có tên bắt đầu là test.
G
1 - Gzip command:
  • Chức năng: nén và giải nén cho định dạng gz.
  • Hệ điều hành: Linux
  • Có sẵn: có
  • Cấu trúc lệnh: gzip [option] filesource [filedestination]
    Trong đó:
    gzip: tên lệnh.
    option: các tùy chọn.
    filesource: file gốc
    filedestination: file đích.
  • option:
    d: giải nén
H
1 - Hostname command
  •  Chức năng: xem hostname của máy
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: hostname [option]
    Trong đó:
    hostname: tên lệnh
    option: các tùy chọn
2 - Hwinfo command:
  •  Chức năng: xem thông tin phần cứng của máy.
  • Hệ điều hành: Linux
  • Có sẵn: không.
  • Câu trúc lệnh: hwinfo [option]
I
1 - ifconfig command
  • Chức năng: xem thông tin card mạng của máy.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: ifconfig [option] tên_card_mạng
    Trong đó:
    ifconfig: tên lệnh
    option: tùy chọn
    tên_card_mạng: có thể là eth0, eth1, wlan0,..
J
K
1 - ssh-keygen
  • Chức năng: unknow
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh:
  • Ví dụ: keygen-shh -r : loại bỏ key của một host đã lưu trong hệ thống.
L
1 - lastlog comman
  • Chức năng: liệt kê danh sách các tài khoản đã từng đăng nhập vào hệ thống
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lênh: laslog.
2 - ls command
  • Chức năng: xem thông tin của tập tin, thư mục trong hệ điều hành.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có.
  • Cấu trúc lệnh:
    ls [options]
  • Options:
    -i : xem thông tin inode
    -l : xem dạng thông tin file dài
3 - ldd command:
  • Chức năng: xem các thư viện được sử dụng cho một ứng dụng trên Linux
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có.
  • Cấu trúc lệnh: ldd [OPTION]... FILE...
  • Options:
4. last

  • Chức năng: Xem người dùng truy cập gần nhất trên hệ thống.
  • Hệ điều hành: Linux, *nix.
  • Có sẵn: có.
  • Cấu trúc lệnh: last.

M
N
1 - nmap command:
  • Chức năng: Hiện tại mình hay dùng lệnh này để xem một remote server đang mở những cổng gì (ngoài ra còn khá nhiều các chức năng khác nhưng mình ít dùng nên không nêu ra ở đây)
  • Hệ điều hành: Linux, *nix
  • Có sẵn: không, phải cài thêm.
  • Cấu trúc lệnh: nmap [option] domain.com
    Trong đó:
    nmap: tên lệnh
    option: các tùy chọn
    domain.com: địa chỉ của remote server.
  • Option bao gồm:
    -p: chỉ quét các cổng chỉ định, ví dụ: nmap -p143 10.2.10.123 --> chỉ quét cổng 143 máy có địa chỉ 10.2.10.123
2 - nload command:
  • Chức năng: xem lưu lượng vào ra trên một card mạng
  • Hệ điều hành: Linux, *nix
  • Có sẵn: không, phải cài thêm
  • Cấu trúc lệnh: nload [option] card_name
    Trong đó:
    nload: tên lệnh
    [option]: các tùy chọn
    card_name: tên card, ví dụ eth0, eth1, wlan0,...
  • option:
    K: xem lưu lượng ở dạng kilobyte
    M: xem lưu lượng ở dạng MB
    G: xem lưu lượng ở dạng GB
    H: auto
    u: thiết lập kiểu đơn vị vào ra cho từng thành phần
    U: thiết lập kiểu đơn vị vào ra cho phần tính tổng lưu lượng
3 - nmblookup command
  • Chức năng: xem thông tin của một máy từ xa.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: nmblookup [option] địa_chỉ_máy
    Trong đó:
    nmblookup: tên lệnh.
    option: các tùy chọn
    địa_chỉ_máy: địa chỉ máy cần xem
  • Option: bao gồm
    a : xem tất cả mọi thông tin
4 - nohup:
  • Chức năng: giữ cho một tiến trình chạy ngay cả khi terminal bị tắt.
  • Hệ điều hành: Linux
  • Có sẵn: có
  • Cấu trúc lệnh: nohup lệnh [tùy chọn] &
    Trong đó:
    nohup: tên lệnh
    lệnh: lệnh cần giữ.
    tùy chọn: các tùy chọn của lệnh cần giữ.
    &: đẩy lệnh cần giữ xuống chạy nền.
  •  Sau khi chạy, gõ ctrl + D để thoát khỏi màn hình ssh.
  • Ví dụ: để chạy lệnh nohup ta làm như sau:
  • nohup command &   # create nohup.out
    nohup command >/dev/null 2>&1 &   # doesn't create nohup.out 
     
O
P
1 - perldoc command
  • Chức năng: xem thông tin trợ giúp về các hàm, lớp trong ngôn ngữ Perl.
  • Hệ điều hành: Linux,*nix.
  • Có sẵn: không rõ.
  • Cấu trúc lệnh: perl Tên_hàm_lớp_cần_truy_vấn.
  • Ví dụ: perldoc File::Copy
2 - pidoff command
  • Chức năng: xem id của một tiến trình.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có
  • Cấu trúc lệnh: pidof tên_chương_trình
3 - passwd
  • Chức năng: đổi mật khẩu của user.
  • Hệ điều hành: Linux, *nix.
  • Có sẵn: Có.
  • Cấu trúc lệnh: passwd
  • Trong đó option là:
    • l: loại bỏ password của người dùng.
Q
R
S
1 - ssh command
  • Chức năng: tạo một kết nối SSH tới một remote server
  • Hệ điều hành: Linux
  • Có sẵn: có
  • Cấu trúc câu lệnh:
    ssh user@domain.com
    Trong đó:
    ssh: tên lệnh
    user: tên user cần kết nối trên remote server
    domain.com: địa chỉ ip hoặc domain của remote server
2 - stat command:
  • Chức năng: xem thông tin thống kê của một tập tin.
  • Hệ điều hành: Linux
  • Có sẵn: Có.
  • Cấu trúc câu lệnh:
    stat /đường/dẫn/tới/file.
3 - scp command:
  • Chức năng: Copy tập tin giữa hai máy tính
  • Hệ điều hành: Linux, Unix
  • Có sẵn: Có.
  • Cấu trúc câu lệnh:
    scp [option]  [[user@]host1:]file1 ... [[user@]host2:]file2
  • Trong đó:option là các tùy chọn
    • -P: Port sử dụng
T
1 - Top command
  • Chức năng: xem thông tin tiến trình và các tài nguyên hệ thống.
  • Hệ điều hành: Linux, *nix.
  • Có sẵn: có
  • Cấu trúc lệnh: top
2 - Tail command:
  • Chức năng: xem nội dung một file.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có
  • Cấu trúc lệnh: tail [option] path
    Trong đó:
    tail: tên lệnh
    option: các tùy chọn
    path: đường dẫn tới file cần xem.
  • Option bao gồm:
    f: xem nội dung file theo thời gian thực
    chữ số: xem số dòng cuối cùng của file đúng bằng số đã nhập vào.
3 - Traceroute command
  • Chức năng: rà tuyến đường của gói tin tới một địa chỉ đích
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có.
  • Cấu trúc lệnh: traceroute [option] địa_chỉ_đích
    Trong đó:
    traceroute: tên lệnh
    địa_chỉ_đích: địa chỉ máy đích cần tìm đường
    option: các tùy chọn của lệnh
4 - Tar command
  •  Chức năng: nén và giải nén tập tin, thư mục trong linux.
  • Hệ điều hành: Linux, *nix
  • Có sẵn: có.
  • Cấu trúc lệnh: tar [options] tên_file_nén tên_file_hoặc_thư_mục_cần_nén
    Trong đó:
    tar: tên lệnh
    options: các tùy chọn
  • ví dụ để nén một thư mục ta gõ lệnh tar -zcvf file.tar.gz /home/user/data
  • Để nén một thư mục ta dùng lệnh sau: tar -zcvf prog-1-jan-2005.tgz /home/jerry/prog
U
1 - uname command
  • Chức năng: xem thông tin  tổng quan về hệ điều hành
  • Hệ điều hành: dòng debian
  • Có sẵn: có
  • Cấu trúc lệnh: uname [option]
    Trong đó:
    uname: tên lệnh
    option là các tham số đầu vào.
  • Option có thể là:
    a : xem tất cả
2. Useradd command
  • Chức năng: tạo tài khoản mới cho hệ thống
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Có.
  • Cấu trúc lệnh:  useradd [option] user_name
    Trong đó:
    user_name: là tên tài khoản cần thêm
    option là các tùy chọn
  • Ví dụ:
    useradd -e {yyyy-mm-dd} {username} - Thêm user và ngày user này sẽ bị hết hạn - useradd -e 2008-12-31 jerryuseradd -f {days} {username} - Thêm user và ngày hết hạn mật khẩu - useradd -e 2009-12-31 -f 30 jerry

V
W
1 - Whois command
  • Chức năng: tra cứu thông tin của một tên miền (thực ra theo đúng định nghĩa thì là tra cứu thông tin một đối tượng trong cơ sở dữ liệu RFC 3291)
  • Hệ điều hành: Linux, *nix
  • Có sẵn: Không
  • Cấu trúc lệnh: whois [option] tên_miền
    Trong đó:
    whois: tên lệnh
    option: các tùy chọn
    tên_miền: tên miền cần tra cứu
X
Y
Z

14 tháng 3, 2012

Cách tạo ổ mã hóa bằng TrueCrypt trên Linux

Trước khi sử dụng Truecrypt trên Linux, bạn nên cập nhật kernel mới nhất cho hệ thống để đảm bảo TrueCrypt chạy tốt nhât.
TrueCrypt: là một chường trình cho phép người dùng mã hóa dữ liệu trên một phân vùng, ổ đĩa hoặc file. Các thuật toán mã hóa của TrueCrypt có thể coi là tốt nhất hiện nay, rất khó để phá vỡ khi dữ liệu bị đánh cắp nếu không có mật khẩu giải mã.
Địa chỉ download: Download
TrueCrypt hỗ trợ cả trên Windows và Linux, cả giao diện đồ họa và giao diện dòng lệnh.
Bài viết này chỉ hướng tới người sử dụng TrueCrypt trên giao diện dòng lệnh. Các bước tạo như sau:

làm lần lượt từng bước khi có dấu nhắc
  • Gõ lệnh truecrypt -c
  • Chọn kiểu volume là: normal hoặc hidden
  • Gõ đường dẫn tới file hoặc ổ cần truecrypt: ví dụ /home/taikhoan/film.avi (tên thì đặt là gì cũng được, ở đây đặt là film.avi để đánh lừa hacker không nghĩ đó là file dữ liệu)
  • Chọn định dạng dữ liệu:FAT, ext3,....
  • Chọn kích thước ổ truecrypt: ví dụ 100G = 100GB, tuỳ có thể chọn là M hoặc K.
  • Chọn thuật toán băm: tuỳ nhu cầu dùng
  • Chọn thuật toán mã hoá: tuỳ nhu cầu
  • Nhập mật khẩu cho ổ
  • Đợi tới khi truecrypt yêu cầu nhập 320 ký tự ngẫu nhiên
  • Tạo xong ổ.

08 tháng 3, 2012

Những vấn đề trong việc sử dụng Signed Applet

Bài này được tôi đúc rút kinh nghiệm từ thực tế khi xây dựng một applet sử dụng chữ ký số ký và mã hóa lên thư điện tử.
Dưới đây là các khó khăn tôi vấp phải và cách khắc phục:
1. Applet chỉ chạy với AppletViewer mà khi lên trình duyệt thì không chạy
  • Lý do: do applet sử dụng trong mục đích này có nhiều thao tác liên quan tới vấn đề bảo mật với máy ảo java nên đòi hỏi phải được ký mới có thể chạy được.
  • Cách khắc phục: tất nhiên là bạn phải ký cho applet này rồi. Bạn có thể sử dụng rất nhiều công cụ để ký, ở đây tôi sử dụng netbean bởi vì netbean hỗ trợ người dùng tự động ký cho applet (thời hạn là 6 tháng) đồng thời kí luôn lên tất cả các lib đi kèm với applet. Để yêu cầu netbean ký cho applet bạn làm như sau: Chọn Properties của project --> Web Start --> Chọn Customize trong phần Signing --> và chọn self-sign by generated key hoặc signed by a specify key
2. Xuất hiện các lỗi ClassNotFound khi chạy trên trình duyệt mặc dù bạn đã thêm đầy đủ các thư viện và applet đã chạy với AppletViewer

  • Lý do:
    Thứ nhất: applet được ký chỉ hoạt động với các thư viện đã được ký cùng với applet đó --> với các thư viện không được ký cùng applet thì nó sẽ không nhận ra.
    Thứ hai: Các thư viện đi kèm applet có sử dụng các class từ các thư viện khác --> tức là nó đang sử dụng các thư viện không được ký hoặc được ký nhưng lại không cùng chữ ký mà nó đang sử dụng (Cái này hơi phức tạp tí nhưng đại loại là thế)
    Do vậy có thể nói tóm lại là không phải do applet của bạn không nhận ra Class kia mà là thư viện bạn sử dụng không nhận ra class đó.
  • Khắc phục: Cái này hên xui, nếu bạn tìm được source code của cái thư viện chứa class bị thiếu hoặc của thư viện dùng class bị thiếu thì vui lòng bỏ công sức ra thêm nó vào applet của bạn thay vì thêm thư viện đã đóng gói.
3. Làm thế nào để xem stacktrace trong applet

  • Lý do: nếu bạn viết applet, bạn gần như không được cung cấp đầy đủ các công cụ debug (nếu bạn không biết cách mở nó ra)
  • Khắc phục: để có thể dễ dàng debug bạn hãy làm như sau: vào control panel --> java --> chọn tab advance và tick chọn tất cả các mục của phần debug rồi chọn show console trong phần java console
4. Tôi bị lỗi khi deploy một serverlet có sử dụng các thư viện java đã được ký.
  • Thường lỗi phổ biến nhất là bạn sẽ nhận được thông báo: "Invalid signature file digest for Manifest main attributes".
  • Nguyên nhân: do trong các file jar có chứa các file chữ kí, chính các file này gây ra; các file đó thường có đuôi là SF, DSA hoặc RSA.
  • Cách giải quyết: bạn hãy dùng một chương trình hỗ trợ nén và giải nén để xóa các file này đi.

06 tháng 3, 2012

RAID và các kỹ thuật RAID trên Ubuntu

Bài viết này được thực hiện từ thực tế khi đi triển khai người viết đã gặp phải.
RAID là viết tắt của Redundant Array of Independent Disk: tâp hợp các ổ đĩa có khả năng chịu lỗi. Các hệ thống sử dụng RAID cho phép người quản trị có thể nhanh chóng xác định ổ đĩa bị lỗi và thay nóng (hot plug) ngay ổ đĩa bị hỏng mà không gây ảnh hưởng tới các dữ liệu trên máy.
RAID thường được áp dụng trên các máy chủ (cả Windows và Linux) nhằm tăng độ an toàn cho dữ liệu của máy chủ.
Có rất nhiều loại RAID: RAID 0, RAID 1, RAID 5, RAID 10, RAID 0 + 1,…. (ở đây ta sẽ không đi sâu vào kỹ thuật áp dụng trên từng loại RAID)
Hiện tại trên thị trường có 3 loại hình RAID: Hardware RAID, Software RAID và fake RAID.
Hardware RAID: là kỹ thuật RAID mà việc điều khiển đọc ghi lên các ổ đĩa sẽ do một nhóm các phần cứng đặc biệt điều khiển. Loại RAID này hoạt động hoàn toàn trong suốt với hệ điều hành, không cần phải có driver, và không phụ thuộc là bạn đang dùng hệ điều hành gì.
Software RAID: là kỹ thuật RAID mà việc điều khiển đọc ghi lên các ổ đĩa sẽ do kernel của hệ điều hành điều khiển. Loại RAID này có ưu điểm là không cần phải có một phần cứng hỗ trợ RAID do đó sẽ giảm giá thành đầu tư cho máy chủ. Phải cài software RAID ngay khi cài hệ điều hành.
Fake RAID: là một kỹ thuật RAID lai giữa 2 kỹ thuật kể trên, sử dụng phần cứng để điều khiển việc đọc ghi lên ổ cứng nhưng không sử dụng các phần cứng chuyên biệt mà thực sự lại do một phần mềm nhỏ (gọi là BIOS trên card RAID) để điều khiển đọc ghi. Loại RAID này có ưu điểm là giá thành rẻ hơn Hardware RAID tuy nhiên khi hoạt động lại yêu cầu hệ điều hành phải load được driver điều khiển RAID lên dẫn tới việc đòi hỏi hoặc hệ điều hanh phải tích hợp sẵn driver của card hoặc phải yêu cầu hệ điều hành preload các driver lên trước khi đi vào quá trình boot. Nếu  hệ điều hành không hỗ trợ loại BIOS trên thiết bị RAID, dù có cấu hình như thế nào thì khi vào hệ điều hành, ta vẫn chỉ nhìn thấy các ổ đĩa riêng lẻ thay vì hệ thống ổ RAID như mong muốn.
Theo khảo sát trên mạng thì ta có thể so sánh các kỹ thuật RAID như sau (số liệu chỉ tính trên các máy chủ chạy kernel Linux):
Tốc độ đọc/ghi: Hardware RAID à Fake RAID à Software RAID
Khả năng bảo đảm an toàn dữ liệu: Hardware RAID à Software RAID à Fake RAID

Cơ chế quản lý startup trên Linux.

Cái này nếu ai dùng windows nhiều thì sẽ biết rất rõ. Nhưng với linux thì liệu có cơ chế này không, nếu có thì phải sử dụng như thế nào. Bài viết này sẽ giới thiệu cho mọi người sơ lược về cơ chế startup và cách sử dụng nó trên Linux như thế nào.
Trên Linux, Debian và các dòng dựa trên Unix về cơ bản sẽ có 6 cấp hoạt động (gọi là runlevel), có thể số lượng thay đổi tùy theo các bản phân phối. Chúng bao gồm:
·         Runlevel 0: rc0.d – Tương ứng với trạng thái Halts của máy
·         Runlevel 1: rc1.d – Tương ứng với trạng thái máy khởi động cho người quản trị.
·         Runlevel 2: rc2.d – Tương ứng với trạng thái máy khởi động không có các dịch vụ mạng (tương tự safemode trên windows)
·         Runlevel 3: rc3.d – Tương ứng với trạng thái máy khởi động bình thường
·         Runlevel 4: rc4.d – Đây là trạng thái chưa sử dụng.
·         Runlevel 5: rc5.d – Tương ứng với trạng thái máy khởi động với trình điều khiển đồ họa như gdm hay x-system.
·         Runlevel 6: rc6.d – Tương ứng với trạng thái reboot. (Khi máy reboot thì sẽ gọi các script trong thư mục này trước)
Ngoài ra còn có 2 runlevel là:
·         Rc.local: được gọi trước khi gọi các rcx.d (x là runlevel tương ứng)
·         rcS.d: được gọi sau khi máy chạy hết các script trong rcx.d (x là runlevel tương ứng).
Nội dung trong mỗi rcx.d bao gồm:
·         Các file có tên theo cấu trúc sau: SscriptNN (S: là từ khóa, NN: là số thứ tự, script: là tên script) là file khởi động dịch vụ và thứ tự khởi động là NN.
·         Các file có tên theo cấu trúc sau: KscriptNN (K: là từ khóa, NN: là số thứ tự, script: là tên script) là file tắt dịch vụ và thứ tự tắt là NN.
·         Các file có NN càng nhỏ thì thứ tự khởi động càng sớm, tức là 1 sẽ phải được gọi trước 2.
Để kiểm tra trạng thái máy chủ đang chạy ở runlevel nào có thể sử dụng lệnh: runlevel
Ví dụ ta thu được đầu ra là 2, tức là máy khi khởi động sẽ gọi các script chứa trong thư mục rc2.d
Các script trong rcx.d đều là các liên kết tới các script nằm trong thư mục /etc/init.d (có thể xem bằng lệnh ls –l /etc/rc*)
Vậy ta có thể sử dụng cơ chế startup trên linux như thế nào:
·         Để sử dụng ta phải sử dụng lệnh “update-rc.d
·         Update-rc.d tìm các script trong thư mục /etc/init.d/
·         Cấu trúc lệnh update-rc.d như sau:
o   Để loại bỏ một script ta dùng lệnh:
update-rc.d –f script_name remove.
o   Để tạo một script khởi động ta dùng lệnh
update-rc.d script_name start 48 1 3 6 . stop 36 0 2 5.
Trong đó:
script_name: tên script đặt trong thư mục /etc/init.d/ và có quyền excute (quyền “x”)
48: thứ tự Start
1, 3, 6: runlevel
dấu “.” Là bắt buộc, có 2 dấu “.” Trong đoạn script
36: thứ tự stop
0, 2, 5: runlevel

04 tháng 3, 2012

Có thể sử dụng BCC cho danh sách gửi mail được không?

Chúng ta thường hay nhận được câu hỏi này do rất nhiều người nghĩ rằng đây là cách rẻ nhất để vận hành một mailing list.
Nhưng thực tế là, BCC không phải được tạo ra cho mục đích này - nó được tạo ra để có thể gửi mail cho người nhận mà không muốn những người nhận khác trong danh sách có thể nhìn thấy địa chỉ đó.
Tuy nhiên, các spammer thường lợi dụng BCC để "hợp thức hóa" hành động spam của mình.
Dưới đây là các lý do mà ta không nên dùng BCC trong trường hợp này:
  • Số lượng địa chỉ trong BCC thường bị giới hạn, thường là 50 (tùy từng hệ thống, có thể có hệ thống còn ít hơn), vì thế nếu gửi cho một mailing list lớn người gửi thường phải chia thành các lần gửi nhỏ.
  • Các hệ thống chặn spam của máy chủ mail sẽ cho rằng thư bạn gửi đi là một thư spam do số lượng thư bạn gửi đi từ cùng một account trong một đơn vị thời gian quá lớn.
Nếu mail của bạn được chuyển tiếp thông qua một máy chủ mail của ISP, các máy chủ này cũng sẽ kiểm tra thư của bạn, và:
  • Nếu địa chỉ nhận không năm trong trường TO của thư thì thư của bạn sẽ bị đánh dấu là spam. Ngoài ra nếu như địa chỉ trong trường TO của thư tương tự như địa chỉ trong trường FROM thì thư của bạn cũng sẽ bị nghi ngờ là spam.
  • Nếu bạn soạn thư với định dạng HTML bằng cách sử dụng các chương trình xử lý văn bản, chúng sẽ tạo ra rất nhiều các thẻ không cần thiết có thể khiến thư của bạn bị nhận/nghi ngờ là thư spam.
  • Đặc biệt với những thư có các trường như header, subject,... sử dụng các ký tự hoặc mã lạ cũng sẽ bị nghi ngờ là spam (Hãy cố gắng sử dụng các tool hoặc soạn một mail có nội dung tuân theo đúng quy định)
Còn có rất nhiều lý do khác nữa mà thư của bạn có thể bị nhận là spam, bạn có thể tham khảo thêm tại địa chỉ SpamAssassin site.
==> Như vậy tóm lại: bạn không nên sử dụng BCC cho việc gửi thư tới mailing list.
Dưới đây là một số cách thay thế:
  • Sử dụng các hệ thống như Mailman
  • Cài đặt một số chương trình như phpList
  • ...
Các hệ thống này sẽ giúp bạn quản lý việc gửi thư tới mailing list bằng cách như: tự động chia nhỏ các địa chỉ nhận để gửi, phân chia thời gian để gửi,....